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.
mktemp
lugar de lanzar su propia solucióncmd <<foo
es una sintaxis heredoc en la mayoría de los shells y probablemente no sea lo que desea.Respuestas:
Debería hacerlo. Alternativamente, omita la redirección inicial en la suya, que está redirigiendo la entrada estándar;
bash
toma un nombre de archivo para ejecutarse bien sin redireccionamiento, y la<(command)
sintaxis proporciona una ruta.Puede ser más claro si nos fijamos en la salida de
echo <(cat /dev/null)
fuente
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
¿Por qué no simplemente:bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
wget -q http://mywebsite.com/myscript.txt -O -
porcurl -s http://mywebsite.com/myscript.txt
).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 bash
por supuesto, esto requiere que use MYFLAG1 y MYFLAG2 en lugar de $ 1 y $ 2Esta es la forma de ejecutar un script remoto pasándole algunos argumentos (arg1 arg2):
fuente
bash <(curl ... )
si usa stdinPara bash, concha Bourne y pescado:
La marca "-s" hace que el shell lea desde stdin.
fuente
Uso
wget
, que generalmente es parte de la instalación predeterminada del sistema:fuente
Utilizar:
Por ejemplo:
fuente
Intenta solo:
fuente
También puedes hacer esto:
fuente
La mejor manera de hacerlo es
que es un ligero cambio de respuesta por @ user77115
fuente
A menudo uso lo siguiente es suficiente
Pero en un sistema antiguo (kernel2.4), encuentra problemas, y hacer lo siguiente puede resolverlo, probé muchos otros, solo los siguientes funcionan
Ejemplos
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
fuente
También:
fuente
Simplemente combinando las respuestas de amra y user77115:
Ejecuta el script distante bbstart.sh pasándole las opciones -v -v.
fuente
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.
fuente
Este camino es bueno y convencional:
fuente
ejemplo real:
fuente