`カール| sh`と`sh -c "$(curl)"`?

`カール| sh`と`sh -c

たとえば、Dockerをインストールする簡単な方法は次のとおりです。

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

ただし、次の内容も見たことがあります(Dockerの例を使用)。

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

機能的には同等のように見えますが、他のものを使用する理由はありますか?それともこれは単に好み/美学ですか?

(不明なソースでスクリプトを実行するときは非常に注意する必要があることは注目に値します。)

ベストアンサー1

実質的な違いがあります。

curl -sSL https://get.docker.com/ | shの出力をの入力に接続curlし始めます。ダウンロードはおおよそスクリプトの実行速度で行われます。サーバーは次のことができます。shcurlshcurlshタイミングの不規則性を検出リソースを単にファイルやバッファにダウンロードしたり、ブラウザで表示したときに目に見えないマルウェアを挿入します。

では、sh -c "$(curl -sSL https://get.docker.com/)"runの前に厳密に実行してくださいcurl。始める前にshリソースの内容全体がダウンロードされ、シェルに渡されます。shシェルは終了sh時にのみ開始され、curlリソーステキストを渡します。サーバーはsh呼び出しを検出できず、接続が終了した後にのみ開始されます。これは、最初にスクリプトをファイルにダウンロードするのと似ています。

(これはdockerの状況とは関係がないかもしれませんが、一般的に問題になる可能性があり、2つのコマンド間の実際の違いを強調します。)

おすすめ記事