एक सक्रिय SSH सत्र पर एक फ़ाइल डाउनलोड करें


86

मैं एक सक्रिय SSH सत्र से एक फ़ाइल डाउनलोड करना चाहता हूं। कई मामलों में मैं शायद सिर्फ SFTP,, और अन्य का उपयोग कर सकता हूं scp, rsyncलेकिन कई बार ऐसे तरीके हैं जहां मैंने रिमोट सर्वर पर एक तरह से अनुमतियों को बढ़ाया है, मैं इन तरीकों का उपयोग नहीं कर सकता।

यदि आप यह समझने के लिए संघर्ष कर रहे हैं कि मेरा क्या मतलब है, तो कल्पना करें कि आप कुछ डाउनलोड करना चाहते थे /root/या /var/log/auth.log। रूट लॉगिन अक्षम है (क्योंकि हम बेवकूफ नहीं हैं)। आपको वह फाइल कैसे मिलेगी? इसे कहीं कम संरक्षित संरक्षित करें और फिर इसे स्थानांतरित करें? यह क्लूनी है। ऐसे परिदृश्य भी हैं जहां दूरस्थ पथ जटिल या अस्थायी है, या एक पथ भी नहीं है क्योंकि मैं दूरस्थ रूप से संग्रहीत दूरस्थ कमांड का आउटपुट चाहता हूं। दूर से स्टोर करें, फिर कॉपी करें? Clunk!

इन के संस्करणों को प्राप्त करने के लिए और भी कई क्लूनी तरीके हैं लेकिन एक आदर्श दुनिया में, मुझे रिमोट सर्वर से स्थानीय राइट एक्सेस का उपयोग करने के लिए कुछ समान होगा, जो मौजूदा SSH सत्र को एक नाली के रूप में उपयोग करता है। कुछ इस तरह (यह सिर्फ एक कलाकार की छाप है):

$oli@remote: cp /root/cheesecake /local/

और यह सिर्फ मेरे स्थानीय में दिखाई देता है cwd। और द्विदिश पहुँच एक बुरी बात नहीं होगी।


यह प्रश्न पूछे हुए मुझे आठ साल हो गए हैं और हमने क्लच की एक वास्तविक श्रेणी देखी है, लेकिन यह एक समस्या है कि मैं अभी भी कभी-कभार संघर्ष करता हूं।

मैंने प्रश्न को कुछ अधिक आदर्शवादी बना दिया है। मैं पूरी तरह से समझता हूं कि वर्तमान में एक सही जवाब नहीं हो सकता है। मेरे आदर्श के प्रति सभी अतीत और भविष्य के प्रयासों की सराहना की जाती है।


1
दिलचस्प सवाल! यह वास्तव में दिखाता है कि कैसे लोगों के विचारों को उनके द्वारा उपयोग किए जाने वाले साधनों द्वारा आकार देने के लिए समझदार है। zsshशायद zmodem की तरह वर्कफ़्लो के सबसे करीब है जो आपको याद हो सकता है।
पूलि

1
मैं वास्तव में हैरान हूं कि 8 उत्तरों के बाद भी, वास्तव में ऐसा करने का कोई तरीका नहीं है
एंडोलिथ

जवाबों:


34

आप zssh की जाँच करना चाहते हैं , जो ब्रह्मांड में उपलब्ध है, और इसलिए इसके साथ उपलब्ध है

sudo apt-get install zssh

आपको अपने ubuntu सर्वर और अपने क्लाइंट पर इसकी आवश्यकता है, लेकिन मूल रूप से जब zssh के साथ लॉग इन किया जाता है, तो आप बस 'ctrl- @' को हिट करते हैं और यह "फाइल ट्रांसफर मोड" लाता है, जो आपको फाइल को आपके पाइप में वापस भेजने की अनुमति देता है। क्लाइंट मशीन, या उन्हें क्लाइंट से सर्वर पर अपलोड करें।

हालाँकि, आपको sc-re या फिर एक नई विंडो खोलने की ज़रूरत नहीं है।

यदि आप ssh कीज़, और ssh एजेंट का उपयोग कर रहे हैं, तो आप आसानी से कर सकते हैं:

[enter]~[ctrl]-Z

