कैसे कनेक्शन sftp कनेक्शन के लिए पाइप करने के लिए?


9

ftp put "|..." "remote-file.name"एक ftp कनेक्शन के लिए डेटा पाइप करने के लिए कमांड का समर्थन करता है । क्या Sftp के लिए कुछ समान उपलब्ध है?

Sftp में मुझे निम्न त्रुटि मिलती है:

sftp 'jmw@backupsrv:/uploads'
sftp> put "| tar -cx /storage" "backup-2012-06-19--17-51.tgz"
stat | tar -cv /storage: No such file or directory

Sftp क्लाइंट के ऊपर स्पष्ट रूप से कमांड निष्पादित नहीं करता है।

मैं सीधे sftp फाइल स्ट्रीम को पुनर्निर्देशित करने के लिए पाइप कमांड का उपयोग करना चाहता हूं। (क्योंकि sftp सर्वर पर अपलोड करने से पहले एक ही डिस्क पर एक बैकअप फ़ाइल बनाने के लिए पर्याप्त जगह नहीं बची है।)


1
मैंने इसके लिए एक एफआईएफओ का उपयोग करने के बारे में सोचा, लेकिन न तो एसएफटीपी और न ही एससीपी एक एफआईएफओ से पढ़ेंगे।
टॉम एंडरसन

1
यह भी अच्छा विचार है, यह मेरा है: qxs.ch/2012/07/05/sftp-upload-tool
JMW

जवाबों:


4

मुझे इस समस्या का हल निकालने में बहुत मज़ा आया। इसके लिए दोनों मशीनों पर टूल nc (netcat) और SSH (SFTP की जरूरत नहीं है) की आवश्यकता होती है।

इस उदाहरण में, मैं उस मशीन को कॉल करूंगा जिसके पास डेटा है जिसे लाइनक्स-ए का बैकअप लेने की आवश्यकता है, और जिस मशीन को बैकअप लिनक्स-बी प्राप्त करने की आवश्यकता है।

Linux-a पर, netcat को एक पोर्ट पर सुनें (मुझे 2000 लगे) और इसे एक फाइल पर रीडायरेक्ट करें। यह बस वहां बैठेगा और तब तक इंतजार करेगा जब तक कि उस बंदरगाह पर कुछ न हो जाए।

[kenny@linux-b /var/backups]$ nc -l 2000 > backup.tgz

Linux-b पर, linux-a के लिए एक ssh टनल को खोलें, मैंने फिर से पोर्ट 2000 का उपयोग किया। यह आपके द्वारा TCPH 2000 में लोकलहोस्ट पर TCP पोर्ट 2000 में linux-a, जहां netcat सुन रहा है, पर कुछ भी रीडायरेक्ट करेगा।

[kenny@linux-a /var/data]$ ssh -L 2000:localhost:2000 -CfN linux-b

अब टार आर्काइव बनाएं, लेकिन आउटपुट को स्टडआउट (उपयोग -) के लिए भेजें और इसे कुछ कम्प्रेशन के लिए gzip पर पाइप करें। अब इसे एक और नेटकैट पर पाइप करें जो इसे पोर्ट 2000 पर टीसीपी पर लोकलहोस्ट को भेजता है।

[kenny@linux-a /var/data]$ tar cf - important-data | gzip -fc | nc localhost 2000

हमारा काम हो गया! Linux-b पर netcat अब सुन नहीं रहा है, और एक नई फ़ाइल बनाई गई है। सबसे अच्छी बात यह है कि टार आर्काइव को कभी भी लिनक्स-ए की हार्ड डिस्क पर नहीं रखा गया था।

[kenny@linux-b /var/backups]$ file backup.tgz 
backup.tgz: gzip compressed data, from Unix, last modified: Thu Jul  5 13:48:03 2012

मुझे पता है कि यह वास्तव में आपके द्वारा पूछे गए सवाल के बारे में नहीं है, लेकिन अगर आपके पास नेटकाट उपलब्ध है, तो यह आपकी समस्या का एक व्यावहारिक समाधान है।

संपादित करें: मैं एक बात भूल गया: यदि आप इन निर्देशों का पालन करते हैं, तो आपके पास अभी भी SSH सुरंग होगी, जो linux-a पर तैरती रहेगी। पता करें कि प्रक्रिया आईडी क्या है और इसे मार दें।

[kenny@linux-a /var/data]$ ps -ef | grep "ssh -L"
kenny     5741     1  0 13:40 ?        00:00:00 ssh -L 2000:localhost:2000 -CfN linux-b
kenny     5940  3360  0 14:13 pts/1    00:00:00 grep --color=auto ssh -L
[kenny@linux-a /var/data]$ kill 5741

3
मुझे यह पसंद है, लेकिन 2 समस्याएं हैं: sftponly उपयोगकर्ता आमतौर पर पोर्ट फ़ॉरवर्डिंग का उपयोग नहीं कर सकते हैं और sftponly उपयोगकर्ता उन sftp सर्वर पर nc तक नहीं पहुँच सकते (याद रखें कि उनके पास ssh एक्सेस नहीं है)
JMW

1
यह पूरी तरह से वैध आलोचना है।
केनी रस्साचर

ऑफ-टॉपिक, लेकिन इस पोस्ट में "द प्रेस्टीज" का स्क्रीन शॉट क्यों लगाया गया है?
Rilindo

4

जैसा कि आप इस प्रश्न के लिए googling द्वारा खोजा गया पहला परिणाम है और इसका उल्लेख पहले ही नहीं किया गया है, जो समाधान मैं यहां पाया गया उसे जोड़ूंगा:

आप इसके लिए कर्ल sftp कार्यान्वयन का उपयोग कर सकते हैं। जैसा कि कर्ल शायद पहले से ही बहुत सारे सिस्टम पर स्थापित है जो कस्टम क्लाइंट का उपयोग करके समाधान के लिए पसंद किया जा सकता है।

उदाहरण का उपयोग:

pg_dump -d database | pigz -1 | curl -u username -T - sftp://sftpserver/folder/dbbackup.sql.gz

curl.ssh/known_hostsकुंजी सत्यापन के लिए अपनी फ़ाइल का उपयोग करता है । यदि आपका ssh क्लाइंट नए एन्क्रिप्शन मानकों का उपयोग नहीं करता है, तो यह कर्ल में उपयोग की गई लाइब्रेरी द्वारा समर्थित नहीं है

इसे ठीक करने के लिए आप निम्नलिखित कमांड का उपयोग करके अन्य मुख्य प्रकारों को ज्ञात होस्ट फ़ाइल में जोड़ सकते हैं:

ssh-keyscan sftpserver >> ~/.ssh/known_hosts

या आप -kझंडे का उपयोग करके कुंजी सत्यापन को अक्षम कर सकते हैं (हालांकि मैं इसकी अनुशंसा नहीं करूंगा)


2

output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command' एक विकल्प है, यदि आपके दूरस्थ उपयोगकर्ता के पास एक वैध शेल है।


5
यह sftp नहीं है !
जिरीब

3
@JiriXichtkniha नहीं, यह नहीं है, हालांकि SFTP को लगभग हमेशा आपके SSH सर्वर के सबसिस्टम के रूप में लागू किया जाता है, और यह कार्यक्षमता का सबसे निकटतम एनालॉग है जिसे मैं प्रश्न से अनुरोध किया जा रहा हूं (SFTP के माध्यम से पाइप डेटा एक प्रोग्राम द्वारा नियंत्रित किया जा सकता है। दूसरे सिरे पर)। कभी-कभी जवाब "आप गलत उपकरण का उपयोग कर रहे हैं - इसके thisबजाय करें।" - यह मुझे उन समयों में से एक के रूप में प्रभावित करता है।
voretaq7

2
sftp प्रोटोल है, और ssh के माध्यम से पाइपिंग से अलग है, बस! यदि आपका दूरस्थ भाग केवल SFTP होगा तो आपका सुझाव काम नहीं करेगा।
जिरीब

1
मुझे ssh उपयोगकर्ता के रूप में लॉगिन करने की अनुमति नहीं है
JMW

1
@JMW उस मामले में जहाँ तक मुझे पता है कि आप यहाँ बहुत अच्छी तरह से खराब हो चुके हैं - मैंने कभी भी sftp का कोई संस्करण नहीं देखा है जो रिमोट सिस्टम पर कमांड को पाइप करने का समर्थन करता है (शायद इसलिए कि यह किसी को अंदर जाने से Sएक्यूरेट बिट को हरा देगा । आपकी स्थिति जो वैसे भी शेल रन प्रोग्राम नहीं है)। हालांकि मैं गलत हो सकता है - मैं ज्यादातर ओपनएसएसएच में एसएफटीपी कार्यक्षमता से परिचित हूं और मालिकाना एसएसएच सर्वर सन शिप करता था ...
voretaq7

1

voretaq7 ने बताया कि, sftp क्लाइंट उपयोगकर्ताओं के लिए पाइप किए गए डेटा ट्रांसफर का समर्थन नहीं करता है, जिसे सर्वर से कनेक्ट करने के लिए केवल sftp का उपयोग करने की अनुमति है।

सौभाग्य से, वहाँ libssh2 है, जो sftp का समर्थन करता है। इसलिए हमें libssh2 का उपयोग करते हुए 2 अन्य ग्राहकों की आवश्यकता है, जिसे मैंने कहा है:

  • sftp_stdin_upload (sftp सर्वर पर अपलोड करने के लिए)
  • sftp_stdout_download (sftp सर्वर से डाउनलोड करने के लिए)

स्रोत कोड निम्न URL के अंतर्गत पाया जा सकता है: http://www.qxs.ch/2012/07/05/sftp-upload-tool/


क्योंकि मैं libssh2 प्रोग्रामिंग में अनुभवी नहीं हूं, इसलिए मैं स्रोत कोड के लिए किसी भी प्रतिक्रिया के लिए खुश हूं।


मेरे लिए काम नहीं करता है :-( / usr / bin / ld: libssh2-1.4.2.2 / src / .libs / libssh2.a (जाना जाता है।): प्रतीक के लिए अपरिभाषित संदर्भ 'EVP_sha1' / usr / lib / libcrypto। so.1.0.0: सिंबल जोड़ने में त्रुटि: DSO कमांड लाइन से गायब है collect2: error: ld लौटकर 1 निकास स्थिति
Tobixen

इस कोड को सिर्फ POC का दर्जा प्राप्त है। इसे अपने दम पर ठीक करने के लिए स्वतंत्र महसूस करें। :-)
JMW
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.