दूरस्थ SSH सत्र से स्थानीय क्लिपबोर्ड पर डेटा कैसे भेजें


161

बॉर्डरलाइन सर्वरफॉल्ट सवाल, लेकिन मैं कुछ शेल स्क्रिप्ट्स की प्रोग्रामिंग कर रहा हूं, इसलिए मैं यहां पहले प्रयास कर रहा हूं :)

अधिकांश * निक्स में एक कमांड होता है जो आपको स्थानीय क्लिपबोर्ड / पेस्टबोर्ड पर आउटपुट / रीडायरेक्ट आउटपुट देगा, और उसी से पुनर्प्राप्त करेगा। OS X पर ये कमांड हैं

pbcopy, pbpaste 

वहाँ वैसे भी इस कार्यक्षमता को दोहराने के लिए एक और सर्वर में SSHed है? अर्थात्,

  1. मैं कंप्यूटर ए का उपयोग कर रहा हूं।
  2. मैं एक टर्मिनल विंडो खोलता हूं
  3. मैं कंप्यूटर बी के लिए एसएसएच
  4. मैं कंप्यूटर बी पर एक कमांड चलाता हूं
  5. कंप्यूटर बी के आउटपुट को पुनर्निर्देशित किया जाता है या स्वचालित रूप से कंप्यूटर ए के क्लिपबोर्ड पर कॉपी किया जाता है।

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

कोड उपयोगी है, लेकिन सामान्य दृष्टिकोण की भी सराहना की जाती है।

जवाबों:


89

मैं इस धागे को फिर से जीवित कर रहा हूं क्योंकि मैं एक ही तरह के समाधान की तलाश में हूं, और मुझे एक मिल गया है जो मेरे लिए काम करता है। यह OSX डेली के एक सुझाव का मामूली संशोधन है ।

मेरे मामले में, मैं एसएसएच के माध्यम से एक लिनक्स सर्वर से कनेक्ट करने के लिए अपने स्थानीय ओएसएक्स मशीन पर टर्मिनल का उपयोग करता हूं। ओपी की तरह, मैं केवल कीबोर्ड का उपयोग करके अपने स्थानीय क्लिपबोर्ड पर टर्मिनल से पाठ के छोटे बिट्स को स्थानांतरित करने में सक्षम होना चाहता था।

समाधान का सार:

commandThatMakesOutput | ssh desktop pbcopy

जब एक दूरस्थ कंप्यूटर के लिए ssh सत्र में चलाया जाता है, तो यह कमांड commandThatMakesOutput (जैसे ls, pwd) का आउटपुट लेता है और आउटपुट को स्थानीय कंप्यूटर के क्लिपबोर्ड ("डेस्कटॉप" का नाम या आईपी) में पाइप करता है। दूसरे शब्दों में, यह नेस्टेड ssh का उपयोग करता है: आप दूरस्थ कंप्यूटर से एक ssh सत्र से जुड़े हैं, आप वहां कमांड निष्पादित करते हैं, और दूरस्थ कंप्यूटर आपके डेस्कटॉप से ​​एक अलग ssh सत्र के माध्यम से जुड़ता है और आपके क्लिपबोर्ड पर पाठ डालता है।

इसके लिए आपके डेस्कटॉप को एक ssh सर्वर (जो मैं आपको और Google पर छोड़ता हूं) के रूप में कॉन्फ़िगर करने की आवश्यकता है। यदि आपने तेज़ ssh उपयोग को सुविधाजनक बनाने के लिए ssh कीज़ की स्थापना की है तो यह बहुत आसान है, अधिमानतः प्रति-सत्र पासफ़्रेज़ का उपयोग करके, या आपकी सुरक्षा के लिए जो भी आवश्यक हो।

अन्य उदाहरण:

ls  | ssh desktopIpAddress pbcopy
pwd |  ssh desktopIpAddress pbcopy

सुविधा के लिए, मैंने पाइप के बाद आवश्यक पाठ को छोटा करने के लिए एक bash फ़ाइल बनाई है:

