Выполнить bash-скрипт из URL - PullRequest
154 голосов
/ 20 апреля 2011

Скажем, у меня есть файл по URL "http://mywebsite.com/myscript.txt", который содержит скрипт:

#!/bin/bash
echo "Hello, world!"
read -p "What is your name? " name
echo "Hello, ${name}!"

И я хотел бы запустить этот сценарий без предварительного сохранения его в файл. Как мне это сделать?

Теперь я видел синтаксис:

bash < <(curl -s http://mywebsite.com/myscript.txt)

Но, похоже, это работает не так, как если бы я сохранил файл и затем выполнил. Например, readline не работает, и вывод просто:

$ bash < <(curl -s http://mywebsite.com/myscript.txt)
Hello, world!

Точно так же я пробовал:

curl -s http://mywebsite.com/myscript.txt | bash -s --

С такими же результатами.

Изначально у меня было решение вроде:

timestamp=`date +%Y%m%d%H%M%S`
curl -s http://mywebsite.com/myscript.txt -o /tmp/.myscript.${timestamp}.tmp
bash /tmp/.myscript.${timestamp}.tmp
rm -f /tmp/.myscript.${timestamp}.tmp

Но это кажется небрежным, и я бы хотел более элегантное решение.

Я знаю о проблемах безопасности, связанных с запуском сценария оболочки из URL-адреса, но давайте сейчас все проигнорируем.

Ответы [ 14 ]

186 голосов
/ 20 апреля 2011
source <(curl -s http://mywebsite.com/myscript.txt)

должен это сделать.В качестве альтернативы, оставьте исходное перенаправление на вашем, которое перенаправляет стандартный ввод;bash требует, чтобы имя файла выполнялось просто без перенаправления, а синтаксис <(command) предоставляет путь.

bash <(curl -s http://mywebsite.com/myscript.txt)

Это может быть понятнее, если вы посмотрите на вывод echo <(cat /dev/null)

78 голосов
/ 14 июля 2013

Это способ выполнения удаленного скрипта с передачей ему нескольких аргументов (arg1 arg2):

curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2
33 голосов
/ 28 марта 2015

Для bash:

curl -s http://server/path/script.sh | bash -s arg1 arg2

Флаг "-s" делает чтение оболочки из стандартного ввода.

Работает для:
Баш
Оболочка Борна
Рыба

15 голосов
/ 16 мая 2013

Использование wget, которое обычно является частью установки системы по умолчанию:

bash <(wget -qO- http://mywebsite.com/myscript.txt)
12 голосов
/ 20 апреля 2011

Попробуйте просто:

bash <(curl -s http://mywebsite.com/myscript.txt)
11 голосов
/ 25 мая 2016

Использование:

curl -s -L URL_TO_SCRIPT_HERE | bash

Например:

curl -s -L http://bitly/10hA8iC | bash
11 голосов
/ 09 июля 2013

Вы также можете сделать это:

wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash
9 голосов
/ 20 сентября 2016

Лучший способ сделать это -

curl http://domain/path/to/script.sh | bash -s arg1 arg2

, что является небольшим изменением ответа @ user77115

5 голосов
/ 14 июня 2016

Мне часто достаточно следующего использования

curl -s http://mywebsite.com/myscript.txt | sh

Но в старой системе (kernel2.4) она сталкивается с проблемами, и решить ее может следующее, я пробовал много других, только следующиеработает

curl -s http://mywebsite.com/myscript.txt -o a.sh && sh a.sh && rm -f a.sh

Примеры

$ curl -s someurl | sh
Starting to insert crontab
sh: _name}.sh: command not found
sh: line 208: syntax error near unexpected token `then'
sh: line 208: ` -eq 0 ]]; then'
$

Проблема может быть вызвана медленной сетью или слишком старой версией bash, которая не может корректно работать с сетью

ОднакоСледующее решает проблему

$ curl -s someurl -o a.sh && sh a.sh && rm -f a.sh
Starting to insert crontab
Insert crontab entry is ok.
Insert crontab is done.
okay
$
4 голосов
/ 13 февраля 2015

Также:

curl -sL https://.... | sudo bash -
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...