जो ssh को बैकग्राउंड करेगा, और फिर बस scp $!:/whatever/whatever .'

एक बार फ़ाइल को हस्तांतरित किया जाता है, fgssh वापस पाने के लिए।

यदि आप ssh कुंजियों का उपयोग नहीं कर रहे हैं, तो आप अभी भी "ControlMaster" और "ControlPath" विकल्पों का उपयोग हाल के OpenSSh संस्करणों में जोड़ सकते हैं, लेकिन यह मुश्किल हो जाता है, आदमी ssh_config की जाँच करें


24

मान लें कि आप अपने डेस्कटॉप पर एक ssh सर्वर चला रहे हैं (इसके आस-पास के रास्ते हैं, लेकिन मुझे लगता है कि वे सभी जटिलता जोड़ते हैं, और संभवतः सुरक्षा समस्याएं हैं), आप रिवर्स ssh सुरंग स्थापित कर सकते हैं। देखें SSH आसानी से फाइल को लोकल सिस्टम में कॉपी करता है। unix.SE पर खत्म

  • Enter ~C Enter -R 22042:localhost:22 Enterअपने सर्वर से अपने डेस्कटॉप पर एक रिवर्स पोर्ट फॉरवर्डिंग बनाने के लिए टाइप करें (22042 1024 और 65534 के बीच कोई पोर्ट नंबर हो सकता है जो उपयोग में नहीं है)।
  • फिर डेस्कटॉप पर सर्वर पर अपने वर्तमान निर्देशिका में scp -P 22042 foo localhost:फ़ाइल fooको आपके घर पर कॉपी कर देगा ।
  • अब डेस्कटॉप पर फ़ाइल को अपनी वर्तमान निर्देशिका में Enter ~ Ctrl+ टाइप करके स्थानांतरित करें Z mv ~/foo . Enter fg Enter

Ssh एस्केप सीक्वेंस के साथ शुरू ~; टिल्ड को केवल एक नई रेखा के बाद पहचाना जाता है। ~ Ctrl+Zपृष्ठभूमि में ssh डालता है। ~Cएक कमांड लाइन में प्रवेश करता है जहां आप एक अग्रेषण बना या हटा सकते हैं।


1
एन्क्रिप्शन और कम्प्रेशन की 2 परतों का उपयोग करना थोड़ा कठिन है, इसीलिए मैंने "बैक लिंक" के लिए rsh या ftp का उपयोग करने का सुझाव दिया है।
जेएनसी

2
@JCC: इसके लिए अधिक सेटअप की आवश्यकता है: आपको एक rsh या ftp सर्वर स्थापित करना होगा, और सुनिश्चित करें कि इसका कॉन्फ़िगरेशन सुरक्षित है। नेटबुक पर भी एन्क्रिप्शन का ओवरहेड न्यूनतम है।
गिल्स

एक ssh- सर्वर डिफ़ॉल्ट रूप से स्थापित नहीं है। ;)
JanC

@JC: ssh का एक और फायदा यह है कि अगर आपने एजेंट को फॉरवर्ड करने में सक्षम किया है, तो आपको कॉपी करने के लिए पासवर्ड नहीं लिखना होगा। कंप्यूटिंग क्षमता से अधिक वर्कफ़्लो दक्षता।
गिल्स

आप (कुछ) अन्य सेवाओं के साथ भी ऐसा कुछ कर सकते हैं। किसी भी मामले में, कई समान समाधान हैं जो सभी में एक सुरंग
युक्त

10

मैं मानक ssh के साथ ऐसा करने का एक तरीका लेकर आया था। यह एक स्क्रिप्ट है जो वर्तमान ssh कनेक्शन को डुप्लिकेट करता है, दूरस्थ मशीन पर आपकी कार्यशील निर्देशिका को ढूँढता है और उस फ़ाइल को वापस कॉपी करता है जिसे आप स्थानीय मशीन में निर्दिष्ट करते हैं। इसे आपके ssh config में 2 बहुत छोटी लिपियों (1 रिमोट, 1 स्थानीय) और 2 लाइनों की आवश्यकता है। चरण इस प्रकार हैं:

  1. इन 2 पंक्तियों को अपने साथ जोड़ें ~/.ssh/config:

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    अब यदि आपके पास machineX open का ssh कनेक्शन है, तो आपको दूसरे को खोलने के लिए पासवर्ड की आवश्यकता नहीं होगी।

  2. नामक रिमोट मशीन पर 1-लाइन स्क्रिप्ट बनाएं ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. स्थानीय मशीन पर एक स्क्रिप्ट बनाएं जिसे ~ / .grab.sh कहा जाता है

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. और हड़पने के लिए एक उपनाम बनाएँ ( ~/.bashrcया जहाँ भी):

    alias grab=~/.grab.sh
    

