shell – ¿Cuál es la diferencia entre `curl | sh` y `sh -c" $ (curl) "`?

Pregunta:

Un método de instalación fácil para Docker (por ejemplo) es este:

curl -sSL https://get.docker.com/ | sh

Sin embargo, también he visto algunos que se ven así (usando el ejemplo de Docker):

sh -c "$(curl -sSL https://get.docker.com/)"

Parecen ser funcionalmente iguales, pero ¿hay alguna razón para usar uno sobre el otro? ¿O es solo una cuestión de preferencia / estética?

(Tenga en cuenta que tenga mucho cuidado al ejecutar un script de orígenes desconocidos).

Respuesta:

Hay una diferencia práctica.

curl -sSL https://get.docker.com/ | sh comienza curl y sh al mismo tiempo, conectando la salida de curl con la entrada de sh . curl llevará a cabo con la descarga (más o menos) tan rápido como sh puede ejecutar el script. El servidor puede detectar las irregularidades en el tiempo e inyectar código malicioso no visible cuando simplemente descarga el recurso en un archivo o búfer o cuando lo visualiza en un navegador.

En sh -c "$(curl -sSL https://get.docker.com/)" , curl se ejecuta estrictamente antes de que se ejecute sh . Todo el contenido del recurso se descarga y pasa a su shell antes de que se inicie sh . Su shell solo inicia sh cuando curl ha salido y le pasa el texto del recurso. El servidor no puede detectar la llamada sh ; solo se inicia después de que finaliza la conexión. Es similar a descargar primero el script en un archivo.

(Esto puede no ser relevante en el caso de la ventana acoplable, pero puede ser un problema en general y resalta una diferencia práctica entre los dos comandos).

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım