วิธีการส่งข้อมูลไปยังคลิปบอร์ดท้องถิ่นจากเซสชัน SSH ระยะไกล


161

Borderline ServerFault คำถาม แต่ฉันกำลังเขียนโปรแกรมเชลล์สคริปดังนั้นฉันลองที่นี่ก่อน :)

* nixes ส่วนใหญ่มีคำสั่งที่จะให้คุณไพพ์ / เปลี่ยนทิศทางเอาต์พุตไปยังโลคัลคลิปบอร์ด / วางบอร์ดและดึงจากเดียวกัน บน OS X คำสั่งเหล่านี้คือ

pbcopy, pbpaste 

มีการทำซ้ำฟังก์ชันการทำงานนี้ในขณะที่ SSHed ไปยังเซิร์ฟเวอร์อื่นหรือไม่ นั่นคือ,

  1. ฉันกำลังใช้คอมพิวเตอร์ A.
  2. ฉันเปิดหน้าต่างเทอร์มินัล
  3. ฉัน SSH กับคอมพิวเตอร์ B
  4. ฉันเรียกใช้คำสั่งบนคอมพิวเตอร์ B
  5. เอาต์พุตของ Computer B ถูกเปลี่ยนเส้นทางหรือคัดลอกไปยังคลิปบอร์ดของ Computer A โดยอัตโนมัติ

และใช่ฉันรู้ว่าฉันทำได้เพียงแค่ตัวสั่น (shudder) ใช้เมาส์เพื่อเลือกข้อความจากคำสั่ง แต่ฉันคุ้นเคยกับเวิร์กโฟลว์ของการส่งออก pipping โดยตรงไปยังคลิปบอร์ดที่ฉันต้องการเหมือนกันสำหรับเซสชันระยะไกลของฉัน

รหัสมีประโยชน์ แต่วิธีการทั่วไปนั้นก็น่าชื่นชมเช่นกัน

คำตอบ:


89

ฉันกำลังเรียกคืนเธรดนี้เพราะฉันกำลังมองหาวิธีการแก้ปัญหาแบบเดียวกันและฉันได้พบสิ่งที่เหมาะกับฉัน มันเป็นเรื่องการปรับเปลี่ยนเล็กน้อยเพื่อข้อเสนอแนะจากOSX ประจำวัน

ในกรณีของฉันฉันใช้ Terminal บนเครื่อง OSX ในพื้นที่ของฉันเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ linux ผ่าน SSH เช่นเดียวกับ OP ฉันต้องการถ่ายโอนข้อความเล็กน้อยจากเทอร์มินัลไปยังคลิปบอร์ดท้องถิ่นโดยใช้แป้นพิมพ์เท่านั้น

สาระสำคัญของการแก้ปัญหา:

commandThatMakesOutput | ssh desktop pbcopy

เมื่อทำงานในเซสชัน ssh ไปยังคอมพิวเตอร์ระยะไกลคำสั่งนี้จะใช้เอาต์พุตของcommandThatMakesOutput (เช่น ls, pwd) และไพพ์เอาต์พุตไปยังคลิปบอร์ดของโลคัลคอมพิวเตอร์ (ชื่อหรือ IP ของ "เดสก์ท็อป") กล่าวอีกนัยหนึ่งมันใช้ ssh ที่ซ้อนกัน: คุณเชื่อมต่อกับคอมพิวเตอร์ระยะไกลผ่านหนึ่งเซสชัน ssh คุณดำเนินการคำสั่งที่นั่นและคอมพิวเตอร์ระยะไกลเชื่อมต่อกับเดสก์ท็อปของคุณผ่านเซสชัน ssh อื่นและใส่ข้อความไปยังคลิปบอร์ดของคุณ

มันต้องมีการกำหนดค่าเดสก์ทอปของคุณเป็นเซิร์ฟเวอร์ ssh (ซึ่งฉันไปกับคุณและ google) มันง่ายกว่าถ้าคุณตั้งค่าปุ่ม ssh เพื่ออำนวยความสะดวกในการใช้งาน ssh อย่างรวดเร็วโดยเฉพาะการใช้วลีรหัสผ่านต่อเซสชันหรือความต้องการด้านความปลอดภัยของคุณ

