Скажем, у меня есть файл по адресу «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-адреса, но давайте сейчас проигнорируем все это.
mktemp
вместо того, чтобы использовать собственное решениеcmd <<foo
это синтаксис heredoc в большинстве оболочек и, вероятно, не то, что вы хотите.Ответы:
должен сделать это. В качестве альтернативы, оставьте исходное перенаправление на вашем, которое перенаправляет стандартный ввод;
bash
берет имя файла для исполнения без переадресации, а<(command)
синтаксис предоставляет путь.Это может быть яснее, если вы посмотрите на вывод
echo <(cat /dev/null)
источник
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
Почему бы просто:bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
wget -q http://mywebsite.com/myscript.txt -O -
наcurl -s http://mywebsite.com/myscript.txt
).bash will_not_work foobar <(curl -s http://example.com/myscript.sh)
Если у вас есть сценарий, вы можете использовать вместо него переменные окружения, например, так:MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)
он также работает с конвейерами следующим образом:curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bash
это, конечно, требует, чтобы вы использовали MYFLAG1 и MYFLAG2 вместо 1 и 2 долларов СШАЭто способ выполнения удаленного скрипта с передачей ему некоторых аргументов (arg1 arg2):
источник
bash <(curl ... )
если вы используете stdinДля bash, Bourne shell и рыбы:
Флаг "-s" делает чтение оболочки из стандартного ввода.
источник
Использование
wget
, которое обычно является частью установки системы по умолчанию:источник
Использование:
Например:
источник
Попробуйте просто:
источник
Вы также можете сделать это:
источник
Лучший способ сделать это
это небольшое изменение ответа от @ user77115
источник
Я часто использую следующее достаточно
Но в старой системе (kernel2.4), он сталкивается с проблемами, и решить эту проблему может следующее, я пробовал много других, только следующие работы
Примеры
Проблема может быть вызвана медленной работой сети или слишком старой версией bash, которая не может корректно работать с сетью
Тем не менее, следующее решает проблему
источник
Также:
источник
Просто объединяем ответы amra и user77115:
Он выполняет удаленный скрипт bbstart.sh, передавая ему параметры -v -v.
источник
В некоторых автоматических сценариях я использую следующую команду:
sh -c "$(curl -fsSL <URL>)"
Я рекомендую избегать выполнения скриптов непосредственно из URL. Вы должны быть уверены, что URL-адрес безопасен и проверить содержимое скрипта перед выполнением, вы можете использовать контрольную сумму SHA256 для проверки файла перед выполнением.
источник
Этот способ хорош и условен:
источник
фактический пример:
источник