ใช้ช่อง SSH ที่สร้างไว้แล้ว


50

ฉันมีการเชื่อมต่อ ssh ที่สร้างไว้แล้วระหว่างเครื่องสองเครื่อง

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

คำตอบ:


56

มันง่ายมากเมื่อใช้ OpenSSH เวอร์ชันล่าสุดหากคุณวางแผนล่วงหน้า

เปิดการเชื่อมต่อหลักในครั้งแรก สำหรับการเชื่อมต่อในภายหลังให้ทำการเชื่อมต่อสเลฟทาสผ่านการเชื่อมต่อหลักที่มีอยู่ ในของคุณ~/.ssh/configตั้งค่าการแชร์การเชื่อมต่อที่จะเกิดขึ้นโดยอัตโนมัติ:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

หากคุณเริ่มเซสชัน ssh ไปที่เดียวกัน (ผู้ใช้พอร์ตเครื่อง) เป็นการเชื่อมต่อที่มีอยู่เซสชันที่สองจะถูกส่งสัญญาณไปที่ช่องสัญญาณแรก การสร้างการเชื่อมต่อครั้งที่สองนั้นไม่จำเป็นต้องมีการพิสูจน์ตัวตนใหม่และรวดเร็วมาก


ดูเหมือนว่ารายการที่สองจะไม่ถูกลงทะเบียนใน / var / log / secure หรือ /var/log/auth.log อย่างไรก็ตามจะมีการลงทะเบียนรายการที่สองใน / var / log / wtmp หรือไม่
SOUser

@XichenLi /var/log/secureและ/var/log/auth.logบันทึกการเชื่อมต่อ SSH; การเชื่อมต่อของทาสไม่ปรากฏที่นั่นเพราะมันมีการเชื่อมต่อที่มีอยู่เดิม หากเซสชัน ssh ของคุณจัดสรรเทอร์มินัล (เช่นssh somehostโดยไม่มีคำสั่งหรือssh -t) นั่นคือ (ปกติ) ล็อกอินwtmpโดยไม่คำนึงว่าเทอร์มินัลนั้นปรากฏขึ้นอย่างไร (sshd วิธีใดก็ตามที่ใช้ในการสร้างการเชื่อมต่อ
Gilles 'หยุดความชั่วร้าย'

2
นอกจากนี้คุณยังสามารถใช้ControlPersist 600การหน่วงเวลาเป็นวินาทีของซ็อกเก็ตที่ไม่ได้ใช้งานก่อนที่จะถูกลบโดยอัตโนมัติ มิฉะนั้นจะปิดโดยอัตโนมัติเมื่อการเชื่อมต่อหลักสิ้นสุดลง ไม่ดีสำหรับการดำเนินการชุดคำสั่งจากระยะไกล (เช่นชุดคำสั่ง rsync ไปยังโฟลเดอร์ต่าง ๆ )

2
หากคุณไม่ต้องการแก้ไขการกำหนดค่าส่วนกลางคุณสามารถใช้ตัวเลือก-S(ระบุซ็อกเก็ต) และ-M(สร้างการเชื่อมต่อหลัก) ของไคลเอ็นต์ SSH
yankee

22

ค่อนข้างง่ายที่จะประสบความสำเร็จโดยใช้เครื่องมือncและ ssh tunnels

1. เปิดอุโมงค์ ssh

ในเซสชัน ssh ของคุณพิมพ์~Cบรรทัดใหม่ คุณจะได้รับพรอมต์ "คอนโซลบริการ" ssh ซึ่งมีลักษณะดังนี้:

ssh> 

พิมพ์คำสั่งโลคัลฟอร์เวิร์ดเพื่อเปิดช่องสัญญาณ ssh:

ssh> -L22000:targethost:22001
Forwarding port.

ในกรณีที่targethostเป็นโฮสต์หรือที่อยู่ IP ของเครื่องที่คุณเชื่อมต่อกับ

ตอนนี้สมมติว่าเซิร์ฟเวอร์ SSH บนเครื่องเป้าหมายก็ไม่ได้กำหนดให้ห้ามอุโมงค์คุณมีการส่งต่อการเชื่อมต่อที่ต้องการ: sshลูกค้าในเครื่องของคุณฟังพอร์ต 22000 และมันจะส่งต่อการจราจรใด ๆ ที่ส่งไปยังพอร์ต 22001 targethostบน

2. เริ่มเซิร์ฟเวอร์เครือข่ายบนเครื่องระยะไกล

นี่เป็นเรื่องง่ายเหมือนการเข้าสู่เซสชัน ssh ที่เปิดอยู่ของคุณด้วยคำสั่งต่อไปนี้:

remote$ nc -l localhost 22001 | sh

สิ่งนี้จะเริ่มต้นเซิร์ฟเวอร์ TCP ที่รับฟังพอร์ต 22001 ซึ่งเป็นพอร์ตเป้าหมายของช่องสัญญาณ ssh ของเราและกำหนดเส้นทางข้อมูลที่ได้รับ (สมมุติว่าคำสั่งเชลล์) ไปยังtargethostเชลล์อินสแตนซ์

3. ส่งสคริปต์ของคุณไปที่อุโมงค์

local$ cat yourscript.sh | nc localhost 22000

นี้จะส่งร่างกายของสคริปต์อุโมงค์ SSH targethostของคุณและจะสิ้นสุดการดำเนินการในเปลือกที่ คุณจะเห็นผลลัพธ์ของสคริปต์ในเทอร์มินัลของคุณด้วยเซสชัน ssh


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


3
คำตอบที่ดี ในทางเทคนิคเพื่อไปที่คอนโซลบริการ~ตัวละครจะต้องขึ้นบรรทัดใหม่ดังนั้นจึงLF ~ Cอาจเป็นลำดับที่ดีกว่า
Alexios

@Alexios ถูกต้อง
ulidtko

เคล็ดลับที่น่าทึ่ง! สำหรับเร็กคอร์ดssh man pageแสดงข้อมูลเพิ่มเติมเกี่ยวกับมัน (เลื่อนลงไปที่ส่วนที่เรียกว่า "ESCAPE CHARACTERS")
Carles Sala

@CarlesSala ยังดีใจที่ทราบว่าlessเพจเจอร์เริ่มต้นทั่วไปรองรับการค้นหาที่สามารถช่วยให้คุณเลื่อนได้ถ้าคุณรู้คำหลัก: เพียงแค่พิมพ์man ssh /ESCAPEและคุณอยู่ที่นั่น
ulidtko

@ulidtko แน่ใจ แต่เท่าที่ผมรู้ว่าหนึ่งไม่สามารถเชื่อมโยงคำสั่ง CLI ลง SO แสดงความคิดเห็นดังนั้นฉันได้พบหน้าคนของ html ตัวเลือกที่ดี ;-)
Carles ศาลา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.