Berikut adalah versi modifikasi dari jawaban Willie Wheeler yang mentransfer file melalui tar tetapi juga mendukung pemberian kata sandi ke sudo pada host jarak jauh.
(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
| ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
Sedikit sihir ekstra di sini adalah opsi -S untuk sudo. Dari halaman manual sudo:
-S, --stdin Tulis prompt ke kesalahan standar dan baca kata sandi dari input standar daripada menggunakan perangkat terminal. Kata sandi harus diikuti oleh karakter baris baru.
Sekarang kita benar-benar ingin output tar untuk disalurkan ke ssh dan yang mengarahkan kembali stdin ssh ke stdout tar, menghapus cara apa pun untuk memasukkan kata sandi ke sudo dari terminal interaktif. (Kita bisa menggunakan fitur ASKPASS sudo pada ujung jarak jauh tetapi itu adalah cerita lain.) Namun kita dapat memasukkan kata sandi ke sudo dengan menangkapnya terlebih dahulu dan menambahkannya ke output tar dengan melakukan operasi-operasi dalam subkulit dan menyalurkan output dari subshell menjadi ssh. Ini juga memiliki keuntungan tambahan karena tidak meninggalkan variabel lingkungan yang berisi kata sandi kami menggantung di shell interaktif kami.
Anda akan melihat saya tidak menjalankan 'baca' dengan opsi -p untuk mencetak prompt. Ini karena prompt kata sandi dari sudo dengan mudah diteruskan kembali ke stderr shell interaktif kami melalui ssh. Anda mungkin bertanya-tanya "bagaimana eksekusi sudo mengingat itu berjalan di dalam ssh di sebelah kanan pipa kami?" Ketika kita menjalankan banyak perintah dan menyalurkan output dari satu ke yang lain, shell induk (shell interaktif dalam kasus ini) mengeksekusi setiap perintah dalam urutan segera setelah mengeksekusi sebelumnya. Karena setiap perintah di belakang pipa dieksekusi, shell induk menempel (mengarahkan) stdout sisi kiri ke stdin sisi kanan. Output kemudian menjadi input saat melewati proses.
$ (stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) | ssh
remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
[sudo] password for bruce:
[1]+ Stopped ( stty -echo; read passwd; stty echo; echo
$passwd; tar -cz foo.* ) | ssh remote_host "sudo -S bash -c \"tar -C
/var/www/ -xz; echo\""
$ pstree -lap $$
bash,7168
├─bash,7969
├─pstree,7972 -lap 7168
└─ssh,7970 remote_host sudo -S bash -c "tar -C /var/www/ -xz; echo"`
Shell interaktif kami adalah PID 7168, subshell kami adalah PID 7969 dan proses ssh kami adalah PID 7970.
Satu-satunya kelemahan adalah bahwa membaca akan menerima input sebelum sudo punya waktu untuk mengirimkan kembali prompt itu. Pada koneksi cepat dan host jarak jauh cepat Anda tidak akan melihat ini tetapi Anda mungkin jika salah satu lambat. Penundaan apa pun tidak akan memengaruhi kemampuan untuk memasukkan prompt; mungkin saja muncul setelah Anda mulai mengetik.
Catatan saya hanya menambahkan entri file host untuk "remote_Host" ke mesin lokal saya untuk demo.