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.
mktemp
zamiast toczenia własne rozwiązaniecmd <<foo
jest składnią heredoc w większości powłok i prawdopodobnie nie jest tym, czego chcesz.Odpowiedzi:
powinien to zrobić. Możesz też zrezygnować z początkowego przekierowania na swoim, które przekierowuje standardowe wejście;
bash
wykonuje nazwę pliku, aby wykonać poprawnie bez przekierowania, a<(command)
składnia zapewnia ścieżkę.Może być wyraźniej, jeśli spojrzysz na wynik
echo <(cat /dev/null)
źródło
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
Dlaczego nie tylko:bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
wget -q http://mywebsite.com/myscript.txt -O -
zacurl -s http://mywebsite.com/myscript.txt
).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ż zcurl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bash
potokami : To oczywiście wymaga użycia MYFLAG1 i MYFLAG2 zamiast 1 $ i 2 $Oto sposób na wykonanie skryptu zdalnego z przekazaniem do niego niektórych argumentów (arg1 arg2):
źródło
bash <(curl ... )
jeśli używasz stdinW przypadku bash, muszli Bourne'a i ryb:
Flaga „-s” powoduje, że powłoka jest odczytywana ze standardowego wejścia.
źródło
Używanie
wget
, które zwykle stanowi część domyślnej instalacji systemu:źródło
Posługiwać się:
Na przykład:
źródło
Spróbuj po prostu:
źródło
Możesz także to zrobić:
źródło
Najlepszym sposobem na to jest
co jest niewielką zmianą odpowiedzi użytkownika @ user77115
źródło
Często wystarczy użyć następujących
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
Przykłady
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
źródło
Również:
źródło
Po prostu łącząc odpowiedzi Amry i user77115:
Wykonuje odległy skrypt bbstart.sh, przekazując mu opcje -v -v.
źródło
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.
źródło
Ten sposób jest dobry i konwencjonalny:
źródło
faktyczny przykład:
źródło