ฉันมีการเชื่อมต่อ ssh ที่สร้างไว้แล้วระหว่างเครื่องสองเครื่อง
มีวิธีการส่งคำสั่งไปยังเครื่องระยะไกลจากเชลล์สคริปต์ที่ทำงานบนเครื่องท้องถิ่นโดยใช้การเชื่อมต่อที่เปิดอยู่แล้วและไม่เริ่มเซสชัน ssh อื่นหรือไม่
ฉันมีการเชื่อมต่อ ssh ที่สร้างไว้แล้วระหว่างเครื่องสองเครื่อง
มีวิธีการส่งคำสั่งไปยังเครื่องระยะไกลจากเชลล์สคริปต์ที่ทำงานบนเครื่องท้องถิ่นโดยใช้การเชื่อมต่อที่เปิดอยู่แล้วและไม่เริ่มเซสชัน ssh อื่นหรือไม่
คำตอบ:
มันง่ายมากเมื่อใช้ OpenSSH เวอร์ชันล่าสุดหากคุณวางแผนล่วงหน้า
เปิดการเชื่อมต่อหลักในครั้งแรก สำหรับการเชื่อมต่อในภายหลังให้ทำการเชื่อมต่อสเลฟทาสผ่านการเชื่อมต่อหลักที่มีอยู่ ในของคุณ~/.ssh/config
ตั้งค่าการแชร์การเชื่อมต่อที่จะเกิดขึ้นโดยอัตโนมัติ:
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
หากคุณเริ่มเซสชัน ssh ไปที่เดียวกัน (ผู้ใช้พอร์ตเครื่อง) เป็นการเชื่อมต่อที่มีอยู่เซสชันที่สองจะถูกส่งสัญญาณไปที่ช่องสัญญาณแรก การสร้างการเชื่อมต่อครั้งที่สองนั้นไม่จำเป็นต้องมีการพิสูจน์ตัวตนใหม่และรวดเร็วมาก
/var/log/secure
และ/var/log/auth.log
บันทึกการเชื่อมต่อ SSH; การเชื่อมต่อของทาสไม่ปรากฏที่นั่นเพราะมันมีการเชื่อมต่อที่มีอยู่เดิม หากเซสชัน ssh ของคุณจัดสรรเทอร์มินัล (เช่นssh somehost
โดยไม่มีคำสั่งหรือssh -t
) นั่นคือ (ปกติ) ล็อกอินwtmp
โดยไม่คำนึงว่าเทอร์มินัลนั้นปรากฏขึ้นอย่างไร (sshd วิธีใดก็ตามที่ใช้ในการสร้างการเชื่อมต่อ
ControlPersist 600
การหน่วงเวลาเป็นวินาทีของซ็อกเก็ตที่ไม่ได้ใช้งานก่อนที่จะถูกลบโดยอัตโนมัติ มิฉะนั้นจะปิดโดยอัตโนมัติเมื่อการเชื่อมต่อหลักสิ้นสุดลง ไม่ดีสำหรับการดำเนินการชุดคำสั่งจากระยะไกล (เช่นชุดคำสั่ง rsync ไปยังโฟลเดอร์ต่าง ๆ )
-S
(ระบุซ็อกเก็ต) และ-M
(สร้างการเชื่อมต่อหลัก) ของไคลเอ็นต์ SSH
ค่อนข้างง่ายที่จะประสบความสำเร็จโดยใช้เครื่องมือncและ ssh tunnels
ในเซสชัน ssh ของคุณพิมพ์~Cบรรทัดใหม่ คุณจะได้รับพรอมต์ "คอนโซลบริการ" ssh ซึ่งมีลักษณะดังนี้:
ssh>
พิมพ์คำสั่งโลคัลฟอร์เวิร์ดเพื่อเปิดช่องสัญญาณ ssh:
ssh> -L22000:targethost:22001
Forwarding port.
ในกรณีที่targethost
เป็นโฮสต์หรือที่อยู่ IP ของเครื่องที่คุณเชื่อมต่อกับ
ตอนนี้สมมติว่าเซิร์ฟเวอร์ SSH บนเครื่องเป้าหมายก็ไม่ได้กำหนดให้ห้ามอุโมงค์คุณมีการส่งต่อการเชื่อมต่อที่ต้องการ: ssh
ลูกค้าในเครื่องของคุณฟังพอร์ต 22000 และมันจะส่งต่อการจราจรใด ๆ ที่ส่งไปยังพอร์ต 22001 targethost
บน
นี่เป็นเรื่องง่ายเหมือนการเข้าสู่เซสชัน ssh ที่เปิดอยู่ของคุณด้วยคำสั่งต่อไปนี้:
remote$ nc -l localhost 22001 | sh
สิ่งนี้จะเริ่มต้นเซิร์ฟเวอร์ TCP ที่รับฟังพอร์ต 22001 ซึ่งเป็นพอร์ตเป้าหมายของช่องสัญญาณ ssh ของเราและกำหนดเส้นทางข้อมูลที่ได้รับ (สมมุติว่าคำสั่งเชลล์) ไปยังtargethost
เชลล์อินสแตนซ์
local$ cat yourscript.sh | nc localhost 22000
นี้จะส่งร่างกายของสคริปต์อุโมงค์ SSH targethost
ของคุณและจะสิ้นสุดการดำเนินการในเปลือกที่ คุณจะเห็นผลลัพธ์ของสคริปต์ในเทอร์มินัลของคุณด้วยเซสชัน ssh
ฉันจะทราบด้วยว่า ssh tunnel (ขั้นตอนที่ 1) ในสถานการณ์นี้ไม่จำเป็นอย่างเคร่งครัด คุณสามารถเริ่มเปิดเซิร์ฟเวอร์และเชื่อมต่อโดยตรงผ่านอินเทอร์เน็ต อย่างไรก็ตามคุณจะต้องใช้ช่องสัญญาณหากโฮสต์เป้าหมายไม่สามารถเข้าถึงได้โดยตรง (เช่นอยู่หลัง NAT) หรือต้องการการเข้ารหัส ssh
~
ตัวละครจะต้องขึ้นบรรทัดใหม่ดังนั้นจึงLF ~ C
อาจเป็นลำดับที่ดีกว่า
less
เพจเจอร์เริ่มต้นทั่วไปรองรับการค้นหาที่สามารถช่วยให้คุณเลื่อนได้ถ้าคุณรู้คำหลัก: เพียงแค่พิมพ์man ssh
/ESCAPE
และคุณอยู่ที่นั่น