Exécuter le script bash à partir de L'URL
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 je voudrais exécuter ce script sans l'enregistrer dans un fichier. Comment dois-je faire?
Maintenant, j'ai vu la syntaxe:
bash < <(curl -s http://mywebsite.com/myscript.txt)
Mais cela ne semble pas fonctionner comme si j'enregistrais dans un fichier puis exécutais. 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 le même résultat.
À 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.
13 réponses
source <(curl -s http://mywebsite.com/myscript.txt)
Devrait le faire. Alternativement, laissez la redirection initiale sur la vôtre, qui redirige l'entrée standard; bash
prend un nom de fichier à exécuter correctement sans redirection, et la syntaxe <(command)
fournit un chemin.
bash <(curl -s http://mywebsite.com/myscript.txt)
Il peut être plus clair si vous regardez la sortie de echo <(cat /dev/null)
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
Pour bash:
curl -s http://server/path/script.sh | bash -s arg1 arg2
Bourne shell prend également en charge "-s" pour lire à partir de stdin.
En utilisant wget
, qui fait généralement partie de l'installation du système par défaut:
bash <(wget -qO- http://mywebsite.com/myscript.txt)
Essayez juste:
bash <(curl -s http://mywebsite.com/myscript.txt)
Vous pouvez également faire ceci:
wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash
Utilisation:
curl -s -L URL_TO_SCRIPT_HERE | bash
Par exemple:
curl -s -L http://bitly/10hA8iC | bash
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 par @user77115
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 causer par le réseau lent, ou la 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
$
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 bbstart.sh script distant lui passant les options-v-V.
Est-ce que certains scripts sans surveillance utilisent la commande suivante:
sh -c "$(curl -fsSL <URL>)"
Je recommande d'éviter d'exécuter des scripts directement à partir D'URL. Vous devez être sûr que L'URL est sûre et vérifier le contenu du script avant l'exécution, vous pouvez utiliser une somme de contrôle SHA256 pour valider le fichier avant l'exécution.
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: $#