Ada perbedaan praktis.
curl -sSL https://get.docker.com/ | sh
dimulai curl
dan sh
pada saat yang sama, menghubungkan output curl
dengan input sh
. curl
akan melakukan pengunduhan (kurang-lebih) secepat sh
dapat menjalankan skrip. Server dapat mendeteksi penyimpangan dalam pengaturan waktu dan menyuntikkan kode berbahaya yang tidak terlihat saat hanya mengunduh sumber daya ke dalam file atau buffer atau saat melihatnya di browser.
Di sh -c "$(curl -sSL https://get.docker.com/)"
, curl
dijalankan dengan ketat sebelum sh
dijalankan. Seluruh konten sumber daya diunduh dan diteruskan ke shell Anda sebelum sh
dimulai. Shell Anda hanya dimulai sh
ketika curl
telah keluar, dan meneruskan teks sumber daya ke sana. Server tidak dapat mendeteksi sh
panggilan; itu hanya dimulai setelah koneksi berakhir. Ini mirip dengan mengunduh skrip ke dalam file terlebih dahulu.
(Ini mungkin tidak relevan dalam kasus buruh pelabuhan, tetapi mungkin masalah secara umum dan menyoroti perbedaan praktis antara kedua perintah.)
vulnerable to server-side detection
frasa. Ini mengarah ke posting blog yang menjelaskan dengan sangat rinci bagaimana mereka mencapainya. TL; DR: tidurlah di skrip Anda dan amati keterlambatan penerimaan di server.Saya percaya bahwa mereka praktis identik. Namun, ada beberapa kasus langka di mana mereka berbeda.
$(cmd)
diganti dengan hasilcmd
. Jika panjang perintah hasil melebihi nilai panjang argumen maksimum yang dikembalikan olehgetconf ARG_MAX
, itu akan memotong hasilnya, yang dapat menghasilkan hasil yang tidak dapat diprediksi.Opsi pipa tidak memiliki batasan ini. Setiap garis output dari
curl
perintah akan dieksekusi olehbash
ketika tiba dari pipa.Tetapi ARG_MAX biasanya dalam kisaran 256.000 karakter. Untuk pemasangan buruh pelabuhan, saya akan percaya diri menggunakan kedua metode ini. :-)
sumber
ARG_MAX
, bash membatasi argumen individu ke 131072 byte pada sistem saya, ketikagetconf ARG_MAX
dicetak2097152
. Tapi bagaimanapun juga, kesalahan atau pemotongan, itu tidak akan berhasil.Di
curl -sSL https://get.docker.com/ | sh
:Kedua perintah,
curl
dansh
, akan mulai pada saat yang sama, di masing-masing subkulitSTDOUT dari
curl
akan diteruskan sebagai STDIN untuksh
(ini adalah apa pipa|
, lakukan)Sedangkan di
sh -c "$(curl -sSL https://get.docker.com/)"
:Substitusi perintah
$()
,, akan dieksekusi pertama yaitucurl
dijalankan pertama kali dalam sebuah subkulitSubstitusi perintah
$()
,, akan digantikan oleh STDOUT daricurl
sh -c
(non-interaktif, shell non-login) akan menjalankan STDOUT daricurl
sumber
Salah satu perbedaan antara keduanya (diambil dari jawaban lain di web) adalah bahwa jika Anda tidak mengunduh seluruh skrip sekaligus, itu bisa memotong setengah jalan melalui skrip pada titik yang tidak diketahui dan mengubah arti perintah menjadi dieksekusi. Jadi sepertinya mengunduh seluruh file terlebih dahulu dan kemudian mengevaluasinya akan lebih baik.
sumber