#!/bin/bash
ssh desktop pbcopy

मेरे मामले में, मैं एक विशेष रूप से नामित कुंजी का उपयोग कर रहा हूं

मैंने इसे फ़ाइल नाम cb (मेरे mnemonic (ClipBoard) के साथ सहेजा है । स्क्रिप्ट को अपने पथ में कहीं रखें, इसे निष्पादन योग्य और ध्वनिपूर्ण बनाएं:

ls | cb

3
मैं अक्सर इस में विम। ऐसा करने के लिए, दृश्य मोड में आप जो कॉपी करना चाहते हैं उसे चुनें, फिर टाइप करें::'<,'>w !ssh desktop pbcopy
माइक ब्रेनन

@ माइकब्रेनन जब आपके पास पाठ का चयन होता है, तो आप सिर्फ cmd + C (या आपके द्वारा सेट की गई कोई भी कॉपी कुंजी) क्यों नहीं दबाते हैं? ...
पेट्र पेलर

36
इस तरह यह वास्तव में केवल तब काम करता है जब आपके डेस्कटॉप में एक स्थिर आईपी होता है और उस बॉक्स से पहुंच योग्य होता है जिसे आपने ssh'd किया है। मेरे लिए ऐसा कभी नहीं हुआ।
kqw

6
चारों ओर का रास्ता आसान नहीं होगा? ssh उपयोगकर्ता @ रिमोट 'कमांडटैकटमेकटपुट' | pbcopy
rulio

मुझे -e noneयहाँ वर्णित ssh ध्वज की आवश्यकता है: unix.stackexchange.com/questions/210615/…
Pat Myron

122

मेरा पसंदीदा तरीका है ssh [remote-machine] "cat log.txt" | xclip -selection c। यह तब सबसे उपयोगी होता है जब आप रिमोट से लोकल में ssh (या नहीं) कर सकते हैं।

संपादित करें: Cygwin पर ssh [remote-machine] "cat log.txt" > /dev/clipboard

संपादित करें: nbren12 से एक उपयोगी टिप्पणी:

SSH पोर्ट फ़ॉरवर्डिंग का उपयोग करके रिवर्स एसश कनेक्शन को सेटअप करना लगभग हमेशा संभव है। बस RemoteForward 127.0.0.1:2222 127.0.0.1:22अपने स्थानीय में सर्वर के प्रवेश को जोड़ें .ssh/config, और फिर ssh -p 2222 127.0.0.1रिमोट मशीन पर निष्पादित करें, जो फिर स्थानीय मशीन से कनेक्शन को रीडायरेक्ट करेगा। - nbren12


6
+1: अन्य समाधानों की तुलना में बहुत आसान है जब एक रिवर्स SSH कनेक्शन संभव नहीं है!
जॉन डिबलिंग

9
आप उस अत्यंत सरल समाधान के लिए अधिक पसंद के लायक हैं!
कामिल डिजिडिज़िक

31
मैक OSX पर हम में से उन लोगों के लिए,ssh [remote-machine] "cat log.txt" | pbcopy
14'14

1
यहाँ इस रिपोर्ट के अनुसार , मुझे इसे catसाइबर विंडोज 8 पर काम करने के लिए उपयोग करना था : ssh [remote-machine] "cat log.txt" | cat > /dev/clipboard(बेशक, मेरा रिमोट कमांड नहीं था cat; यह एक योनि वर्चुअल मशीन के अंदर कुछ और था इसलिए मैं वास्तव में भाग गया vagrant ssh -c "command" | cat > /dev/clipboard)
टिबी

7
यह है लगभग हमेशा संभव सेटअप करने के लिए एक रिवर्स ssh SSH पोर्ट अग्रेषण का उपयोग कर कनेक्शन। बस RemoteForward 127.0.0.1:2222 127.0.0.1:22अपने स्थानीय में सर्वर प्रविष्टि में जोड़ें .ssh/config, और फिर ssh -p 2222 127.0.0.1रिमोट मशीन पर निष्पादित करें, जो फिर स्थानीय मशीन से कनेक्शन को रीडायरेक्ट करेगा।
nbren12

30

एक महान समाधान मिला जिसे रिवर्स एसश कनेक्शन की आवश्यकता नहीं है!

आप दूरस्थ होस्ट पर xsh का उपयोग कर सकते हैं, OSX सिस्टम पर ssh X11 अग्रेषण और XQuartz के साथ।

इसे स्थापित करने के लिए:

  1. XQuartz स्थापित करें (मैंने इसे सोलोस्टिस्ट + pivotal_workstation :: xquartz recipe के साथ किया था , लेकिन आपके पास नहीं है)
  2. XQuartz.app चलाएं
  3. ओपन XQuartz प्राथमिकताएँ ( kb_command+ ,)
  4. सुनिश्चित करें कि "सिंकिंग सक्षम करें" और "पॉलीपबोर्ड अपडेट करें जब CLIPBOARD परिवर्तन" की जाँच की जाए XQuartz वरीयताएँ विंडो उदाहरण
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"

1
यह किसी से अलग कैसे है ssh remote-host "echo 'hello from remote-host' | pbcopy? यह एक उत्कृष्ट उत्तर होगा यदि यह इस तरह से कुछ काम करेगा: ssh -X remote-hostतो दूरस्थ मेजबान पर:echo 'hello from remote-host' | xclip -selection clipboard
kqw

5
@KasperSouren। मेरा मानना ​​है कि यह काम करता है कि आप कैसे उम्मीद कर रहे हैं। द `| xclip` दोहरे उद्धरण चिह्नों के अंदर है।
gdw2

1
2016 में, यह स्पष्ट रूप से सबसे अच्छा, नो-फ्रिल समाधान है। अन्य, रिवर्स-एसश आधारित समाधान भूल जाते हैं।
शिवांश

1
क्या यह w / o करने का एक तरीका है, यह केवल एक-बंद आदेश है? मैं ssh पर एक इंटरैक्टिव सत्र में अपने दूरस्थ सर्वर में लॉग इन होना चाहता हूं और फिर अपने स्थानीय क्लिपबोर्ड पर मनमाने ढंग से भेजने में सक्षम हो सकता हूं। क्या इसके लिए रिवर्स ssh की आवश्यकता है?
क्वास

2
@Kvass: जब तक आप -XSSH पर X11 फॉरवर्डिंग के लिए उपयोग कर रहे हैं , तब तक X11 प्रोग्राम आपके क्लिपबोर्ड को XQuartz सेटिंग्स के माध्यम से अपडेट करने में सक्षम होंगे। वन-ऑफ कमांड यह प्रदर्शित करना है कि echoदूरस्थ होस्ट के क्लिपबोर्ड के माध्यम से कुछ भेजना xclipकाम करता है और आपके स्थानीय एसएसएच क्लाइंट होस्ट को सिंक करना चाहिए। नोट @ gdw2 कहता है, "यह | xclipदोहरे उद्धरण चिह्नों के अंदर है"। जैसे, यह कुछ क्लिपबोर्ड पर भेजने के लिए रिमोट सर्वर पर एक कमांड के रूप में निष्पादित करेगा।
ट्रिनिट्रॉनएक्स

18

Ssh सर्वर पर सुरंग पोर्ट उल्टा

सभी मौजूदा समाधान या तो आवश्यक हैं:

  • X11 क्लाइंट पर (यदि आपके पास है, xclipतो सर्वर पर काम करता है) या
  • क्लाइंट और सर्वर एक ही नेटवर्क में होना चाहिए (जो कि आपके होम कंप्यूटर तक पहुंचने की कोशिश में काम पर नहीं है)।

इसे करने का एक और तरीका है, हालाँकि आपको यह संशोधित करने की आवश्यकता होगी कि आप अपने कंप्यूटर में कैसे ssh करते हैं।

मैंने इसका उपयोग करना शुरू कर दिया है और यह कहीं नहीं है क्योंकि यह ऐसा लगता है कि यह कोशिश कर रहा है।

ग्राहक (ssh सत्र स्टार्टअप)

ssh username@server.com -R 2000:localhost:2000

(संकेत: इसे एक कीबाइंडिंग बनाएं ताकि आपको इसे टाइप न करना पड़े)

ग्राहक (दूसरा टैब)

nc -l 2000 | pbcopy

नोट: यदि आपके पास नहीं है pbcopyतो बस teeएक फ़ाइल के लिए।

सर्वर (SSH सत्र के अंदर)

cat some_useful_content.txt | nc localhost 2000

अन्य नोट

वास्तव में भले ही आप एक ssh सत्र के बीच में हों, वहाँ एक सुरंग शुरू करने का एक तरीका है, लेकिन मैं लोगों को डराने से नहीं बचना चाहता जो वास्तव में उतना बुरा नहीं है जितना दिखता है। अगर मैं कोई दिलचस्पी देखता हूं तो बाद में विवरण जोड़ूंगा


1
+1 - यह बहुत साफ है। हालांकि - cat some_useful_content.txt | nc localhost 2000जब मैं ऐसा करता हूं तो कमांड लटका हुआ लगता है। मुझे इसे रोकने के लिए मैन्युअल रूप से ctr-c की आवश्यकता है, और यह केवल तभी है कि सामग्री मेरे क्लाइंट क्लिप / पेस्टबोर्ड पर जाती है
एलन स्टॉर्म

1
यह तब तक इंतजार करेगा जब तक कि कोई दूसरे छोर पर डेटा को नष्ट नहीं करता।
श्रीधर सरनोबत

वास्तव में मुझे लगता है कि मैंने आपके प्रश्न को गलत समझा। मुझे यकीन नहीं है कि ऐसा क्यों होता है।
श्रीधर सरनोबत

nc -l -pमेरे लिए काम करता है, लेकिन बस nc -lनहीं करता है। और मुझे @AlanStorm की भी समस्या है।
हैप्पीफेस

1
मैंने निर्दिष्ट करके नेटकैट को लटकाने की समस्या को हल किया -c। मैं काढ़ा द्वारा स्थापित GNU netcat का उपयोग करता हूं।
हैप्पीफेस

7

X11 चयनों का उपयोग करने के लिए विभिन्न उपकरण हैं, जिसमें xclip और XSel शामिल हैं । ध्यान दें कि X11 में पारंपरिक रूप से कई चयन हैं, और अधिकांश कार्यक्रमों में क्लिपबोर्ड और प्राथमिक चयन (जो समान नहीं हैं) दोनों की कुछ समझ है। Emacs माध्यमिक चयन के साथ भी काम कर सकते हैं, लेकिन यह दुर्लभ है, और कोई भी वास्तव में नहीं जानता कि कट बफ़र्स के साथ क्या करना है ...

$ xhel -help
उपयोग: xclip [विकल्प] [फ़ाइल] ...
पढ़ने या लिखने के लिए एक एक्स सर्वर चयन पर पहुँचें।

  -i, -in मानक इनपुट या फ़ाइलों से एक्स चयन में पाठ पढ़ा
                   (चूक)
  -o, -आउट चयन को मानक (आमतौर पर) के लिए प्रिंट करता है
                   एक फ़ाइल या कार्यक्रम के लिए पाइपिंग)
  बाहर निकलने से पहले प्रतीक्षा करने के लिए -l, -loops चयन संख्या का अनुरोध करता है
  -d, -display X डिस्प्ले को कनेक्ट करने के लिए (जैसे कि लोकलहोस्ट: 0 ")
  -h, -help उपयोग की जानकारी
      - चयन के लिए चयन ("प्राथमिक", "माध्यमिक", "क्लिपबोर्ड" या "बफर-कट")
      -noutf8 utf-8 के रूप में पाठ का इलाज न करें, पुराने यूनिकोड का उपयोग करें
      संस्करण की जानकारी
      -संतुलित त्रुटियां, पृष्ठभूमि में चलें (डिफ़ॉल्ट)
      -वापस अग्रभूमि में चलाएं, दिखाएं कि क्या हो रहा है
      -कब्ज चल रहा टीका

बग्स को <astrand@lysator.liu.se> पर रिपोर्ट करें
$ xsel -help
उपयोग: xsel [विकल्प]
एक्स चयन में हेरफेर करें।

डिफ़ॉल्ट रूप से वर्तमान चयन आउटपुट है और संशोधित नहीं है यदि दोनों
मानक इनपुट और मानक आउटपुट टर्मिनलों (ttys) हैं। अन्यथा,
यदि मानक आउटपुट टर्मिनल नहीं है तो वर्तमान चयन आउटपुट है
(tty), और चयन मानक इनपुट से सेट किया जाता है यदि मानक इनपुट
एक टर्मिनल (tty) नहीं है। यदि कोई इनपुट या आउटपुट विकल्प दिया जाता है
कार्यक्रम केवल अनुरोधित मोड में व्यवहार करता है।

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

इनपुट विकल्प
  -a, --append चयन के लिए मानक इनपुट जोड़ें
  -f, - मानक इनपुट बढ़ने के रूप में चयन करने के लिए
  -i, --input चयन में मानक इनपुट पढ़ें

आउटपुट विकल्प
  -o, --output मानक आउटपुट के लिए चयन लिखें

कार्रवाई के विकल्प
  -सी, - अस्पष्ट चयन को साफ़ करें
  -d, -delete अनुरोध है कि चयन को मंजूरी दे दी जाए और वह
                        एप्लिकेशन के स्वामित्व में यह अपनी सामग्री हटाता है

चयन के विकल्प
  -p, - प्राथमिक चयन (डिफ़ॉल्ट) पर संचालित
  -s, - सेकंडरी चयन पर संचालित
  -b, - स्प्रिंगबोर्ड CLIPBOARD के चयन पर काम करता है

  -k, --keep चयनों को संशोधित न करें, लेकिन प्राथमिक बनाएं
                        और सेकंडरी चयन के बाद भी बनी रहती है
                        प्रोग्राम वे बाहर निकलने में चुने गए थे।
  -x, --exchange PRIMARY और SECONDARY चयनों का आदान-प्रदान करें

एक्स विकल्प
  --display displayname
                        एक्स सर्वर से कनेक्शन निर्दिष्ट करें
  -t ms, --selectionTimeout एमएस
                        मिलीसेकंड में टाइमआउट निर्दिष्ट करें जिसके भीतर
                        चयन को पुनः प्राप्त किया जाना चाहिए। 0 (शून्य) का मान
                        कोई टाइमआउट निर्दिष्ट नहीं करता (डिफ़ॉल्ट)

विविध विकल्प
  -l, --logfile फ़ाइल को अलग करने के लिए त्रुटियों को लॉग करने के लिए निर्दिष्ट करें।
  -n, --nodetach नियंत्रण टर्मिनल से अलग न करें। के बिना
                        यह विकल्प, xsel एक पृष्ठभूमि बनने के लिए कांटा करेगा
                        इनपुट, एक्सचेंज और मोड में रहने की प्रक्रिया।

  -h, --help इस सहायता को प्रदर्शित करें और बाहर निकलें
  -v, --verbose प्रिंट जानकारीपूर्ण संदेश
  -version आउटपुट संस्करण की जानकारी और बाहर निकलें

कृपया बग्स को <conrad@vergenet.net> पर रिपोर्ट करें।

संक्षेप में, आप जो चाहते हैं उसके आधार पर xclip -i/ xclip -oया xclip -i -sel clip/ xclip -o -sel clipया xsel -i/ xsel -oया xsel -i -b/ की कोशिश करनी चाहिए xsel -o -b


4
@Ephemient को जोड़ने के लिए की पोस्ट: एक दूरस्थ होस्ट के साथ प्रयोग के xclip और xsel करने के लिए, तुम इतनी तरह X11 अग्रेषण का उपयोग कर सकते हैं: ssh -C -X user@remote-host। यदि दूरस्थ पक्ष पर xclip चल रहा है तो काम नहीं कर रहा है, सुनिश्चित करें X11Forwarding yesकि दूरस्थ /etc/ssh/sshd_configफ़ाइल में सेट है । यह भी सुनिश्चित करें xauthकि दूरस्थ तरफ स्थापित है। एक हेडलेस मशीन के लिए, आप स्थापित कर सकते हैं xauthऔर xvfb
ट्रिनिट्रॉनएक्स

यहाँ अतिरिक्त विवरणों के साथ एक विवरण दिया गया है।
टिम बन्स

1
@TrinitronX ओह वाह - एक दीवार के खिलाफ मेरे सिर को पीटना, xvfbउल्लेख के लिए धन्यवाद । मैं एक हेडलेस सर्वर चला रहा था, इसलिए X11 नहीं चल रहा होगा!
कैम

5

यह मेरा समाधान है SSH रिवर्स सुरंग, netcat और xclip पर आधारित है।

पहले अपने वर्कस्टेशन पर स्क्रिप्ट बनाएं (उदाहरण के लिए। क्लिपबोर्ड- eem.sh):

#!/bin/bash
HOST=127.0.0.1
PORT=3333

NUM=`netstat -tlpn 2>/dev/null | grep -c " ${HOST}:${PORT} "`
if [ $NUM -gt 0 ]; then
    exit
fi

while [ true ]; do
    nc -l ${HOST} ${PORT} | xclip -selection clipboard
done

और इसे पृष्ठभूमि में शुरू करें।

./clipboard-daemon.sh&

यह डेटा के भाग को प्राप्त करने के बाद nc पाइपिंग आउटपुट को xclip और respawning प्रक्रिया में शुरू करेगा

फिर दूरस्थ होस्ट के लिए ssh कनेक्शन शुरू करें:

ssh user@host -R127.0.0.1:3333:127.0.0.1:3333

दूरस्थ बॉक्स पर लॉग इन करते समय, यह कोशिश करें:

echo "this is test" >/dev/tcp/127.0.0.1/3333

फिर अपने कार्य केंद्र पर पेस्ट का प्रयास करें

आप निश्चित रूप से रैपर स्क्रिप्ट लिख सकते हैं जो क्लिपबोर्ड शुरू करता है- aem.sh पहले और फिर ssh सत्र। यह मेरे लिए कैसे काम करता है। का आनंद लें।


यह समाधान वह है जिसने मेरे लिए सबसे अच्छा काम किया है। यह बहुत जटिल नहीं है और ठीक से काम करता है।
मार्सेल वाल्डेज़ ओरोज़्को

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

4

एक-लाइनर नहीं, लेकिन अतिरिक्त एसएचएस की आवश्यकता नहीं है

  • इंस्टॉल netcatयदि आवश्यक हो तो
  • का उपयोग termbin : cat ~/some_file.txt | nc termbin.com 9999। यह आउटपुट को कॉपी करेगाtermbin वेबसाइट पर और URL को आपके आउटपुट पर प्रिंट करेगा।
  • अपने कंप्यूटर से उस url पर जाएं, आपको अपना आउटपुट मिलता है

बेशक, संवेदनशील सामग्री के लिए इसका इस्तेमाल न करें।


वाह यह एक बहुत ही रचनात्मक समाधान है।
श्रीधर सरनोबत

3

यह उत्तर अधिक सुरक्षा जोड़कर चुने गए उत्तर पर दोनों का विकास करता है ।

उस उत्तर पर सामान्य रूप में चर्चा हुई

<command that makes output> | \
    ssh <user A>@<host A> <command that maps stdin to clipboard>

कहाँ सुरक्षा की कमी की जा सकती है में है sshअनुमतियों की अनुमति देता है <user B>पर host B>करने के लिए sshमें host Aऔर निष्पादित किसी भी आदेश।

बेशक उपयोग Bकरने के लिए Aपहले से ही एक sshकुंजी द्वारा gated किया जा सकता है , और इसमें एक पासवर्ड भी हो सकता है। लेकिन सुरक्षा की एक और परत स्वीकार्य आदेशों के दायरे को प्रतिबंधित कर सकती है, जो कि Bनिष्पादित कर सकते हैं A, जैसे कि rm -rf /इसे नहीं बुलाया जा सकता है। (यह विशेष रूप से महत्वपूर्ण है जब sshकुंजी नहीं है में पासवर्ड है।)

सौभाग्य से, sshएक अंतर्निहित सुविधा है जिसे कमांड प्रतिबंध या मजबूर कमांड कहा जाता है । देखें ssh.com , या इस serverfault.com सवाल

नीचे दिया गया समाधान सामान्य प्रतिबंध के साथ-साथ कमांड प्रतिबंध को भी दर्शाता हैssh लागू है।

कमांड प्रतिबंध के साथ उदाहरण समाधान जोड़ा गया

यह सुरक्षा वर्धित समाधान सामान्य रूप का अनुसरण करता है - sshसत्र से कॉल host-Bबस है:

cat <file> | ssh <user-A>@<host A> to_clipboard

यह बाकी काम करने के लिए सेटअप दिखाता है।

का सेटअप Ssh कमांड प्रतिबंध

मान लीजिए कि उपयोगकर्ता खाता Bहै user-B, और B के पास एक ssh कुंजी है id-clip, जिसे सामान्य तरीके से बनाया गया है (ssh-keygen )।

फिर user-Aएक ssh निर्देशिका में एक फ़ाइल है

/home/user-A/.ssh/authorized_keys

कि कुंजी को पहचानता है id-clipऔर अनुमति देता हैssh कनेक्शन की है।

आमतौर पर प्रत्येक पंक्ति की सामग्री authorized_keysसार्वजनिक कुंजी अधिकृत होती है, उदाहरण के लिए, सामग्रीid-clip.pub

हालाँकि, कमांड प्रतिबंध लागू करने के लिए कि कमांड द्वारा सार्वजनिक कुंजी सामग्री (उसी लाइन पर) को निष्पादित किया जाना है।
हमारे मामले में:

command="/home/user-A/.ssh/allowed-commands.sh id-clip",no-agent-forwarding,no-port-forwarding,no-user-rc,no-x11-forwarding,no-pty <content of file id-clip.pub>

निर्दिष्ट कमांड "/home/user-A/.ssh/allowed-commands.sh id-clip", और केवल उस निर्दिष्ट कमांड को निष्पादित id-clipकिया जाता है, जब भी कुंजी का उपयोग किया जाता है तो एक sshकनेक्शन शुरू किया जाता है host-A- कोई बात नहीं जो sshकमांड लाइन लिखी जाती है

कमांड एक स्क्रिप्ट फ़ाइल को इंगित करता है allowed-commands.sh, और उस स्क्रिप्ट फ़ाइल की सामग्री है

#/bin/bash
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

Id=${1}

case "$SSH_ORIGINAL_COMMAND" in
    "to-clipboard")
          notify-send "ssh to-clipboard, from ${Id}"
        cat | xsel --display :0 -i -b
          ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

