Canalizar un script con "leer" para golpear

10

Necesito ejecutar un script canalizando a través bashde wget(en lugar de ejecutarlo directamente con bash).

$ wget -O - http://example.com/my-script.sh | bash

No funciona porque mi script tiene readdeclaraciones en él. Por alguna razón, estos no funcionan cuando se conecta a bash:

# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi

# `read` works directly
$ read -p "input: " var
input: <prompt>

# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$

En lugar de solicitar input:y pedir un valor como debería, el comando de lectura simplemente se pasa por alto bash.

¿Alguien sabe cómo puedo canalizar un script reada bash?

Robin Winslow
fuente

Respuestas:

16

readlee de la entrada estándar. Pero la entrada estándar del proceso bash ya está tomada por el script. Dependiendo del shell, readno leerá nada porque el shell ya ha leído y analizado todo el script, o readconsumirá líneas impredecibles en el script.

Solución simple:

bash -c "$(wget -O - http://example.com/my-script.sh)"

Solución más compleja, más para fines educativos que para ilustrar una buena solución para este escenario particular:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash
Gilles 'SO- deja de ser malvado'
fuente
Genial gracias. Esto es casi tan elegante.
Robin Winslow
2

La sustitución del proceso hará lo que quieras:

bash <(wget ...)

Dicho esto, tengo que cuestionar tu motivación aquí. Si controla el servidor web (y usa https), entonces quizás esto tenga sentido. Pero solo ejecutar un script desde Internet es muy arriesgado.

Lexelby
fuente
just running a script from the internet blind is very riskySí, sabemos que es arriesgado, pero las personas pueden optar por confiar en los scripts de ciertas organizaciones. Vea la discusión en los comentarios sobre la respuesta de @ Xen2050.
Robin Winslow
1

¿Hay algo malo con:

wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh

?

Xen2050
fuente
Porque entonces tengo que crear un archivo. Quiero decir que funcionaría, es un poco desordenado.
Robin Winslow
1
Cierto. Aunque esa es una buena razón para usar /tmp, muchos programas usan archivos temporales. Me cansaría de ejecutar cualquier script descargado de inmediato sin echar un vistazo primero ...
Xen2050
Bueno, esa es tu decisión. Muchos proyectos ofrecen estas frases , por ejemplo , Docker , ohmyzsh y otras que no recuerdo en este momento. En este caso, es un script de configuración que quiero ejecutar en sistemas nuevos desde mi propio repositorio. No estoy demasiado preocupado por su contenido, como lo escribí.
Robin Winslow
3
Estoy pensando en que alguien más encuentre esta pregunta (un usuario totalmente nuevo quizás) podría no saber nada mejor.
Xen2050