İşte Willie Wheeler'ın yanıtını, dosyaları tar yoluyla aktaran, fakat aynı zamanda uzaktaki ana bilgisayarda sudo şifresinin iletilmesini destekleyen bir versiyonudur.
(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
| ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
Buradaki fazladan sihir biraz sudo seçeneği -S. Sudo man sayfasından:
-S, --stdin Komut istemini standart hataya yazın ve şifreyi terminal cihazı kullanmak yerine standart girişden okuyun. Şifreyi yeni bir satır karakteriyle takip etmelisiniz.
Şimdi aslında tar çıktısının ssh'ye aktarılmasını istiyoruz ve bu da ssh stdin'i tar stdout'a yönlendirerek şifreyi interaktif terminalden sudo'ya aktarmanın herhangi bir yolunu kaldırıyor. (Uzaktaki uçta sudo'nun ASKPASS özelliğini kullanabiliriz, ancak bu başka bir hikaye.) Şifreyi sudo içine alabiliriz, önceden yakalayarak ve bu işlemleri alt kabukta gerçekleştirerek ve çıktısını boruya alarak tar tar çıkışına hazırlayarak alabiliriz. ssh içine subshell. Bu ayrıca, etkileşimli kabuğumuza sarkan şifremizi içeren bir ortam değişkenini bırakmama avantajına da sahiptir.
İstemi yazdırmak için -p seçeneğiyle 'okuma' yapmadığımı fark edeceksiniz. Bunun nedeni, sudo'dan gelen şifre isteminin uygun bir şekilde ssh aracılığıyla etkileşimli kabuğumun stderr'ına geri geçirilmesidir. "Sudo'nun ssh içinde pipomuzun sağına doğru koşması şartıyla nasıl yürüttüğü veriliyor?" Diye merak edebilirsiniz. Birden fazla komut yürüttüğümüzde ve birisinin çıktısını bir diğerine geçirdiğimizde, üst kabuk (bu durumda etkileşimli kabuk), bir önceki komutu uyguladıktan hemen sonra sıradaki her komutu yürütür. Bir borunun arkasındaki her komut çalıştırıldığında, ana kabuk sol tarafın stdoutunu sağ tarafın stdinine tutturur (yönlendirir). Daha sonra çıktı süreçlerden geçerken girdi haline gelir.
$ (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"`
İnteraktif kabuğumuz PID 7168, alt kabuğumuz PID 7969 ve ssh işlemimiz PID 7970.
Tek dezavantajı, sudo'nun komut istemini geri göndermeye vakti gelmeden önce okumayı kabul etmesidir. Hızlı bir bağlantı ve hızlı bir uzak ana bilgisayarda bunu farketmeyeceksiniz, ancak ya yavaşsa da olabilir. Herhangi bir gecikme bilgi istemine girme yeteneğini etkilemeyecektir; sadece yazmaya başladığınızda görünebilir.
Not Demo için yerel makineme "remote_Host" için bir ana bilgisayar dosyası girişi ekledim.