sshमशीन पर मूल कॉल Bथा

... | ssh <user-A>@<host A> to_clipboard

स्ट्रिंग to-clipboardको allowed-commands.shपर्यावरण चर द्वारा पारित किया गया है SSH_ORIGINAL_COMMAND। जोड़, हमने कुंजी का नाम पारित किया है id-clip, उस रेखा से authorized_keysजिसमें केवल द्वारा एक्सेस किया गया हैid-clip

रेखा

          notify-send "ssh to-clipboard, from ${Id}"

सिर्फ एक पॉपअप मैसेजबॉक्स है जिससे आपको पता चलता है कि क्लिपबोर्ड लिखा जा रहा है - यह शायद एक अच्छा सुरक्षा फीचर भी है। ( notify-sendउबंटू 18.04 पर काम करता है, शायद अन्य नहीं)।

कतार में

cat | xsel --display :0 -i -b

पैरामीटर --display :0आवश्यक है क्योंकि इस प्रक्रिया में क्लिपबोर्ड के साथ स्वयं का एक्स डिस्प्ले नहीं है, इसलिए इसे स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए। यह मान :0वैनलैंड विंडो सर्वर के साथ Ubuntu 18.04 पर काम करने के लिए होता है। अन्य सेटअप पर यह काम नहीं कर सकता है। एक मानक X सर्वर के लिए यह उत्तर मदद कर सकता है।

