Transférer un script avec «read» vers bash


10

J'ai besoin d'exécuter un script en le canalisant bashavec wget(plutôt que de l'exécuter directement avec bash).

$ wget -O - http://example.com/my-script.sh | bash

Cela ne fonctionne pas car mon script contient des readinstructions. Pour une raison quelconque, cela ne fonctionne pas lors de la tuyauterie pour bash:

# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi

# `read` works directly
$ read -p "input: " var
input: <prompt>

# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$

Au lieu d' input:inviter et de demander une valeur comme il se doit, la commande read est simplement passée par bash.

Est -ce que quelqu'un sait comment je peux diriger un script avec readpour bash?

Réponses:


16

readlit à partir de l'entrée standard. Mais l'entrée standard du processus bash est déjà prise par le script. Selon le shell, soit readne lira rien car le shell a déjà lu et analysé l'intégralité du script, soit readconsommera des lignes imprévisibles dans le script.

Solution simple:

bash -c "$(wget -O - http://example.com/my-script.sh)"

Solution plus complexe, plus à des fins éducatives que pour illustrer une bonne solution pour ce scénario particulier:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash

Super merci. C'est presque aussi élégant.
Robin Winslow

2

La substitution de processus fera ce que vous voulez:

bash <(wget ...)

Cela dit, je dois remettre en question votre motivation ici. Si vous contrôlez le serveur Web (et utilisez https), cela peut avoir du sens. Mais exécuter un script à partir d'Internet est très risqué.


just running a script from the internet blind is very risky- oui, nous savons que c'est risqué, mais les gens peuvent choisir de faire confiance aux scripts de certaines organisations. Voir la discussion dans les commentaires sur la réponse de @ Xen2050.
Robin Winslow

1

Y a-t-il un problème avec:

wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh

?


'cos alors je dois créer un fichier. Je veux dire que ça marcherait, c'est juste un peu désordonné.
Robin Winslow

1
Vrai. Bien que ce soit une bonne raison d'utiliser /tmp, de nombreux programmes utilisent des fichiers temporaires. Je serais prêt à exécuter des scripts téléchargés immédiatement sans y jeter un œil au préalable ...
Xen2050

Eh bien, c'est votre appel. De nombreux projets proposent ces one-liners, par exemple Docker , ohmyzsh et d'autres dont je ne me souviens pas pour le moment. Dans ce cas, c'est un script de configuration que je veux exécuter sur de nouveaux systèmes à partir de mon propre référentiel. Je ne suis pas trop inquiet pour son contenu, comme je l'ai écrit.
Robin Winslow

3
Je pense que quelqu'un d'autre qui trouverait cette question (un utilisateur totalement nouveau peut-être) ne saurait pas mieux.
Xen2050
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.