Uruchom skrypt bash z adresu URL

183

Załóżmy, że mam plik o adresie URL „http://mywebsite.com/myscript.txt”, który zawiera skrypt:

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

I chciałbym uruchomić ten skrypt bez uprzedniego zapisania go w pliku. Jak mam to zrobic?

Teraz widziałem składnię:

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

Ale to nie wydaje się działać tak, jak gdybym zapisał do pliku, a następnie wykonał. Na przykład readline nie działa, a wynik jest po prostu:

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

Podobnie próbowałem:

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

Z tymi samymi wynikami.

Początkowo miałem rozwiązanie takie jak:

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

Ale to wydaje się niechlujne i chciałbym bardziej eleganckiego rozwiązania.

Zdaję sobie sprawę z problemów bezpieczeństwa związanych z uruchamianiem skryptu powłoki z adresu URL, ale na razie zignorujmy to wszystko.

Tristan
źródło
3
Jeśli nie kończy się tworząc tymczasowy plik, powinieneś używać mktempzamiast toczenia własne rozwiązanie
Hasturkun
cmd <<foo jest składnią heredoc w większości powłok i prawdopodobnie nie jest tym, czego chcesz.
dietbuddha

Odpowiedzi:

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

powinien to zrobić. Możesz też zrezygnować z początkowego przekierowania na swoim, które przekierowuje standardowe wejście; bashwykonuje nazwę pliku, aby wykonać poprawnie bez przekierowania, a <(command)składnia zapewnia ścieżkę.

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

Może być wyraźniej, jeśli spojrzysz na wynik echo <(cat /dev/null)

geekozaur
źródło
Dzięki, stało się jasne, co się dzieje. Ciekawe, jaka jest zaleta korzystania z tego początkowego przekierowania? Pytam, ponieważ do instalacji RVM używają polecenia: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) Dlaczego nie tylko: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan
4
Mała uwaga: jeśli wget jest dostępny, ale nie jest to curl (np w stanie stacjonarnym systemie Ubuntu) można podstawić wget -q http://mywebsite.com/myscript.txt -O -za curl -s http://mywebsite.com/myscript.txt).
D Coetzee,
5
Pamiętaj, że nie możesz przekazywać do skryptu argumentów wiersza poleceń. bash will_not_work foobar <(curl -s http://example.com/myscript.sh)Jeśli jesteś właścicielem skryptu, możesz zamiast tego używać zmiennych środowiskowych: MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)działa to również z curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bashpotokami : To oczywiście wymaga użycia MYFLAG1 i MYFLAG2 zamiast 1 $ i 2 $
Bruno Bronosky
3
$ sudo bash <(curl -s xxx ) dostał błąd: bash: / dev / fd / 63: zły deskryptor pliku
Jake
2
Pierwsze rozwiązanie (to wykorzystujące źródło) w ogóle nie działało. Drugi działał nieco, ale ma swoje ograniczenia. Wykonuje skrypt z adresu URL w podpowłoce. Mam pewne funkcje zdefiniowane w skrypcie, których chciałbym użyć w rodzicu. Czy w ogóle można to osiągnąć? A może mam pecha i jedynym rozwiązaniem jest skopiowanie tego skryptu do pliku tymczasowego, a następnie jego źródło?
Harsh Pandey,
86

Oto sposób na wykonanie skryptu zdalnego z przekazaniem do niego niektórych argumentów (arg1 arg2):

curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2
Anandi Das
źródło
2
to łamie stty: \ użyj, bash <(curl ... ) jeśli używasz stdin
Flores Robles
47

W przypadku bash, muszli Bourne'a i ryb:

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

Flaga „-s” powoduje, że powłoka jest odczytywana ze standardowego wejścia.

użytkownik77115
źródło
1
powinno to działać w większości muszli, podczas gdy zaakceptowana odpowiedź nie działa na przykład w przypadku ryb .
hoijui
16

Używanie wget, które zwykle stanowi część domyślnej instalacji systemu:

bash <(wget -qO- http://mywebsite.com/myscript.txt)
amra
źródło
RTFM: gnu.org/software/wget/manual/wget.html . ||| -q == --quiet == "Wyłącz wyjście Wget." ||| -O- == --output-document = - == Jeśli jako plik zostanie użyty „-”, dokumenty zostaną wydrukowane na standardowe wyjście.
amra
13

Posługiwać się:

curl -s -L URL_TO_SCRIPT_HERE | bash

Na przykład:

curl -s -L http://bitly/10hA8iC | bash
Katie MC
źródło
12

Spróbuj po prostu:

bash <(curl -s http://mywebsite.com/myscript.txt)
Losowo 832
źródło
11

Możesz także to zrobić:

wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash
luismartingil
źródło
11

Najlepszym sposobem na to jest

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

co jest niewielką zmianą odpowiedzi użytkownika @ user77115

Vamsidhar Muggulla
źródło
6

Często wystarczy użyć następujących

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

Ale w starym systemie (jądro 2.4) napotyka problemy i wykonaj następujące czynności, aby je rozwiązać, próbowałem wielu innych, tylko następujące prace

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

Przykłady

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

Problem może być spowodowany spowolnieniem sieci lub zbyt starą wersją bash, która nie poradzi sobie z powolną pracą sieci

Jednak poniższe rozwiązanie rozwiązuje problem

$ 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
$
Chinglin Wen
źródło
4

Również:

curl -sL https://.... | sudo bash -
Thomas Decaux
źródło
3
Jaka dawka oznacza ostatni pasek?
towry
Ze strony podręcznika użytkownika bash: A - sygnalizuje koniec opcji i wyłącza dalsze przetwarzanie opcji. Wszelkie argumenty po - są traktowane jak nazwy plików i argumenty. Argument - jest równoważny z -.
Mingjiang Shi
3

Po prostu łącząc odpowiedzi Amry i user77115:

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

Wykonuje odległy skrypt bbstart.sh, przekazując mu opcje -v -v.

molwa
źródło
2

Czy w niektórych skryptach nienadzorowanych używam następującego polecenia:

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

Zalecam unikanie wykonywania skryptów bezpośrednio z adresów URL. Należy upewnić się, że adres URL jest bezpieczny i sprawdzić zawartość skryptu przed wykonaniem, można użyć sumy kontrolnej SHA256, aby sprawdzić poprawność pliku przed wykonaniem.

Mauricio Sánchez
źródło
0

Ten sposób jest dobry i konwencjonalny:

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: $#
javafoot
źródło
-3
bash | curl http://your.url.here/script.txt

faktyczny przykład:

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


Oh, wow im alive


juan@juan-MS-7808:~$ 
Losowe memy 2k18
źródło
To po prostu źle. Przetestuj swoje skrypty przed opublikowaniem i nie fałszuj wyników.
korkman