Il y a une différence pratique.
curl -sSL https://get.docker.com/ | sh
démarre curl
et sh
en même temps, connecter la sortie de curl
avec l'entrée de sh
. curl
exécutera avec le téléchargement (à peu près) aussi vite que sh
peut exécuter le script. Le serveur peut détecter les irrégularités dans le timing et injecter du code malveillant non visible lors du simple téléchargement de la ressource dans un fichier ou un tampon ou lors de sa visualisation dans un navigateur.
Dans sh -c "$(curl -sSL https://get.docker.com/)"
, curl
est exécuté strictement avant l' sh
exécution de. Tout le contenu de la ressource est téléchargé et transmis à votre shell avant le sh
démarrage de. Votre shell ne démarre qu'à la sh
fin curl
et lui transmet le texte de la ressource. Le serveur ne peut pas détecter l' sh
appel; il n'est démarré qu'après la fin de la connexion. Cela revient à télécharger le script dans un fichier en premier.
(Cela peut ne pas être pertinent dans le cas du docker, mais cela peut être un problème en général et met en évidence une différence pratique entre les deux commandes.)
vulnerable to server-side detection
phrase. Cela mène à un article de blog qui explique en détail comment ils y parviennent. TL; DR: mettez un sommeil dans votre script et observez le retard de réception sur le serveur.Je pense qu'ils sont pratiquement identiques. Cependant, il existe de rares cas où ils sont différents.
$(cmd)
se substitue aux résultats decmd
. Si la longueur de cette commande de résultat dépasse la valeur de longueur d'argument maximale renvoyée pargetconf ARG_MAX
, elle tronquera le résultat, ce qui peut entraîner des résultats imprévisibles.L'option pipe n'a pas cette limitation. Chaque ligne de sortie de la
curl
commande sera exécutée parbash
lorsqu'elle arrive du tuyau.Mais ARG_MAX est généralement dans la plage de 256 000 caractères. Pour une installation de docker, je serais confiant en utilisant l'une ou l'autre méthode. :-)
la source
ARG_MAX
, bash limite un argument individuel à 131072 octets sur mon système, lors de l'getconf ARG_MAX
impression2097152
. Mais de toute façon, erreur ou troncature, cela ne fonctionnerait pas.Dans
curl -sSL https://get.docker.com/ | sh
:Les deux commandes,
curl
etsh
, démarreront en même temps, dans les sous-coques respectivesLe STDOUT de
curl
sera passé en tant que STDIN àsh
(c'est ce que fait le tuyau ,,|
fait)Alors qu'en
sh -c "$(curl -sSL https://get.docker.com/)"
:La substitution de commande,,
$()
sera exécutée en premier c'estcurl
-à- dire sera exécutée en premier dans un sous-shellLa substitution de commande
$()
, sera remplacée par le STDOUT decurl
sh -c
(shell non interactif, sans connexion) exécutera le STDOUT à partir decurl
la source
Une différence entre les deux (tirée d'autres réponses sur le Web) est que si vous ne téléchargez pas le script en entier à la fois, il pourrait couper à mi-chemin du script à un moment inconnu et changer la signification de la commande à réalisé. Il semble donc que le téléchargement du fichier entier puis l'évaluation soit préférable.
la source