Exécuter script bash à partir de l'URL
Dire 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 il l'aurait fait si je l'ai enregistré dans un fichier, puis exécuté. Par exemple readline ne fonctionne pas, et le résultat 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ée, et j'aimerais une solution plus élégante.
Je suis conscient des problèmes de sécurité concernant l'exécution d'un script shell à partir d'une URL, mais nous allons ignorer tout cela pour l'instant.
- Si vous ne finissent par créer un fichier temporaire, vous devriez probablement utiliser des
mktemp
au lieu de rouler votre propre solution cmd <<foo
est syntaxe heredoc dans la plupart des coquilles et probablement pas ce que vous voulez.
Vous devez vous connecter pour publier un commentaire.
devrait le faire. Alternativement, laisser de côté l'initiale de redirection sur le vôtre, qui est de rediriger l'entrée standard;
bash
prend un nom de fichier pour exécuter correctement sans redirection, et<(command)
syntaxe fournit un chemin d'accès.Il peut être plus clair si vous chercher à la sortie de
echo <(cat /dev/null)
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
Pourquoi ne 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 au lieu de la sorte:MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)
et il travaille également avec des tubes comme:curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bash
bien sûr, Cela nécessite que vous utilisez MYFLAG1 et MYFLAG2 au lieu de $1 et $2bash
en tant que root, mais "curl" en tant qu'utilisateur standard? Je ne sais pas si Linux se divise descripteurs de fichiers en fonction de l'utilisateur, ou au moins restreint à l'utilisateur qui les a créés.su
, puis, pendant que vous êtes root, exécutez la commande sanssudo
.exit
(par exemple, pour une erreur) il pourra vous déposer à votre session. Le bash version fonctionne le mieux pour cela, et permet également à des variables d'environnement à définir localement dans le script sans persistance.C'est la façon d'exécuter le script distant avec lui passant des arguments (arg1 arg2):
bash <(curl ... )
si vous utilisez stdinPour bash, shell Bourne shell et le poisson:
Drapeau "-s" permet de shell lire depuis l'entrée standard.
À l'aide de
wget
, qui fait généralement partie de défaut de l'installation du système:Essayez juste d':
Utilisation:
Par exemple:
Vous pouvez également le faire:
La meilleure façon de le faire est
qui est une légère modification de la réponse par @user77115
J'ai souvent à l'aide de la suite est assez
Mais dans un ancien système( kernel2.4 ), il rencontre des problèmes, et de faire ce qui suit peut le résoudre, j'ai essayé beaucoup d'autres, seuls les ouvrages suivants
Exemples
Le problème peut provoquer des réseau lent ou bash version trop ancienne qui ne peut pas gérer le réseau lent gracieusement
Toutefois, le texte suivant permet de résoudre le problème
Aussi:
Juste combinant amra et user77115 réponses:
Il exécute les bbstart.sh lointain script en lui passant le -v -v options.
Est certains sans surveillance scripts j'utilise la commande suivante:
sh -c "$(curl -fsSL <URL>)"
Je recommande d'éviter l'exécution de scripts directement à partir d'Url. Vous devez être sûr que l'URL est sûr 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.
De cette façon est bonne et classique:
exemple réel: