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.
mktemp
cmd <<foo
est la syntaxe heredoc dans la plupart des shells et probablement pas ce que vous voulez.Réponses:
devrait le faire. Sinon, laissez la redirection initiale sur la vôtre, qui redirige l'entrée standard;
bash
prend un nom de fichier pour s'exécuter correctement sans redirection, et la<(command)
syntaxe fournit un chemin.Cela peut être plus clair si vous regardez la sortie de
echo <(cat /dev/null)
la source
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
Pourquoi pas simplement:bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
wget -q http://mywebsite.com/myscript.txt -O -
pourcurl -s http://mywebsite.com/myscript.txt
).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 bash
Cela nécessite bien sûr que vous utilisiez MYFLAG1 et MYFLAG2 au lieu de $ 1 et $ 2C'est la façon d'exécuter un script distant en lui passant quelques arguments (arg1 arg2):
la source
bash <(curl ... )
si vous utilisez stdinPour les bash, les coquillages Bourne et les poissons:
Le drapeau "-s" fait lire le shell à partir de stdin.
la source
Utilisation
wget
, qui fait généralement partie de l'installation du système par défaut:la source
Utilisation:
Par exemple:
la source
Essayez juste:
la source
Vous pouvez également faire ceci:
la source
La meilleure façon de le faire est
qui est un léger changement de réponse de @ user77115
la source
J'utilise souvent ce qui suit est suffisant
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
Exemples
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
la source
Aussi:
la source
Il suffit de combiner les réponses d'amra et de user77115:
Il exécute le script distant bbstart.sh en lui passant les options -v -v.
la source
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.
la source
Cette façon est bonne et conventionnelle:
la source
exemple réel:
la source