ตัวอย่างอื่น ๆ :

ls  | ssh desktopIpAddress pbcopy
pwd |  ssh desktopIpAddress pbcopy

เพื่อความสะดวกฉันได้สร้างไฟล์ bash เพื่อย่อข้อความที่ต้องการหลังไพพ์:

#!/bin/bash
ssh desktop pbcopy

ในกรณีของฉันฉันใช้คีย์ที่มีชื่อพิเศษ

ฉันบันทึกด้วยชื่อไฟล์cb (ตัวช่วยจำของฉัน (ClipBoard) วางสคริปต์ไว้ที่ใดที่หนึ่งในพา ธ ของคุณ

ls | cb

3
ฉันมักจะทำสิ่งนี้เป็นกลุ่ม หากต้องการทำเช่นนั้นให้เลือกสิ่งที่คุณต้องการคัดลอกในโหมดภาพจากนั้นพิมพ์::'<,'>w !ssh desktop pbcopy
Mike Brennan

@MikeBrennan เมื่อคุณเลือกข้อความทำไมคุณไม่กด cmd + C (หรือคัดลอกคีย์ที่คุณตั้งไว้) ...
Petr Peller

36
เช่นนี้มันจะใช้งานได้เฉพาะเมื่อเดสก์ท็อปของคุณมี IP แบบคงที่และสามารถเข้าถึงได้จากกล่องที่คุณต้องการ นั่นไม่ใช่กรณีสำหรับฉัน
kqw

6
วิธีอื่นจะไม่ง่ายกว่านี้ไหม ssh user @ remote 'commandThatMakesOutput' | pbcopy
rulio

ฉันต้องการ-e noneแฟล็ก
Pat Myron

122

ssh [remote-machine] "cat log.txt" | xclip -selection cวิธีที่ฉันชอบคือ สิ่งนี้มีประโยชน์มากที่สุดเมื่อคุณไม่ต้องการ (หรือไม่สามารถ) ssh จากระยะไกลสู่ท้องถิ่น

แก้ไข: บน ssh [remote-machine] "cat log.txt" > /dev/clipboardCygwin

แก้ไข: ความคิดเห็นที่เป็นประโยชน์จาก 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 แบบย้อนกลับได้!
John Dibling

9
คุณสมควรได้รับการถูกใจมากขึ้นสำหรับโซลูชันที่ง่ายมาก!
Kamil Dziedzic

31
สำหรับพวกเราใน Mac OSXssh [remote-machine] "cat log.txt" | pbcopy
chowey

1
ตามรายงานนี้ที่นี่ฉันต้องใช้catเพื่อให้มันทำงานบน cygwin Windows 8: ssh [remote-machine] "cat log.txt" | cat > /dev/clipboard(แน่นอนคำสั่งระยะไกลของฉันไม่ได้cat; มันเป็นอย่างอื่นในเครื่องเสมือนคนจรจัดดังนั้นฉันวิ่งจริงvagrant ssh -c "command" | cat > /dev/clipboard)
tiby

7
มันเกือบจะเป็นไปได้ที่จะตั้งค่าการเชื่อมต่อแบบย้อนกลับโดยใช้การส่งต่อพอร์ต SSH เพียงเพิ่มRemoteForward 127.0.0.1:2222 127.0.0.1:22รายการเซิร์ฟเวอร์ในเครื่องของคุณ.ssh/configแล้วดำเนินการssh -p 2222 127.0.0.1บนเครื่องระยะไกลซึ่งจะเปลี่ยนเส้นทางการเชื่อมต่อไปยังเครื่องท้องถิ่น
nbren12

30

พบโซลูชันที่ยอดเยี่ยมที่ไม่ต้องการการเชื่อมต่อแบบย้อนกลับ

คุณสามารถใช้ xclip บนรีโมตโฮสต์พร้อมกับการส่งต่อ ssh X11 & XQuartz บนระบบ OSX

หากต้องการตั้งค่านี้:

  1. ติดตั้ง XQuartz (ฉันทำสิ่งนี้กับsoloist + pivotal_workstation :: สูตร xquartzแต่คุณไม่ต้องทำ)
  2. เรียกใช้ XQuartz.app
  3. เปิดการตั้งค่า XQuartz ( kb_command+ ,)
  4. ตรวจสอบให้แน่ใจ"เปิดใช้งานการซิงค์"และ"การปรับปรุงทำด้วยกระดาษแข็งเมื่อมีการเปลี่ยนแปลงคลิปบอร์ด"จะถูกตรวจสอบ ตัวอย่างหน้าต่างการตั้งค่า 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
ในปี 2559 นี้เป็นทางออกที่ดีที่สุดและไม่หวือหวา ลืมวิธีการแก้ปัญหาอื่น ๆ ที่ใช้แบบย้อนกลับ
shivams

1
มีวิธีที่จะทำสิ่งนี้โดยไม่มีคำสั่งเพียงครั้งเดียวหรือไม่? ฉันต้องการที่จะเข้าสู่เซิร์ฟเวอร์ระยะไกลของฉันในเซสชั่นการโต้ตอบผ่าน ssh แล้วสามารถส่งไปยังคลิปบอร์ดท้องถิ่นของฉันโดยพลการ สิ่งนั้นต้องการ reverse ssh หรือไม่?
Kvass

2
@Kvass: ตราบใดที่คุณใช้-XX11 Forwarding ผ่าน SSH โปรแกรม X11 จะสามารถอัปเดตคลิปบอร์ดของคุณผ่านการตั้งค่า XQuartz ด้านบน คำสั่ง one-off คือการแสดงให้เห็นว่าการส่งบางสิ่งผ่านechoไปยังคลิปบอร์ดของรีโมตโฮสต์ผ่านการxclipทำงาน & ควรซิงค์กับโฮสต์ไคลเอ็นต์ SSH ในพื้นที่ของคุณ หมายเหตุตามที่ @ gdw2 พูดว่า "The | xclipอยู่ในเครื่องหมายคำพูดคู่" ดังนั้นมันจะทำงานเป็นคำสั่งบนเซิร์ฟเวอร์ระยะไกลเพื่อส่งบางสิ่งไปยังคลิปบอร์ดของมัน
TrinitronX

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 ด้วยตนเองเพื่อหยุดมันและมันก็เป็นเพียงว่าเนื้อหาที่ได้รับไปยังคลิปลูกค้า / วางบอร์ดของฉัน
Alan Storm

1
มันจะรอจนกว่าจะมีคนทำการ dequeues ข้อมูลที่ส่วนอื่น ๆ
Sridhar Sarnobat

ที่จริงฉันคิดว่าฉันเข้าใจผิดคำถามของคุณ ฉันไม่แน่ใจว่าทำไมถึงเกิดขึ้น
Sridhar Sarnobat

nc -l -pทำงานได้สำหรับฉัน แต่ก็nc -lไม่ได้ และฉันก็มีปัญหา @AlanStorm ด้วย
HappyFace

1
ฉันจะแก้ไขปัญหาที่แขวน netcat -cโดยระบุ ฉันใช้ GNU netcat ติดตั้งโดยชง
HappyFace

7

มีเครื่องมือต่างๆในการเข้าถึงการเลือก X11 รวมถึงxclipและXSel โปรดทราบว่า X11 มีหลายตัวเลือกแบบดั้งเดิมและโปรแกรมส่วนใหญ่มีความเข้าใจทั้งในคลิปบอร์ดและตัวเลือกหลัก (ซึ่งไม่เหมือนกัน) Emacs สามารถทำงานร่วมกับตัวเลือกรองได้เช่นกัน แต่หายากและไม่มีใครรู้จริง ๆ ว่าจะทำอย่างไรกับบัฟเฟอร์ที่ถูกตัด ...

$ xclip - ช่วย
การใช้งาน: xclip [ตัวเลือก] [ไฟล์] ...
เข้าถึงการเลือกเซิร์ฟเวอร์ X สำหรับการอ่านหรือการเขียน

  -i, - อ่านข้อความในการเลือก X จากอินพุตมาตรฐานหรือไฟล์
                   (ค่าเริ่มต้น)
  -o, -out พิมพ์ส่วนที่เลือกไปยัง Standard out (โดยทั่วไปจะเป็น
                   ไปป์ที่ไฟล์หรือโปรแกรม)
  -l, - ลูปจำนวนคำขอการเลือกที่จะรอก่อนที่จะออก
  -d, -display X display เพื่อเชื่อมต่อกับ (เช่น localhost: 0 ")
  -h, -help ข้อมูลการใช้งาน
      - ตัวเลือกการเลือกเพื่อเข้าถึง ("หลัก", "รอง", "คลิปบอร์ด" หรือ "บัฟเฟอร์ตัด")
      -noutf8 ไม่ถือว่าข้อความเป็น utf-8 ใช้ unicode เก่า
      ข้อมูลเวอร์ชัน --version
      ข้อผิดพลาด - เงียบเท่านั้นทำงานในพื้นหลัง (เริ่มต้น)
      ทำงานเงียบ ๆ ในเบื้องหน้าแสดงว่าเกิดอะไรขึ้น
      - แสดงความเห็นที่ใช้งานอยู่

รายงานข้อผิดพลาดไปที่ <astrand@lysator.liu.se>
$ xsel -help
การใช้งาน: xsel [ตัวเลือก]
จัดการกับการเลือก X

โดยค่าเริ่มต้นการเลือกปัจจุบันจะถูกส่งออกและไม่ได้รับการแก้ไขหากทั้งสอง
อินพุตมาตรฐานและเอาต์พุตมาตรฐานคือเทอร์มินัล (ttys) มิฉะนั้น,
การเลือกปัจจุบันคือเอาท์พุทถ้าเอาท์พุทมาตรฐานไม่ใช่ขั้ว
(tty) และการเลือกถูกตั้งค่าจากอินพุตมาตรฐานหากอินพุตมาตรฐาน
ไม่ใช่เทอร์มินัล (tty) หากได้รับตัวเลือกอินพุทหรือเอาท์พุทใด ๆ
โปรแกรมทำงานเฉพาะในโหมดที่ร้องขอ

หากจำเป็นต้องใช้ทั้งอินพุตและเอาต์พุตการเลือกก่อนหน้าคือ
เอาต์พุตก่อนที่จะถูกแทนที่ด้วยเนื้อหาของอินพุตมาตรฐาน

ตัวเลือกการป้อนข้อมูล
  -a, - ผนวกผนวกอินพุตมาตรฐานเข้ากับการเลือก
  -f, - ติดตามต่อท้ายการเลือกเมื่ออินพุตมาตรฐานโตขึ้น
  -i, - อินพุตอ่านอินพุตมาตรฐานลงในส่วนที่เลือก

ตัวเลือกการส่งออก
  -o, - เอาต์พุตเขียนการเลือกไปยังเอาต์พุตมาตรฐาน

ตัวเลือกการดำเนินการ
  -c, - ชัดเจนล้างการเลือก
  -d, - ลบคำขอให้ยกเลิกการเลือกและ
                        แอปพลิเคชันที่เป็นเจ้าของลบเนื้อหา

ตัวเลือกการเลือก
  -p, --primary ทำงานบนตัวเลือกหลัก (ค่าเริ่มต้น)
  -s, - วินาทีดำเนินการในการเลือกวินาที
  -b, - คลิปบอร์ดดำเนินการกับการเลือกคลิปบอร์ด

  -k, --keep อย่าแก้ไขสิ่งที่เลือก แต่ทำหลัก
                        และตัวเลือกที่สองยังคงมีอยู่แม้หลังจาก
                        โปรแกรมที่พวกเขาได้รับเลือกในทางออก
  -x, - แลกเปลี่ยนการแลกเปลี่ยนการเลือกหลักและรอง

ตัวเลือก X
  - แสดงชื่อที่แสดง
                        ระบุการเชื่อมต่อกับเซิร์ฟเวอร์ X
  -t ms, - เลือก timeout ms
                        ระบุการหมดเวลาเป็นมิลลิวินาทีภายใน
                        ต้องเลือกการดึงข้อมูล ค่า 0 (ศูนย์)
                        ระบุไม่มีการหมดเวลา (ค่าเริ่มต้น)

ตัวเลือกเบ็ดเตล็ด
  -l, --logfile ระบุไฟล์ที่จะบันทึกข้อผิดพลาดเมื่อถอดออก
  -n, --nodetach อย่าแยกออกจากสถานีควบคุม ไม่มี
                        ตัวเลือกนี้ xsel จะแยกเป็นพื้นหลัง
                        กระบวนการในการป้อนข้อมูลแลกเปลี่ยนและเก็บโหมด

  -h, - ช่วยแสดงความช่วยเหลือและออกจากนี้
  -v, - verbose พิมพ์ข้อความที่ให้ข้อมูล
  - รุ่นข้อมูลเอาท์พุทรุ่นและออก

กรุณารายงานข้อผิดพลาดไปที่ <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
TrinitronX

นี่คือคำอธิบายที่มีรายละเอียดเพิ่มเติมรวมถึงการเชื่อมโยงคีย์ vim
Tim Bunce

1
@ TrititronX โอ้ว้าว - กระแทกหัวฉันกับกำแพงขอบคุณที่xvfbพูดถึง ฉันใช้เซิร์ฟเวอร์หัวขาดดังนั้น X11 จะต้องไม่ทำงาน!
แคม

5

นี่เป็นวิธีแก้ปัญหาของฉันโดยใช้อุโมงค์ย้อนกลับ SSH, netcat และ xclip

ขั้นแรกให้สร้างสคริปต์ (เช่น clipboard-daemon.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 piping output ไปยัง 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

จากนั้นลองวางบนเวิร์กสเตชันของคุณ

แน่นอนคุณสามารถเขียนสคริปต์ wrapper ที่เริ่มคลิปบอร์ด - daemon.sh ก่อนแล้วจึงเซสชัน ssh นี่คือวิธีการทำงานสำหรับฉัน สนุก.


วิธีนี้เป็นวิธีที่ดีที่สุดสำหรับฉัน มันไม่ซับซ้อนเกินไปและทำงานอย่างถูกต้อง
Marcel Valdez Orozco

ทางออกที่ดีที่สุดในความคิดของฉัน คุณไม่ต้องกังวลกับการอนุญาตให้ใช้การเชื่อมต่อแบบย้อนกลับซึ่งมีผลกระทบด้านความปลอดภัยและการวนซ้ำไม่สิ้นสุดเป็นสิ่งที่ดีมาก
R. Taukulis

4

ไม่ใช่ซับเดี่ยว แต่ไม่ต้องการ sshเพิ่มเติม

  • ติดตั้งnetcatหากจำเป็น
  • ใช้termbincat ~/some_file.txt | nc termbin.com 9999 : สิ่งนี้จะคัดลอกผลลัพธ์ไปยังtermbinเว็บไซต์และพิมพ์ URL ไปยังผลลัพธ์ของคุณ
  • ไปที่ URL นั้นจากคอมพิวเตอร์ของคุณคุณจะได้ผลลัพธ์

แน่นอนว่าอย่าใช้กับเนื้อหาที่ละเอียดอ่อน


ว้าวนั่นเป็นทางออกที่สร้างสรรค์มาก
Sridhar Sarnobat

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รหัสแล้วและอาจมีรหัสผ่านด้วย แต่การรักษาความปลอดภัยอีกชั้นหนึ่งสามารถ จำกัด ขอบเขตของคำสั่งที่อนุญาตซึ่ง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_keysid-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_keysid-clip

เส้น

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

เป็นเพียงกล่องข้อความป๊อปอัพเพื่อแจ้งให้คุณทราบว่ากำลังเขียนคลิปบอร์ดซึ่งอาจเป็นคุณลักษณะด้านความปลอดภัยที่ดีเช่นกัน ( notify-sendทำงานบน Ubuntu 18.04 อาจจะไม่ใช่คนอื่น)

ในสาย

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

พารามิเตอร์--display :0จำเป็นเนื่องจากกระบวนการไม่มี X display เป็นของตัวเองพร้อมคลิปบอร์ดดังนั้นจึงต้องเจาะจงอย่างชัดเจน ค่านี้:0จะทำงานกับ Ubuntu 18.04 กับเซิร์ฟเวอร์หน้าต่าง Wayland ในการตั้งค่าอื่น ๆ อาจไม่ทำงาน สำหรับเซิร์ฟเวอร์ X มาตรฐานคำตอบนี้อาจช่วยได้

host-A /etc/ssh/sshd_config พารามิเตอร์

ในที่สุดพารามิเตอร์บางตัวใน/etc/ssh/sshd_configโฮสต์Aที่ควรตั้งค่าเพื่อให้แน่ใจว่าได้รับอนุญาตให้เชื่อมต่อและสิทธิ์ในการใช้ssh-key เท่านั้นโดยไม่ต้องใช้รหัสผ่าน:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

เพื่อให้sshdเซิร์ฟเวอร์อ่านการกำหนดค่าอีกครั้ง

sudo systemctl restart sshd.service

หรือ

sudo service sshd.service restart

ข้อสรุป

มันเป็นความพยายามในการตั้งค่า แต่ฟังก์ชั่นอื่น ๆ นอกเหนือจากto-clipboardสามารถสร้างขึ้นในแบบคู่ขนานกรอบเดียวกัน


1
Xsel พร้อมการส่งต่อระยะไกลเป็นคำตอบเดียวที่ทำงานกับฉันบน Ubuntu 18.04 ที่ใช้ i3 ในเครื่อง ไม่จำเป็นต้องส่งต่อ X11
เจย์สแตนลีย์

2

@ แก้ปัญหา rhileighalmgren เป็นสิ่งที่ดี แต่ pbcopy จะคัดลอกตัวอักษร "\ n" ตัวสุดท้ายฉันใช้ "หัว" เพื่อแยกอักขระตัวสุดท้ายออกเพื่อป้องกันสิ่งนี้:

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

โซลูชันที่สมบูรณ์ของฉันอยู่ที่นี่: http://taylor.woodstitch.com/linux/copy-local-clipboard-remote-ssh-server/


2

ทางออกที่ง่ายที่สุดของทุกคนถ้าคุณใช้ OS X โดยใช้ Terminal และคุณกำลังนั่งอยู่ในเซิร์ฟเวอร์ระยะไกลและต้องการที่จะคว้าผลลัพธ์ของไฟล์ข้อความหรือบันทึกหรือ csv เพียง:

1) Cmd-Kเพื่อล้างเอาต์พุตของเทอร์มินัล

2) cat <filename>เพื่อแสดงเนื้อหาของไฟล์

3) Cmd-Sเพื่อบันทึกผลลัพธ์ของเครื่อง

