Shell
curl | 有什麼區別?sh
和 sh -c '$(curl)'
?
Docker 的一種簡單安裝方法(例如)是這樣的:
curl -sSL https://get.docker.com/ | sh
但是,我也看到了一些看起來像這樣的(使用 Docker 範例):
sh -c "$(curl -sSL https://get.docker.com/)"
它們在功能上似乎相同,但有理由使用其中一個嗎?或者它只是一種偏好/審美的東西?
(值得注意的是,在執行來自未知來源的腳本時要非常小心。)
有一個實際的區別。
curl -sSL https://get.docker.com/ | sh
開始curl
,sh
同時將 的輸出curl
與 的輸入連接起來sh
。curl
將與sh
執行腳本一樣快地執行下載(大致)。伺服器可以檢測到時間的不規則性,並註入在簡單地將資源下載到文件或緩衝區或在瀏覽器中查看時不可見的惡意程式碼。在
sh -c "$(curl -sSL https://get.docker.com/)"
,curl
在執行之前嚴格sh
執行。在啟動之前,資源的全部內容會被下載並傳遞到您的 shellsh
。您的 shell 僅sh
在curl
退出時啟動,並將資源的文本傳遞給它。伺服器無法檢測到sh
呼叫;它僅在連接結束後啟動。這類似於先將腳本下載到文件中。(這在 docker 案例中可能不相關,但一般來說可能是一個問題,並突出了兩個命令之間的實際差異。)