Crea un script y ejecútalo

Respuestas:

51

Cuidadoso

Antes de ejecutar el script, ¿confía en la persona que lo escribió?

Por ejemplo, ¿esperaba que el script contuviera esto?

echo "brain1" > /etc/hostname

Eso intentará cambiar su nombre de host.


Para referencia futura, si después de verificar que el script es correcto y no malicioso, puede ejecutarlo en una línea como esta:

wget -O - http://dl.dropbox.com/u/11210438/flockonus-stack.sh | bash

Pero descárguelo por separado y léalo antes de ejecutarlo por primera vez.

También tenga en cuenta que las indicaciones interactivas dentro del script descargado pueden no funcionar correctamente con este método.

Mikel
fuente
9
+1 por señalar las preocupaciones de seguridad (significativas) con esto. Asegúrese absolutamente de confiar en la fuente. Eso echo "brain1" > /etc/hostnamepodría ser tan fácil rm -rf /.
Christopher Cashell
2
+1 Gracias chicos, ese guión es mío, es seguro ... Me encantó la frase, pero tiene algunas líneas interactivas que no se ejecutaron ... no sé por qué.
Fabiano Soriani
1
Tus apt-get installlineas? Si apt-getinstalara alguna dependencia adicional, se lo preguntará, y si no puede, simplemente saldrá para estar seguro. Agregue todos los paquetes dependientes a los argumentos de la línea de comandos, o considere agregar -y, por ejemploapt-get -y install...
Mikel
El problema no está relacionado con las dependencias, tiene que ver con apt flushing stdin.
Zoredache
1
En realidad, no puede confiar en la fuente, incluso si "confía en la fuente" debido a los ataques de man in the middle. Dicho esto, las URL privadas aleatorias con scripts de bash deberían ser un vector de ataque lo suficientemente estrecho como para que nadie con la capacidad de llevarlo a cabo se preocupe lo suficiente como para hacerlo.
SpamapS
9

Scripts no interactivos

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

Tenga en cuenta que cuando utilice este método, los scripts interactivos no funcionarán.


Guiones interactivos

Para que los scripts interactivos funcionen, puede usar esto:

bash <(wget -qO- http://website.com/my-script.sh)

Scripts interactivos que deben ejecutarse como root

Advertencia: esto es extremadamente peligroso. No recomendado.

sudo su -c "bash <(wget -qO- http://website.com/my-script.sh)" root

Tenga en cuenta que no puede usarlo simplemente, sudo bashya que usarlo <(...)creará un archivo virtual y su descriptor de archivo no será accesible desde la instancia de root bash. Debe ejecutarse en el mismo usuario que necesita leer el archivo virtual, por lo que debe enviarse como su propio comando dentro del shell de usuarios raíz.

Nathan F.
fuente
1
Esta es la mejor respuesta. Cubre los aspectos importantes de la ejecución interactiva vs no interactiva vs privilegiada.
Leonid Makarov
5

Ese script es mío, es seguro ... Me encantó la frase, pero tiene algunas líneas interactivas que no se ejecutaron ... no sé por qué.

Cuando se ejecuta dpkg, llamado por apt-get, vacía stdin. Si está utilizando un comando como curl blah | bash, básicamente está enviando contenido de la página a bash a través de STDIN. Si uno de sus comandos es apt-get, luego se ejecuta, todo lo demás se eliminará.

El truco es usar un comando como este apt-get install --yes denyhosts </dev/null. Esto le da a apt-get una entrada diferente, y simplemente vacía / dev / null en lugar del resto de su script.

Si desea ver un ejemplo completo de instalación de algo a través de un script remoto, puede consultar este script para configurar denyhosts

Para el registro, prefiero curl sobre wget para esto, pero wget también debería estar bien.

Zoredache
fuente
Intenté con un script ficticio con algo interactivo, funcionó amigo ... No lo entiendo xD dl.dropbox.com/u/11210438/lala.sh
Fabiano Soriani
4
#!/bin/sh
if [ ! -f "/tmp/flockonus-stack.sh" ]
then
    wget -O /tmp/flockonus-stack.sh http://dl.dropbox.com/u/11210438/flockonus-stack.sh
fi

sh /tmp/flockonus-stack.sh
Lynxman
fuente
4

A todos estos ejemplos les falta un punto bastante importante. Si usa la URL http://dl.dropbox.com/u/11210438/flockonus-stack.sh, debe auditar el script cada vez que lo descargue, ya que puede ser modificado por cualquier persona en la ruta de red entre usted y Dropbox. Si cambia a http s : //dl.dropbox.com/u/11210438/flockonus-stack.sh , no tendrá esa fuente de inseguridad.

(Dropbox intenta redirigir la URL http a https, pero en el caso de un ataque a la red, wget nunca podría hablar con el Dropbox real, y nunca vería la redirección)

pde
fuente
2
Probablemente sea mejor dejarlo como un comentario sobre la pregunta, no como una respuesta, ya que no responde exactamente la pregunta. Todavía vale la pena señalar con seguridad!
Bill Weiss
2

Intente simplemente descargarlo como lo ha especificado con wget y luego ejecutarlo directamente. Puede ser elegante y usar variables para el script que desea descargar, etc., pero esto será suficiente.

Por ejemplo:

!#/bin/bash

#Change to temp directory
cd /tmp

#Download file using wget
wget http://dl.dropbox.com/u/11210438/flockonus-stack.sh

#Execute the file

sh flockonus-stack.sh
Brett
fuente
¿Cómo le diría a mi sistema que haga esto en el inicio?
Metallkiller