คุณจะต้องลบบรรทัดแรกและบรรทัดสุดท้ายของไฟล์ด้วยตนเอง แต่วิธีนี้ค่อนข้างง่ายกว่าการใช้แพ็คเกจอื่น ๆ ที่จะติดตั้ง "อุโมงค์ย้อนกลับ" และพยายามที่จะมี IP แบบคงที่ ฯลฯ


+1 สำหรับเทคนิคที่มีประโยชน์ฉันได้ใช้ตัวเองแล้วมันก็บังคับให้คุณเสียประวัติเทอร์มินัลและ (ดังที่กล่าวไว้) ปัญหาบรรทัดแรก / ครั้งสุดท้ายนั้นค่อนข้างเที่ยวยุ่งยิ่ง
Alan Storm

ตกลง @AlanStorm
tw0000

ปัญหาที่สำคัญยิ่งกว่าด้วยวิธีนี้คือมันจะบันทึกจำนวนบรรทัดที่เทอร์มินัลบัฟเฟอร์ของคุณยังคงอยู่ บ่อยครั้งที่ไม่ใช่ปัญหา แต่ถ้าคุณพยายามคว้าเนื้อหาของไฟล์บันทึกคุณอาจหมดความสามารถ
Sridhar Sarnobat

นั่นเป็นความจริง @ Sridhar-Sarnobat มันไม่ได้เป็นคำตอบที่ดีนัก ฉันแค่ใช้scp!
tw0000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.