ต่อไปนี้เป็นคำตอบของ Willie Wheeler ที่แก้ไขแล้วซึ่งถ่ายโอนไฟล์ผ่าน tar แต่ยังรองรับการส่งผ่านรหัสผ่านไปยัง sudo บนรีโมตโฮสต์
(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
| ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
ความมหัศจรรย์เล็กน้อยที่นี่คือตัวเลือก -S เพื่อ sudo จากหน้า man sudo:
-S, - stdin เขียนพรอมต์ไปที่ข้อผิดพลาดมาตรฐานและอ่านรหัสผ่านจากอินพุตมาตรฐานแทนการใช้อุปกรณ์ปลายทาง รหัสผ่านจะต้องตามด้วยอักขระขึ้นบรรทัดใหม่
ตอนนี้เราต้องการให้ output ของ tar ถูกส่งไปยัง ssh และเปลี่ยนเส้นทาง stdin ของ ssh ไปยัง stdout of tar เอาวิธีใด ๆ ในการส่งรหัสผ่านไปยัง sudo จากเทอร์มินัลเชิงโต้ตอบ (เราสามารถใช้คุณสมบัติ ASKPASS ของ sudo บนรีโมตปลายทาง แต่เป็นอีกเรื่องหนึ่ง) เราสามารถรับรหัสผ่านไปยัง sudo ได้โดยการจับภาพล่วงหน้าและเตรียมไว้ในเอาต์พุต tar โดยดำเนินการเหล่านั้นใน subshell และ piping output ของ subshell เป็น ssh สิ่งนี้ยังมีข้อได้เปรียบเพิ่มเติมคือไม่ทิ้งตัวแปรสภาพแวดล้อมซึ่งมีรหัสผ่านของเราห้อยอยู่ในเชลล์เชิงโต้ตอบของเรา
คุณจะสังเกตเห็นว่าฉันไม่ได้ 'อ่าน' ด้วยตัวเลือก -p เพื่อพิมพ์พรอมต์ เนื่องจากรหัสผ่านจาก sudo นั้นถูกส่งกลับไปยัง stderr ของเชลล์แบบโต้ตอบของเราผ่าน ssh คุณอาจสงสัยว่า "sudo ทำงานอย่างไรเนื่องจากมันทำงานภายใน ssh ทางด้านขวาของ pipe ของเรา" เมื่อเรารันหลายคำสั่งและไพพ์เอาท์พุทของหนึ่งไปยังอีกเชลล์หลัก (เปลือกโต้ตอบในกรณีนี้) ดำเนินการแต่ละคำสั่งในลำดับทันทีหลังจากดำเนินการก่อนหน้านี้ เนื่องจากแต่ละคำสั่งที่อยู่เบื้องหลังไพพ์จะถูกดำเนินการเชลล์พาเรนต์จะแนบ (เปลี่ยนทิศทาง) stdout ของด้านซ้ายมือไปยัง stdin ของด้านขวามือ จากนั้นเอาต์พุตจะกลายเป็นอินพุตเมื่อผ่านกระบวนการ
$ (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"`
เชลล์แบบโต้ตอบของเราคือ PID 7168, subshell ของเราคือ PID 7969 และกระบวนการ ssh ของเราคือ PID 7970
ข้อเสียเปรียบเพียงอย่างเดียวคือการอ่านจะยอมรับอินพุตก่อนที่ sudo จะมีเวลาในการส่งคืนพร้อมท์ ในการเชื่อมต่อที่รวดเร็วและโฮสต์ระยะไกลที่รวดเร็วคุณจะไม่สังเกตเห็นสิ่งนี้ แต่คุณอาจทำอย่างใดอย่างหนึ่งหากช้า ความล่าช้าใด ๆ จะไม่ส่งผลกระทบต่อความสามารถในการเข้าสู่พรอมต์ มันอาจปรากฏขึ้นหลังจากที่คุณเริ่มพิมพ์
หมายเหตุฉันเพิ่งเพิ่มรายการไฟล์โฮสต์สำหรับ "remote_Host" ลงในเครื่องของฉันเพื่อการสาธิต