यहां विली व्हीलर के उत्तर का एक संशोधित संस्करण है जो फ़ाइल को टार के माध्यम से स्थानांतरित करता है, लेकिन रिमोट होस्ट पर 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\""
थोड़ा अतिरिक्त जादू यहाँ -So विकल्प के लिए है। सुडो मैन पेज से:
-S, --stdin मानक त्रुटि का संकेत लिखें और टर्मिनल डिवाइस का उपयोग करने के बजाय मानक इनपुट से पासवर्ड पढ़ें। पासवर्ड को एक नए वर्ण द्वारा अनुसरण किया जाना चाहिए।
अब हम वास्तव में चाहते हैं कि टार का आउटपुट ssh में पाइप किया जाए और जो ssh के स्टैड को टार टाउटआउट में रीडायरेक्ट करता है, इंटरेक्टिव टर्मिनल से पासवर्ड को sudo में पास करने के लिए किसी भी तरह से हटा देता है। (हम रिमोट के अंत में sudo के ASKPASS फीचर का उपयोग कर सकते हैं, लेकिन यह एक और कहानी है।) हम पासवर्ड को sudo में प्राप्त कर सकते हैं, हालांकि इसे पहले से कैप्चर करके और इसे एक सबशेल में उन ऑपरेशनों को निष्पादित करके और आउटपुट को पाइपिंग करके टार आउटपुट में प्रीपेड कर सकते हैं। सब्स्क्राइब ssh में। यह भी हमारे इंटरैक्टिव खोल में हमारे पासवर्ड झूलने वाले एक पर्यावरण चर नहीं छोड़ने का अतिरिक्त लाभ है।
आप देखेंगे कि मैंने शीघ्र छापने के लिए -p विकल्प के साथ 'रीड' निष्पादित नहीं किया था। इसका कारण यह है कि sudo से पासवर्ड प्रॉम्प्ट ssh के माध्यम से हमारे इंटरेक्टिव शेल के stderr में आसानी से वापस चला जाता है। आपको आश्चर्य हो सकता है कि "सुडो को कैसे अंजाम दिया जाता है, यह हमारे पाइप के दाईं ओर ssh के अंदर चल रहा है?" जब हम कई कमांड निष्पादित करते हैं और एक के आउटपुट को दूसरे में पाइप करते हैं, तो मूल शेल (इस मामले में इंटरेक्टिव शेल) प्रत्येक कमांड को पिछले निष्पादित करने के तुरंत बाद अनुक्रम में निष्पादित करता है। जैसा कि एक पाइप के पीछे प्रत्येक कमांड को निष्पादित किया जाता है पैरेंट शेल संलग्न करता है (रीडायरेक्ट) बाएं-हाथ की तरफ स्टडआउट दाएं-हाथ की तरफ। आउटपुट तब इनपुट बन जाता है क्योंकि यह प्रक्रियाओं से गुजरता है।
$ (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 है, हमारा सबस्क्रिप्शन PID 7969 है और हमारी ssh प्रक्रिया PID 7970 है।
एकमात्र दोष यह है कि रीड इनपुट को स्वीकार करेगा इससे पहले कि सूडो के पास वापस भेजने का समय है, यह शीघ्र है। एक तेज़ कनेक्शन और तेज़ दूरस्थ होस्ट पर आप इसे नोटिस नहीं करेंगे, लेकिन यदि धीमा है तो आप इसे देख सकते हैं। कोई भी देरी शीघ्र में प्रवेश करने की क्षमता को प्रभावित नहीं करेगी; आपके द्वारा लिखना प्रारंभ करने के बाद यह बस दिखाई दे सकता है।
नोट मैंने केवल डेमो के लिए अपने स्थानीय मशीन में "रिमोट_होस्ट" के लिए एक होस्ट फ़ाइल प्रविष्टि जोड़ी है।