host-A /etc/ssh/sshd_config मापदंडों

अंत में /etc/ssh/sshd_configमेजबान पर कुछ पैरामीटर जिन्हें Aकनेक्ट करने की अनुमति सुनिश्चित करने के लिए सेट किया जाना चाहिए, और sshकेवल पासवर्ड के बिना उपयोग करने की अनुमति :

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

बनाने के लिए sshdसर्वर config फिर से पढ़

sudo systemctl restart sshd.service

या

sudo service sshd.service restart

निष्कर्ष

इसे स्थापित करने के लिए यह कुछ प्रयास है, लेकिन इसके अलावा अन्य कार्यों का to-clipboardनिर्माण समान ढांचे के समानांतर किया जा सकता है।


1
रिमोटवर्डवर्डिंग वाला Xsel एकमात्र उत्तर था जो मेरे लिए Ubuntu 18.04 पर स्थानीय रूप से i3 चल रहा था। कोई X11 अग्रेषण की आवश्यकता नहीं है।
Jay Stanley

2

@rhileighalmgren समाधान अच्छा है, लेकिन pbcopy कष्टप्रद रूप से अंतिम "\ n" वर्ण की नकल करेगा, मैं इसे रोकने के लिए पिछले चरित्र को बाहर निकालने के लिए "सिर" का उपयोग करता हूं:

