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.

123
demandé sur alain.janinm 2011-04-20 23:35:22

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)

158
répondu geekosaur 2015-04-25 18:26:43

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
69
répondu Anandi Das 2013-07-13 20:40:31

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.

25
répondu user77115 2015-03-28 12:03:20

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)
14
répondu amra 2013-05-16 09:48:13

Essayez juste:

bash <(curl -s http://mywebsite.com/myscript.txt)
11
répondu Random832 2011-04-20 19:42:17

Vous pouvez également faire ceci:

wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash
11
répondu luismartingil 2013-07-09 18:52:42

Utilisation:

curl -s -L URL_TO_SCRIPT_HERE | bash

Par exemple:

curl -s -L http://bitly/10hA8iC | bash
9
répondu Katie MC 2018-08-30 19:33:15

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

8
répondu Vamsidhar Muggulla 2016-09-20 09:24:44

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
$
4
répondu Chinglin Wen 2016-06-14 01:52:46

Aussi:

curl -sL https://.... | sudo bash -
3
répondu Thomas Decaux 2015-02-13 13:54:37

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.

3
répondu ling 2015-10-21 05:13:08

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.

1
répondu Mauricio Sánchez 2018-07-25 21:23:21

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: $#
0
répondu javafoot 2018-04-13 02:06:22