Виконати bash скрипт з URL


184

Скажіть, у мене є файл за 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-адреси, але зараз ігноруємо все це.


3
Якщо ви створили тимчасовий файл, ви, ймовірно, використовуєте mktempзамість того, щоб прокручувати власне рішення
Hasturkun,

cmd <<foo синтаксис гередока в більшості оболонок і, мабуть, не те, що потрібно.
дієтабудда

Відповіді:


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

повинен це зробити. Крім того, залиште початкове перенаправлення на ваше, яке є переадресацією стандартного вводу; bashзаймає ім’я файлу, щоб виконати його просто без перенаправлення, а <(command)синтаксис забезпечує шлях.

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

Це може бути зрозуміліше, якщо ви подивитеся на вихід echo <(cat /dev/null)


Дякую, це дало зрозуміти, що відбувається. Просто цікаво, у чому перевага використання цього початкового перенаправлення? Я запитую, оскільки для встановлення RVM вони використовують команду: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) Чому б не просто: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan

4
Невелике зауваження: якщо Wget доступний , але завиток не є (наприклад , на складі настільної системи Ubuntu), ви можете замінити wget -q http://mywebsite.com/myscript.txt -O -на curl -s http://mywebsite.com/myscript.txt).
D Coetzee

5
Майте на увазі, що ви не можете передавати аргументи командного рядка своєму сценарію. 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
Бруно Броноський

3
$ sudo bash <(curl -s xxx ) отримав помилку: bash: / dev / fd / 63: Неправильний дескриптор файлу
Джейк

2
Перше рішення (яке використовує джерело) взагалі не спрацювало. Друга дещо працювала, але має свої обмеження. Він виконує скрипт з URL-адреси в підрозділі. У мене в сценарії визначені деякі функції, які я хотів би використовувати в батьківському. Чи все-таки можна цього досягти? Або мені не пощастило, і єдине рішення - скопіювати цей скрипт у тимчасовий файл і потім його джерело?
Суворий Пандій

86

Це спосіб виконати віддалений скрипт, передавши до нього кілька аргументів (arg1 arg2):

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

2
ця помилка stty: \ використовуйте, bash <(curl ... ) якщо ви використовуєте stdin
Flores Robles

47

Для башмака, шкаралупи Борна та риби:

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

Прапор "-s" робить оболонку зчитаною з stdin.


1
це має працювати в більшості оболонок, поки прийнята відповідь не працює, наприклад, з рибою .
hoijui

16

Використання wget, яке зазвичай є частиною встановлення системи за замовчуванням:

bash <(wget -qO- http://mywebsite.com/myscript.txt)

RTFM: gnu.org/software/wget/manual/wget.html . ||| -q == --quiet == "Вимкнути вихід Wget." ||| -O- == --output-document = - == Якщо "-" використовується як файл, документи будуть надруковані на стандартний вихід.
amra

13

Використання:

curl -s -L URL_TO_SCRIPT_HERE | bash

Наприклад:

curl -s -L http://bitly/10hA8iC | bash


11

Ви також можете зробити це:

wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash


6

Я часто використовую наступне досить

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'
$

Проблема може спричинити повільну мережу або забарвлену версію, яка не може витончено керувати мережею

Однак наступне вирішує проблему

$ 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

Також:

curl -sL https://.... | sudo bash -

3
Яку дозу означає остання смужка?
буксирування

З сторінки bash man: A - сигналізує про закінчення параметрів і вимикає подальшу обробку опцій. Будь-які аргументи після - трактуються як імена та аргументи. Аргумент - - еквівалентно -.
Mingjiang Shi

3

Просто поєднання відповідей amra та user77115:

wget -qO- https://raw.githubusercontent.com/lingtalfi/TheScientist/master/_bb_autoload/bbstart.sh | bash -s -- -v -v

Він виконує віддалений скрипт bbstart.sh, передаючи йому параметри -v -v.


2

Якийсь сценарій без нагляду я використовую таку команду:

sh -c "$(curl -fsSL <URL>)"

Рекомендую уникати виконання сценаріїв безпосередньо з URL-адрес. Ви повинні бути впевнені, що URL-адреса безпечна і перевірити вміст скрипту перед виконанням. Ви можете використовувати контрольну суму SHA256 для перевірки файлу перед виконанням.


0

Цей спосіб хороший і звичайний:

17:04:59@itqx|~
qx>source <(curl -Ls http://192.168.80.154/cent74/just4Test) Lord Jesus Loves YOU
Remote script test...
Param size: 4

---------
17:19:31@node7|/var/www/html/cent74
arch>cat just4Test
echo Remote script test...
echo Param size: $#

-3
bash | curl http://your.url.here/script.txt

фактичний приклад:

juan@juan-MS-7808:~$ bash | curl https://raw.githubusercontent.com/JPHACKER2k18/markwe/master/testapp.sh


Oh, wow im alive


juan@juan-MS-7808:~$ 

Це прямо неправильно. Тестуйте свої сценарії перед публікацією та не підробляйте вихід.
korkman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.