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.


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)


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

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.


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)

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


11

También puedes hacer esto:

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

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


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
$

4

También:

curl -sL https://.... | sudo bash -

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.


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.


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: $#

-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:~$ 

Esto es completamente incorrecto. Pruebe sus scripts antes de publicar y no falsifique la salida.
Korkman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.