बस, हो गया। अब यदि आप लॉग इन हैं machineX:/some/directory, तो बस एक नया टर्मिनल और टाइप करें

grab machineX filename

यह स्थानीय मशीन पर आपकी वर्तमान कार्यशील निर्देशिका में फ़ाइल डालता है। आप "हथियाने" के तीसरे तर्क के रूप में एक अलग स्थान निर्दिष्ट कर सकते हैं।

नोट: स्पष्ट रूप से दोनों लिपियों को "निष्पादन योग्य" होना चाहिए, अर्थात chmod u+x filename


दिलचस्प है, क्या आप बता सकते हैं कि यह कैसे काम करता है? क्या आप "पुट" फाइलों के समर्थन के साथ-साथ उन्हें हथियाने के लिए इसका विस्तार करने में सक्षम हैं?
पीटर गिब्सन

5

यदि आपकी क्लाइंट मशीन (जिस मशीन पर आप बैठे हैं) मशीन कहलाती है और जिस मशीन को आप वर्तमान में SSH'ed कहते हैं उसे मशीन B. मशीन कहा जाता है, आपके स्थानीय मशीन में SSHD रनिंग और पोर्ट 22 खुला होना चाहिए। फिर:

scp myfile machineA:

myfileमशीनबीए पर मेरे मशीनएए होम निर्देशिका के लिए मशीनबी पर प्रतियां । यह मानता है कि उपयोगकर्ता का पासवर्ड / पासवर्ड समान है।

scp myfile machineA:/newdir/newname

मशीन पर myfileएक मशीनबी की प्रतिलिपि /newdir/newnameबनाता है। यह मानता है कि उपयोगकर्ता का पासवर्ड / पासवर्ड समान है।

scp MachineA:/path/to/my/otherfile . 

otherfileमशीनएएए पर मेरी मशीनए निर्देशिका से कॉपी प्राप्त करता है और मशीनब मशीन ("डॉट" (।) वर्ण द्वारा मानक यूनिक्स फैशन में निर्दिष्ट) पर मेरी वर्तमान कार्यशील निर्देशिका में रखता है। यह मानता है कि उपयोगकर्ता का पासवर्ड / पासवर्ड समान है।

यदि उपयोगकर्ता / पासवर्ड समान नहीं हैं तो उपयोग करें:

scp myfile user@MachineA: फ़ाइल प्राप्त करने के लिए।

scp user@MachineA:/path/to/my/otherfile . फाइलें डालने के लिए

एससीपी के बारे में नोट:

cpकमांड की तरह , scpमूल फ़ाइल की अनुमति सेटिंग्स को कॉपी में प्रसारित करने के लिए एक -p विकल्प है (अन्यथा कॉपी नई फ़ाइलों के लिए सामान्य सेटिंग्स के साथ बनाई गई है), और एक के साथ एक संपूर्ण निर्देशिका ट्री की प्रतिलिपि करने के लिए -r विकल्प आदेश।

scpदो मशीनों के बीच एक पूरी तरह से पारदर्शी एन्क्रिप्टेड डेटा चैनल बनाता है, इसलिए बाइनरी डेटा (जैसे छवियां या निष्पादन योग्य कार्यक्रम) को सही ढंग से संरक्षित किया जाता है। इसका मतलब यह भी है कि scpविभिन्न प्रकार के ऑपरेटिंग सिस्टमों के बीच स्वचालित एंड-ऑफ-लाइन समाप्ति रूपांतरण करने में असमर्थ है, जैसा कि "ascii" मोड में ftp के साथ किया जा सकता है। यूनिक्स सिस्टम के बीच कॉपी करते समय यह समस्या नहीं होगी, जो सभी एक ही एंड-ऑफ-लाइन कन्वेंशन का उपयोग करते हैं।


