Piping skrip dengan "read" ke bash

10

Saya perlu untuk menjalankan script dengan pipa melalui bashdengan wget(bukan menjalankannya langsung dengan bash).

$ wget -O - http://example.com/my-script.sh | bash

Ini tidak berfungsi karena skrip saya memiliki readpernyataan di dalamnya. Untuk beberapa alasan ini tidak berfungsi saat mem-pip ke bash:

# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi

# `read` works directly
$ read -p "input: " var
input: <prompt>

# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$

Alih-alih meminta input:dan meminta nilai sebagaimana mestinya, perintah baca hanya akan dilewati bash.

Adakah yang tahu bagaimana saya bisa mengirim script readke pipa bash?

Robin Winslow
sumber

Jawaban:

16

readmembaca dari input standar. Tetapi input standar dari proses bash sudah diambil oleh skrip. Bergantung pada shell, entah readtidak akan membaca apa-apa karena shell sudah membaca dan mem-parsing seluruh skrip, atau readakan mengkonsumsi baris yang tidak terduga dalam skrip.

Solusi sederhana:

bash -c "$(wget -O - http://example.com/my-script.sh)"

Solusi yang lebih kompleks, lebih untuk tujuan pendidikan daripada menggambarkan solusi yang baik untuk skenario khusus ini:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Keren terima kasih. Ini hampir sama anggunnya.
Robin Winslow
2

Substitusi proses akan melakukan apa yang Anda inginkan:

bash <(wget ...)

Yang mengatakan, saya harus mempertanyakan motivasi Anda di sini. Jika Anda mengontrol server web (dan menggunakan https) maka mungkin ini masuk akal. Tapi menjalankan skrip dari internet blind sangat berisiko.

Lexelby
sumber
just running a script from the internet blind is very risky- ya kita tahu itu berisiko, tetapi orang dapat memilih untuk mempercayai skrip dari organisasi tertentu. Lihat diskusi dalam komentar pada jawaban @ Xen2050.
Robin Winslow
1

Apakah ada yang salah dengan:

wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh

?

Xen2050
sumber
karena saya harus membuat file. Maksud saya itu akan berhasil, itu hanya sedikit berantakan.
Robin Winslow
1
Benar. Meskipun itu alasan yang baik untuk digunakan /tmp, banyak program menggunakan file temp. Saya akan segera menjalankan skrip yang diunduh dengan segera tanpa melihatnya terlebih dahulu ...
Xen2050
Nah, itu panggilan Anda. Banyak proyek menawarkan one-liner ini, misalnya Docker , ohmyzsh dan lainnya yang tidak dapat saya ingat sekarang. Dalam hal ini, ini adalah skrip pengaturan yang ingin saya jalankan di sistem baru dari repositori saya sendiri. Saya tidak terlalu khawatir tentang isinya, seperti yang saya tulis.
Robin Winslow
3
Saya sedang memikirkan orang lain yang menemukan pertanyaan ini (mungkin pengguna yang sama sekali baru) mungkin tidak tahu yang lebih baik.
Xen2050