Es gibt einen praktischen Unterschied.
curl -sSL https://get.docker.com/ | sh
startet curl
und verbindet sh
gleichzeitig den Ausgang von curl
mit dem Eingang von sh
. curl
Wird mit dem Download (ungefähr) so schnell wie sh
möglich ausgeführt. Der Server kann Unregelmäßigkeiten im Timing erkennen und schädlichen Code einschleusen, der nicht sichtbar ist, wenn die Ressource einfach in eine Datei oder einen Puffer heruntergeladen oder in einem Browser angezeigt wird.
In sh -c "$(curl -sSL https://get.docker.com/)"
, curl
ist streng laufen , bevor der sh
ausgeführt wird. Der gesamte Inhalt der Ressource wird heruntergeladen und an Ihre Shell übergeben, bevor die sh
gestartet wird. Ihre Shell startet erst, sh
wenn sie beendet curl
wurde, und übergibt den Text der Ressource an sie. Der Server kann den sh
Anruf nicht erkennen . es wird erst gestartet, nachdem die Verbindung beendet ist. Dies ähnelt dem Herunterladen des Skripts in eine Datei.
(Dies ist im Docker-Fall möglicherweise nicht relevant, kann jedoch allgemein problematisch sein und zeigt einen praktischen Unterschied zwischen den beiden Befehlen auf.)
vulnerable to server-side detection
Phrase gesetzt. Es führt zu einem Blogbeitrag, der ausführlich erklärt, wie sie es erreichen. TL; DR: Machen Sie in Ihrem Skript eine Pause und beobachten Sie die Empfangsverzögerung auf dem Server.Ich glaube, dass sie praktisch identisch sind. Es gibt jedoch seltene Fälle, in denen sie unterschiedlich sind.
$(cmd)
wird durch die Ergebnisse von ersetztcmd
. Wenn die Länge dieses Ergebnisbefehls den von zurückgegebenen Wert für die maximale Argumentlänge überschreitetgetconf ARG_MAX
, wird das Ergebnis abgeschnitten, was zu unvorhersehbaren Ergebnissen führen kann.Die Pipe-Option hat diese Einschränkung nicht. Jede Ausgabezeile des
curl
Befehls wird ausgeführtbash
, sobald sie von der Pipe eingeht.ARG_MAX liegt jedoch normalerweise im Bereich von 256.000 Zeichen. Für eine Docker-Installation würde ich sicher sein, beide Methoden zu verwenden. :-)
quelle
ARG_MAX
, die Bash begrenzt ein einzelnes Argument auf 131072 Bytes auf meinem System, wenngetconf ARG_MAX
gedruckt wird2097152
. Aber wie auch immer, Fehler oder Kürzung, es würde nicht funktionieren.In
curl -sSL https://get.docker.com/ | sh
:Beide Befehle
curl
undsh
werden gleichzeitig in den jeweiligen Subshells gestartetDas STDOUT von
curl
wird als STDIN an übergebensh
(dies ist, was Pipe|
, tut)In Erwägung nachstehender Gründe
sh -c "$(curl -sSL https://get.docker.com/)"
:Die Befehlsersetzung
$()
wird zuerst ausgeführt, dhcurl
zuerst in einer Subshell ausgeführtDie Befehlsersetzung
$()
wird durch die STDOUT von ersetztcurl
sh -c
(nicht interaktive, nicht angemeldete Shell) führt das STDOUT von auscurl
quelle
Ein Unterschied zwischen den beiden besteht darin, dass, wenn Sie nicht das gesamte Skript auf einmal herunterladen, das Skript an einem unbekannten Punkt zur Hälfte unterbrochen und die Bedeutung des Befehls geändert werden könnte hingerichtet. Es scheint also besser zu sein, zuerst die gesamte Datei herunterzuladen und dann auszuwerten.
quelle