Exécuter le script bash à partir de l'URL

184

Disons que j'ai un fichier à l'URL "http://mywebsite.com/myscript.txt" qui contient un script:

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

Et j'aimerais exécuter ce script sans d'abord l'enregistrer dans un fichier. Comment puis-je faire cela?

Maintenant, j'ai vu la syntaxe:

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

Mais cela ne semble pas fonctionner comme si j'avais enregistré dans un fichier puis exécuté. Par exemple, readline ne fonctionne pas et la sortie est juste:

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

De même, j'ai essayé:

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

Avec les mêmes résultats.

À l'origine, j'avais une solution comme:

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

Mais cela semble bâclé, et j'aimerais une solution plus élégante.

Je suis conscient des problèmes de sécurité liés à l'exécution d'un script shell à partir d'une URL, mais ignorons tout cela pour le moment.

Tristan
la source
3
Si vous mktemp
finissez
cmd <<foo est la syntaxe heredoc dans la plupart des shells et probablement pas ce que vous voulez.
dietbuddha

Réponses:

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

devrait le faire. Sinon, laissez la redirection initiale sur la vôtre, qui redirige l'entrée standard; bashprend un nom de fichier pour s'exécuter correctement sans redirection, et la <(command)syntaxe fournit un chemin.

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

Cela peut être plus clair si vous regardez la sortie de echo <(cat /dev/null)

geekosaure
la source
Merci, cela a clarifié ce qui se passait. Juste curieux, quel est l'avantage d'utiliser cette redirection initiale? Je demande car pour l'installation RVM, ils utilisent la commande: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) Pourquoi pas simplement: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan
4
Petite note: si wget est disponible , mais boucle n'est pas (par exemple , sur un stock système de bureau Ubuntu), vous pouvez remplacer wget -q http://mywebsite.com/myscript.txt -O -pour curl -s http://mywebsite.com/myscript.txt).
D Coetzee
5
Sachez que vous ne pouvez pas transmettre d'arguments de ligne de commande à votre script. bash will_not_work foobar <(curl -s http://example.com/myscript.sh)Si vous possédez le script, vous pouvez utiliser des variables d'environnement à la place comme ceci: MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)et cela fonctionne également avec des tubes comme ceci: curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bashCela nécessite bien sûr que vous utilisiez MYFLAG1 et MYFLAG2 au lieu de $ 1 et $ 2
Bruno Bronosky
3
$ sudo bash <(curl -s xxx ) a obtenu l'erreur: bash: / dev / fd / 63: descripteur de fichier incorrect
Jake
2
La première solution (celle utilisant la source) ne fonctionnait pas du tout. Le second a quelque peu fonctionné mais a ses limites. Il exécute le script à partir de l'URL dans un sous-shell. J'ai quelques fonctions définies dans le script que je voudrais utiliser dans le parent. Y a-t-il un moyen d'y parvenir? Ou est-ce que je n'ai pas de chance et la seule solution est de copier ce script dans un fichier temporaire puis de le trouver?
Harsh Pandey
86

C'est la façon d'exécuter un script distant en lui passant quelques arguments (arg1 arg2):

curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2
Anandi Das
la source
2
cela casse stty: \ utiliser bash <(curl ... ) si vous utilisez stdin
Flores Robles
47

Pour les bash, les coquillages Bourne et les poissons:

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

Le drapeau "-s" fait lire le shell à partir de stdin.

user77115
la source
1
cela devrait fonctionner dans la plupart des coquillages, alors que la réponse acceptée ne fonctionne pas avec les poissons , par exemple.
hoijui
16

Utilisation wget, qui fait généralement partie de l'installation du système par défaut:

bash <(wget -qO- http://mywebsite.com/myscript.txt)
amra
la source
RTFM: gnu.org/software/wget/manual/wget.html . ||| -q == --quiet == "Désactive la sortie de Wget." ||| -O- == --output-document = - == Si '-' est utilisé comme fichier, les documents seront imprimés sur la sortie standard.
amra
13

Utilisation:

curl -s -L URL_TO_SCRIPT_HERE | bash

Par exemple:

curl -s -L http://bitly/10hA8iC | bash
Katie MC
la source
12

Essayez juste:

bash <(curl -s http://mywebsite.com/myscript.txt)
Aléatoire832
la source
11

Vous pouvez également faire ceci:

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

La meilleure façon de le faire est

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

qui est un léger changement de réponse de @ user77115

Vamsidhar Muggulla
la source
6

J'utilise souvent ce qui suit est suffisant

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

Mais dans un ancien système (kernel2.4), il rencontre des problèmes, et faire ce qui suit peut le résoudre, j'ai essayé beaucoup d'autres, seuls les travaux suivants

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

Exemples

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

Le problème peut être causé par un réseau lent ou une version bash trop ancienne qui ne peut pas gérer le réseau lent avec élégance

Cependant, ce qui suit résout le problème

$ 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
la source
4

Aussi:

curl -sL https://.... | sudo bash -
Thomas Decaux
la source
3
Quelle dose la dernière bandelette signifie?
Towry
Depuis la page de manuel bash: A - signale la fin des options et désactive le traitement des options ultérieur. Tous les arguments après le - sont traités comme des noms de fichiers et des arguments. Un argument de - équivaut à -.
Mingjiang Shi
3

Il suffit de combiner les réponses d'amra et de user77115:

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

Il exécute le script distant bbstart.sh en lui passant les options -v -v.

lingue
la source
2

Est-ce que certains scripts sans assistance j'utilise la commande suivante:

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

Je recommande d'éviter d'exécuter des scripts directement à partir d'URL. Vous devez vous assurer que l'URL est sûre et vérifier le contenu du script avant de l'exécuter, vous pouvez utiliser une somme de contrôle SHA256 pour valider le fichier avant de l'exécuter.

Mauricio Sánchez
la source
0

Cette façon est bonne et conventionnelle:

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
la source
-3
bash | curl http://your.url.here/script.txt

exemple réel:

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


Oh, wow im alive


juan@juan-MS-7808:~$ 
Mèmes aléatoires 2k18
la source
C'est carrément faux. Testez vos scripts avant de publier et ne falsifiez pas la sortie.
korkman le