2

यदि आप ssh के माध्यम से सर्वर का उपयोग करते हैं, तो आपको sftp के माध्यम से भी कनेक्ट करने की क्षमता मिलती है। Filezilla क्लाइंट (GUI) को संभाल कर रखें और उस पथ को पेस्ट करें जो आप वर्तमान में हैं

यहाँ छवि विवरण दर्ज करें


2
यह अधिक विवरण से लाभान्वित होगा, जिसमें FileZilla के साथ SSH सर्वर से कनेक्ट करना शामिल है (यह स्पष्ट नहीं है)। व्याख्यात्मक पाठ के अलावा स्क्रीनशॉट भी मदद कर सकता है ।
एलियाह कगन

2

यदि आपकी फ़ाइल काफी छोटी है तो आप इसे बेस 64 के साथ एनकोड कर सकते हैं और फिर इसे स्थानीय रूप से डीकोड कर सकते हैं:

Remote.example.net $ base64 <myfile
 (आउटपुट की प्रतिलिपि बनाएँ)
local.example.net $ base64 -d> myfile
 (आउटपुट को कॉपी करें)
Ctrl +D

मूल उत्तर जहां मुझे यह मिला (और परीक्षण किया गया): https://unix.stackexchange.com/a/2869/194644


इसका किसी भी चीज से क्या लेना-देना है? आपको फाइलों को सांकेतिक शब्दों में बदलने आदि के लिए उन्हें एनकोड करने की जरूरत नहीं है
HörmannHH

1

यह सक्रिय एसएसएच कनेक्शन पर नहीं है, लेकिन एसपी के समान ही तंत्र और अनुमतियों का उपयोग करके फ़ाइलों को स्कैन करता है।


4
मैं scp के बारे में जानता हूँ, लेकिन यह एक बहुत ही असम्बद्ध वर्कफ़्लो है। यदि मैं किसी दिए गए दूरस्थ निर्देशिका में काम कर रहा हूं, तो मुझे दूरस्थ पथ प्राप्त करने की आवश्यकता है, डिस्कनेक्ट करें (या किसी अन्य शेल को स्पेंक करें), रास्तों को लिखने का कार्य करें और फिर पुन: कनेक्ट करें। मैं एक ऐसी चीज की तलाश कर रहा हूं जो लिखने के समान है get fileऔर यह जादुई रूप से मेरी स्थानीय मशीन पर वापस दिखाई देती है। अगर ऐसा करना है तो SSH के माध्यम से ट्यून किए गए कुछ सेवा के माध्यम से, इसलिए यह हो सकता है .. लेकिन इसे सत्र-बद्ध होना चाहिए।
ओली

इसके अलावा इसे sftp द्वारा देखा गया था (मेरा उत्तर देखें)
ओलिवियर लालोंडे

@ ओली - चूंकि लेन-देन के दोनों छोर * निक्स बॉक्स हैं, इसलिए संभावना है कि दोनों sshdचल रहे हैं और इस प्रकार आपको scpक्लाइंट की फ़ाइलों को फेंकने के लिए सर्वर की कमांड लाइन पर उपयोग करने में सक्षम होना चाहिए । चारों ओर जाने के लिए केवल इतना जादू है; कभी-कभी हमें अभी भी बटन पुश करना पड़ता है। FileZilla समाधान भी आसान है।
zerobandwidth

1

यह डिफ़ॉल्ट ssh सत्र के साथ संभव नहीं है, लेकिन आप ssh के बजाय एक स्क्रिप्ट का उपयोग कर सकते हैं, जो कि स्थानीय सिस्टम पर एक साधारण ftp या rsh सर्वर की तरह कुछ शुरू करता है और अपने डेस्कटॉप पर एक सुरंग को स्थापित करने के लिए आवश्यक विकल्पों के साथ ssh चलाता है। इस सर्वर से जुड़ने के लिए।


या बस scp / rsync कर सकता है ...
HörmannHH

1

konsole जब आप दूरस्थ सत्र (या Ctrl-Alt-U) में होते हैं, तो "Edit-> ZModem Upload" मेनू के माध्यम से वह क्षमता होती है।

