Ejecutar script bash desde URL

184

Digamos que tengo un archivo en la URL "http://mywebsite.com/myscript.txt" que contiene un script:

#!/bin/bash
echo "Hello, world!"
read -p "What is your name? " name
echo "Hello, ${name}!"

Y me gustaría ejecutar este script sin guardarlo primero en un archivo. ¿Cómo hago esto?

Ahora, he visto la sintaxis:

bash < <(curl -s http://mywebsite.com/myscript.txt)

Pero esto no parece funcionar como lo haría si lo guardara en un archivo y luego lo ejecutara. Por ejemplo, readline no funciona, y la salida es solo:

$ bash < <(curl -s http://mywebsite.com/myscript.txt)
Hello, world!

Del mismo modo, he intentado:

curl -s http://mywebsite.com/myscript.txt | bash -s --

Con los mismos resultados.

Originalmente tenía una solución como:

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

Pero esto parece descuidado, y me gustaría una solución más elegante.

Soy consciente de los problemas de seguridad relacionados con la ejecución de un script de shell desde una URL, pero ignoremos todo eso por ahora.

Tristan
fuente
3
Si termina creando un archivo temporal, probablemente debería estar usando en mktemplugar de lanzar su propia solución
Hasturkun
cmd <<foo es una sintaxis heredoc en la mayoría de los shells y probablemente no sea lo que desea.
dietbuddha

Respuestas:

218
source <(curl -s http://mywebsite.com/myscript.txt)

Debería hacerlo. Alternativamente, omita la redirección inicial en la suya, que está redirigiendo la entrada estándar; bashtoma un nombre de archivo para ejecutarse bien sin redireccionamiento, y la <(command)sintaxis proporciona una ruta.

bash <(curl -s http://mywebsite.com/myscript.txt)

Puede ser más claro si nos fijamos en la salida de echo <(cat /dev/null)

geekosaur
fuente
Gracias, esto dejó en claro lo que estaba pasando. Por curiosidad, ¿cuál es la ventaja de usar esa redirección inicial? Pregunto porque para la instalación de RVM, usan el comando: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) ¿Por qué no simplemente: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan
44
Pequeña nota: si wget está disponible pero curl no lo está (por ejemplo, en un sistema de escritorio Ubuntu de stock), puede sustituirlo wget -q http://mywebsite.com/myscript.txt -O -por curl -s http://mywebsite.com/myscript.txt).
D Coetzee
55
Tenga en cuenta que no puede pasar argumentos de línea de comandos a su secuencia de comandos. bash will_not_work foobar <(curl -s http://example.com/myscript.sh)Si posee el script, puede usar variables de entorno de la siguiente manera: MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)y también funciona con tuberías de esta manera: curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bashpor supuesto, esto requiere que use MYFLAG1 y MYFLAG2 en lugar de $ 1 y $ 2
Bruno Bronosky
3
$ sudo bash <(curl -s xxx ) tiene error: bash: / dev / fd / 63: Descriptor de archivo incorrecto
Jake
2
La primera solución (la que usa la fuente) no funcionó en absoluto. El segundo funcionó un poco pero tiene sus limitaciones. Está ejecutando el script desde la URL en una subshell. Tengo algunas funciones definidas en el script que me gustaría usar en el padre. ¿Hay alguna forma de lograr eso? ¿O no tengo suerte y la única solución es copiar ese script en un archivo temporal y luego obtenerlo?
Harsh Pandey
86

Esta es la forma de ejecutar un script remoto pasándole algunos argumentos (arg1 arg2):

curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2
Anandi Das
fuente
2
esto rompe stty: \ use bash <(curl ... ) si usa stdin
Flores Robles
47

Para bash, concha Bourne y pescado:

curl -s http://server/path/script.sh | bash -s arg1 arg2

La marca "-s" hace que el shell lea desde stdin.

usuario77115
fuente
1
Esto debería funcionar en la mayoría de las conchas, mientras que la respuesta aceptada no funciona con peces , por ejemplo.
hoijui
16

Uso wget, que generalmente es parte de la instalación predeterminada del sistema:

bash <(wget -qO- http://mywebsite.com/myscript.txt)
amra
fuente
RTFM: gnu.org/software/wget/manual/wget.html . ||| -q == --quiet == "Desactiva la salida de Wget". ||| -O- == --output-document = - == Si '-' se usa como archivo, los documentos se imprimirán a la salida estándar.
amra
13

Utilizar:

curl -s -L URL_TO_SCRIPT_HERE | bash

Por ejemplo:

curl -s -L http://bitly/10hA8iC | bash
Katie MC
fuente
12

Intenta solo:

bash <(curl -s http://mywebsite.com/myscript.txt)
Aleatorio832
fuente
11

También puedes hacer esto:

wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash
luismartingil
fuente
11

La mejor manera de hacerlo es

curl http://domain/path/to/script.sh | bash -s arg1 arg2

que es un ligero cambio de respuesta por @ user77115

Vamsidhar Muggulla
fuente
6

A menudo uso lo siguiente es suficiente

curl -s http://mywebsite.com/myscript.txt | sh

Pero en un sistema antiguo (kernel2.4), encuentra problemas, y hacer lo siguiente puede resolverlo, probé muchos otros, solo los siguientes funcionan

curl -s http://mywebsite.com/myscript.txt -o a.sh && sh a.sh && rm -f a.sh

Ejemplos

$ 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'
$

El problema puede deberse a una red lenta o una versión bash demasiado antigua que no puede manejar la red lenta con gracia

Sin embargo, lo siguiente resuelve el problema

$ 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
$
Chinglin Wen
fuente
4

También:

curl -sL https://.... | sudo bash -
Thomas Decaux
fuente
3
¿Qué dosis significa la última tira?
Towry
Desde la página de manual de bash: A - señala el final de las opciones y deshabilita el procesamiento adicional de opciones. Cualquier argumento después de - se trata como nombres de archivo y argumentos. Un argumento de - es equivalente a -.
Mingjiang Shi
3

Simplemente combinando las respuestas de amra y user77115:

wget -qO- https://raw.githubusercontent.com/lingtalfi/TheScientist/master/_bb_autoload/bbstart.sh | bash -s -- -v -v

Ejecuta el script distante bbstart.sh pasándole las opciones -v -v.

abadejo
fuente
2

Es algunas secuencias de comandos desatendidas utilizo el siguiente comando:

sh -c "$(curl -fsSL <URL>)"

Recomiendo evitar ejecutar scripts directamente desde las URL. Debe asegurarse de que la URL sea segura y verificar el contenido del script antes de ejecutarlo, puede usar una suma de verificación SHA256 para validar el archivo antes de ejecutarlo.

Mauricio Sánchez
fuente
0

Este camino es bueno y convencional:

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: $#
javafoot
fuente
-3
bash | curl http://your.url.here/script.txt

ejemplo real:

juan@juan-MS-7808:~$ bash | curl https://raw.githubusercontent.com/JPHACKER2k18/markwe/master/testapp.sh


Oh, wow im alive


juan@juan-MS-7808:~$ 
Memes al azar 2k18
fuente
Esto es completamente incorrecto. Pruebe sus scripts antes de publicar y no falsifique la salida.
Korkman