@Jakuje से जवाब के साथ समस्या है: यह केवल के साथ काम करता सॉकेट , लेकिन आप नहीं कर सकते हैं उपयोगकर्ता मानक उम्मीद यूनिक्स उपकरण फ़ाइलें उन लोगों के साथ:
ssh -R/tmp/sock.remote:/tmp/sock.local "$HOST" 'LANG=C cat >/tmp/sock.remote'
bash: /tmp/sock.remote: ऐसा कोई उपकरण या पता नहीं
इसके अलावा समस्या यह है कि स्थानीय सॉकेट फ़ाइल को दूरस्थ होस्ट पर हटाया नहीं गया है; जब आप एक ही कमांड चलाते हैं, तो आपको एक चेतावनी मिलती है और सॉकेट फिर से सही तरीके से नहीं बनाया जाता है। आप उस पुराने सॉकेट को अनलिंक -o StreamLocalBindUnlink=yes
करने का विकल्प दे सकते हैं ssh
, लेकिन मेरे परीक्षणों में यह पर्याप्त नहीं था; आपको उस विकल्प को काम करने के sshd_config
लिए सम्मिलित StreamLocalBindUnlink=yes
करना होगा।
लेकिन आप फ़ाइल हस्तांतरण के लिए अग्रेषित स्थानीय सॉकेट का उपयोग करने के लिए UNIX लोकल सॉकेट ( यह पर्याप्त नहीं है!) का समर्थन करने वाले किसी अन्य समान उपकरण का उपयोग socat
या कर सकते हैं :netcat
netcat-traditional
# start local process listening on local socket, which receives the data when ssh opens the connections and saves it to a local file
nc -l -N -U /tmp/sock.local >/tmp/file.local &
# connect to remote $HOST and pipe the remote file into the remote socket end
ssh \
-o ExitOnForwardFailure=yes \
-o StreamLocalBindUnlink=yes \
-R /tmp/sock.remote:/tmp/sock.local \
"$HOST" \
'nc -N -U /tmp/sock.remote </tmp/file.remote'
आप इंटरेक्टिव कमांड भी चला सकते हैं, जिस स्थिति में आपको ssh -t
TTYs आवंटित करने के लिए उपयोग करना चाहिए ।
इस समाधान के साथ समस्या यह है कि आपको UNIX लोकल सॉकेट्स के रास्तों को हार्ड-कोड करना चाहिए: स्थानीय रूप से यह उतनी समस्या नहीं है जितना कि आप $$
इसे अद्वितीय प्रक्रिया या उपयोगकर्ता को एक अस्थायी निर्देशिका बनाने के लिए पथ में शामिल कर सकते हैं , लेकिन दूरस्थ-अंत में आप विश्व-लेखन योग्य निर्देशिका का उपयोग नहीं करते हैं /tmp/
जैसा कि मैं अपने उदाहरण में करता हूं। ssh
सत्र प्रारंभ होने पर निर्देशिका पहले से मौजूद होनी चाहिए । और सत्र बंद होने के बाद भी सॉकेट इनोड रहेगा, इसलिए "$ HOME / .ssh। $$" जैसी किसी चीज़ का उपयोग करने से समय के साथ आपकी निर्देशिका अव्यवस्थित हो जाएगी।
आप टीसीपी सॉकेट्स का उपयोग भी कर सकते हैं localhost
, जो आपको अपने फाइल सिस्टम को मृत इनोड्स के साथ अव्यवस्थित करने से बचाएगा, लेकिन यहां तक कि उनके साथ आपको अभी भी एक (अद्वितीय) अप्रयुक्त पोर्ट नंबर चुनने के लिए समस्या है। तो अभी भी आदर्श नहीं है। ( ssh
पोर्ट को गतिशील रूप से आवंटित करने के लिए कोड है, लेकिन मुझे दूरस्थ होस्ट पर उस जानकारी को पुनः प्राप्त करने का कोई तरीका नहीं मिला।)
शायद फ़ाइलों की प्रतिलिपि बनाने के लिए सबसे आसान समाधान का उपयोग करने ssh में निर्मित है कनेक्शन साझा करने कार्यक्षमता और एक करने के लिए scp
या sfrp
, जबकि अपनी इंटरैक्टिव सत्र अभी भी समानांतर में चल रहा है आदेश। फ़ाइल को ssh के साथ स्थानीय सिस्टम में वापस देखें ।
closefrom(STDERR_FILENO + 1)
ओपनएसएसएच स्रोत कोड के तहत विभिन्न कॉल दिए गए हैं । आप ऐसा करने की कोशिश कर रहे हैं जो यह मांग करता है।