#!/bin/bash
head -c -1 |  ssh desktop pbcopy

मेरा पूरा समाधान यहाँ है: http://taylor.woodstitch.com/linux/copy-local-clipboard-remote-ssh-server/


2

सभी का सबसे सरल समाधान, यदि आप टर्मिनल का उपयोग करके ओएस एक्स पर हैं और आप एक दूरस्थ सर्वर में चारों ओर ssh'ing कर रहे हैं और टेक्स्ट फ़ाइल या लॉग या सीएसवी के परिणामों को हड़पना चाहते हैं, बस:

1) Cmd-K टर्मिनल का आउटपुट साफ़ करने के लिए

2) cat <filename> फ़ाइल की सामग्री को प्रदर्शित करने के लिए

3) Cmd-S टर्मिनल आउटपुट को बचाने के लिए

आपके पास फ़ाइल की पहली पंक्ति और अंतिम पंक्ति को मैन्युअल रूप से निकालना होगा, लेकिन यह विधि स्थापित किए जाने वाले अन्य पैकेजों पर निर्भर होने की तुलना में थोड़ी सरल है, "रिवर्स सुरंगों" और एक स्थिर आईपी, आदि की कोशिश कर रहा है।


+1 ने एक उपयोगी तकनीक के लिए जो मैंने खुद का उपयोग किया है, बिट यह आपको अपने टर्मिनल इतिहास को खोने के लिए मजबूर करता है और (जैसा कि उल्लेख किया गया है) पहली / अंतिम पंक्ति की समस्या थोड़ी फिजूल है।
एलन स्टॉर्म

सहमत @AlanStorm
tw0000

इस दृष्टिकोण के साथ अधिक महत्वपूर्ण समस्या यह है कि यह केवल उन लाइनों की संख्या को बचाएगा जो आपके टर्मिनल बफर को बनाए रखता है। अक्सर यह एक समस्या नहीं है, लेकिन यदि आप एक लॉग फ़ाइल की सामग्री को हथियाने की कोशिश कर रहे हैं, तो आप क्षमता से बाहर चला सकते हैं,
श्रीधर सरनोबत

यह सच है @ श्रीधर-सरनोबत, यह सामान्य रूप से बहुत अच्छा समाधान नहीं है। मैं अभी उपयोग करता हूँ scp!
210000 बजे 21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.