Eseguire lo script bash dall'URL


184

Supponi di avere un file nell'URL "http://mywebsite.com/myscript.txt" che contiene uno script:

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

E vorrei eseguire questo script senza prima salvarlo in un file. Come faccio a fare questo?

Ora ho visto la sintassi:

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

Ma questo non sembra funzionare come se fosse salvato su un file e quindi eseguito. Ad esempio readline non funziona e l'output è solo:

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

Allo stesso modo, ho provato:

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

Con gli stessi risultati.

Inizialmente avevo una soluzione come:

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

Ma questo sembra sciatto e vorrei una soluzione più elegante.

Sono a conoscenza dei problemi di sicurezza relativi all'esecuzione di uno script di shell da un URL, ma ignoriamo tutto ciò per ora.


3
Se mktemp
finisci

cmd <<foo è la sintassi ereditaria nella maggior parte delle shell e probabilmente non è ciò che si desidera.
dietbuddha,

Risposte:


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

dovrebbe farlo. In alternativa, interrompi il reindirizzamento iniziale sul tuo, che sta reindirizzando l'input standard; bashaccetta un nome file per essere eseguito correttamente senza reindirizzamento e la <(command)sintassi fornisce un percorso.

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

Potrebbe essere più chiaro se si guarda all'output di echo <(cat /dev/null)


Grazie, questo ha chiarito cosa stava succedendo. Solo curioso, qual è il vantaggio di utilizzare quel reindirizzamento iniziale? Chiedo perché per l'installazione di RVM, usano il comando: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) Perché non solo: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan

4
Piccola nota: se wget è disponibile ma non è ricciolo (ad esempio, su un magazzino sistema desktop di Ubuntu), è possibile sostituire wget -q http://mywebsite.com/myscript.txt -O -per curl -s http://mywebsite.com/myscript.txt).
D Coetzee,

5
Tieni presente che non puoi trasmettere argomenti della riga di comando al tuo script. bash will_not_work foobar <(curl -s http://example.com/myscript.sh)Se possiedi lo script puoi usare le variabili di ambiente in questo modo: MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)e funziona anche con le pipe in questo modo: curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bashquesto ovviamente richiede l'utilizzo di MYFLAG1 e MYFLAG2 invece di $ 1 e $ 2
Bruno Bronosky

3
$ sudo bash <(curl -s xxx ) ha ricevuto un errore: bash: / dev / fd / 63: descrittore di file errato
Jake

2
La prima soluzione (quella che utilizza source) non ha funzionato affatto. Il secondo ha funzionato un po 'ma ha i suoi limiti. Sta eseguendo lo script dall'URL in una subshell. Ho alcune funzioni definite nello script che vorrei usare nel genitore. Esiste un modo per raggiungerlo? O sono sfortunato e l'unica soluzione è quella di copiare quello script in un file temporaneo e quindi sorgente?
Harsh Pandey,

86

Questo è il modo di eseguire script remoti passandogli alcuni argomenti (arg1 arg2):

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

2
questo interrompe stty: \ usa bash <(curl ... ) se usi stdin
Flores Robles il

47

Per bash, Bourne shell e pesce:

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

Flag "-s" fa leggere la shell dallo stdin.


1
questo dovrebbe funzionare nella maggior parte delle conchiglie, mentre la risposta accettata non funziona con i pesci , per esempio.
hoijui,

16

Utilizzo wget, che di solito fa parte dell'installazione predefinita del sistema:

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

RTFM: gnu.org/software/wget/manual/wget.html . ||| -q == --quiet == "Disattiva l'output di Wget." ||| -O- == --output-document = - == Se '-' viene utilizzato come file, i documenti verranno stampati sullo standard output.
amra

13

Uso:

curl -s -L URL_TO_SCRIPT_HERE | bash

Per esempio:

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

12

Prova solo:

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

11

Puoi anche fare questo:

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

11

Il modo migliore per farlo è

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

che è un leggero cambio di risposta da parte di @utente77115


6

Spesso uso quanto segue è abbastanza

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

Ma in un vecchio sistema (kernel2.4), si verificano problemi e le seguenti operazioni possono risolverlo, ho provato molti altri, solo i seguenti lavori

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

Esempi

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

Il problema può essere causato da una rete lenta o da una versione bash troppo vecchia che non è in grado di gestire la rete lentamente con grazia

Tuttavia, quanto segue risolve il problema

$ 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

Anche:

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

3
Quale dose significa l'ultima striscia?
rimorchiato il

Dalla pagina man di bash: A - segnala la fine delle opzioni e disabilita l'ulteriore elaborazione delle opzioni. Eventuali argomenti dopo il - sono trattati come nomi di file e argomenti. Un argomento di - equivale a -.
Mingjiang Shi,

3

Combinando semplicemente le risposte di amra e user77115:

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

Esegue lo script distante bbstart.sh passandogli le opzioni -v -v.


2

È alcuni script non presidiati che uso il seguente comando:

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

Consiglio di evitare di eseguire script direttamente dagli URL. Dovresti essere sicuro che l'URL sia sicuro e controllare il contenuto dello script prima di eseguire, puoi utilizzare un checksum SHA256 per convalidare il file prima di eseguire.


0

In questo modo è buono e convenzionale:

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

esempio reale:

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


Oh, wow im alive


juan@juan-MS-7808:~$ 

Questo è assolutamente sbagliato. Metti alla prova i tuoi script prima di pubblicare e non falsificare l'output.
Korkman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.