कृपया ध्यान दें: पैकेज lrzszपहले स्थापित होना चाहिए। मेरे लिए ऐसा लगता है कि केवल ASCII फाइल अपलोड करने के लिए काम करता है।


0

चूंकि आप डेस्कटॉप से ​​कनेक्ट कर रहे हैं, मुझे लगता है कि आप दूसरा टर्मिनल खोल सकते हैं।

ऐसा मैं अक्सर करता हूं:

  • पहले टर्मिनल से, वह जहां ssh सत्र चल रहा है, मुझे उस फ़ाइल का पूरा पथ मिलता है जिसे मुझे प्राप्त करने की आवश्यकता है, realpath myfileया तो readlink -f myfile( या पुराने उबंटू रिलीज़ प्रीइंस्टॉल्ड नहीं है realpath) और इसे कॉपी करें।
  • दूसरे टर्मिनल से मैं फ़ाइल का उपयोग करता हूं scpया sftpपहले प्राप्त किए गए पूर्ण पथ को चिपकाने के लिए करता हूं। उदाहरण के लिए:scp user@host:/etc/some/file ./

यह काफी बुनियादी है, लेकिन यह याद रखना भी आसान है और काम करने के लिए किसी अतिरिक्त पैकेज की आवश्यकता नहीं है।

पहले टर्मिनल से पूरा रास्ता निकालें, और फिर दूसरे टर्मिनल में पेस्ट करें


"रूट फ़ाइल प्राप्त करने का प्रयास करने और रूट द्वारा सीधे लॉग इन करने की कोशिश नहीं की जाती है" की मदद से प्रश्न में समस्या का समाधान किया जाता है।
ओली

0

हैरानी की बात यह है कि मुझे यहां पुराने पुराने मिडनाइट कमांडर का कोई उल्लेख नहीं मिला । मेरे दिमाग में, यह संभवतः सबसे सार्वभौमिक और उपयोगी फ़ाइल प्रबंधक है, जो पावर-क्षमताओं के साथ शेल के लिए है, मामले में "आवश्यक" उपकरण में से एक है, जो आपको SSH, FTP, SFTP और साथ ही साथ कनेक्ट करने की अनुमति देता है। दूसरा पैनल आप किसी भी अन्य (आपके स्थानीय) फाइल सिस्टम को खोल सकते हैं और इसलिए फाइलों के साथ स्वतंत्र रूप से काम कर सकते हैं।

आपको बस इतना करना है: apt-get install mc (ब्रह्मांड से)

उसके बाद, mc चलाएं, बाएं या दाएं पैनल के लिए मेनू खोलें, शेल कनेक्शन चुनें, यूज़रनेम @ रिमोट-आईपी दर्ज करें, पासवर्ड - वास्तव में, यह बात है .. कॉपी (यहां: डाउनलोड) फ़ाइलें / फ़ोल्डर एक मशीन से दूसरी मशीन के साथ F5, F6 के साथ चलते हैं, और इसी तरह नीचे दिए गए बटन के अनुसार। पुराने MS-users के लिए: DOS के लिए NC की तरह


-2

इस पर काबू पाने के लिए, दोस्तों। मैं सभी गहरे, गहरे, जटिल उत्तरों की तलाश में था। यह पता चला है, आप डॉल्फिन से सीधे यह कर सकते हैं। मछली: // उपयोगकर्ता नाम @ सर्वर: बंदरगाह


मुझे यह नहीं मिला
पियरे.वीयरेंस

मुझे नहीं लगता कि आप मेरे उपयोग-मामले को समझते हैं। मैं एक सक्रिय SSH कमांड लाइन सत्र में हूँ और अपने स्थानीय कंप्यूटर पर [संभावित विशेषाधिकार प्राप्त, यानी SFTP पर उपलब्ध नहीं] से एक फ़ाइल वापस भेजना चाहता हूँ। इसकी उत्पत्ति पर एक फ़ाइल भी नहीं हो सकती है, यह कमांड आउटपुट हो सकता है। मैं मध्यस्थ फाइल बनाने और नए SFTP / SCP / आदि सत्र शुरू किए बिना इसे वापस करने के लिए किसी तरह की तलाश कर रहा हूं।
ओली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.