วิธีจัดการอุโมงค์เป็นกระบวนการพื้นหลังจากเชลล์สคริปต์


19

ฉันต้องตั้งค่า ssh-tunnels สองตัวจากเชลล์สคริปต์ ฉันได้ลองใช้มันเป็นงาน bg โดยใช้:

#!/bin/sh
ssh -L 3000:server1:5029 me@server2 &
ssh -L 3001:server3:3306 me@server2 &

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

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

หมายเหตุ:คำถามนี้เดิมที "ฉันจะเปิดแท็บเทอร์มินัลใหม่จากเปลือกแล้วเรียกใช้คำสั่งได้อย่างไร" แต่ฉันได้รับคำตอบสองคำเกี่ยวกับการจัดการอุโมงค์ สำหรับคำถาม "การเปิดเปลือก" ฉันพบสิ่งนี้ใน SuperUserซึ่งจะใช้งานได้แม้ว่าแท็บใหม่ในพื้นหลังจะดีกว่าสำหรับหน้าต่างเบื้องหน้าที่เปิดขึ้นมา


คุณเก็บเซสชัน SSH ที่ใช้งานอยู่ไปยังเซิร์ฟเวอร์หรือไม่ หมายความว่าคุณมีอุโมงค์ของคุณในพื้นหลังและเซสชัน SSH เบื้องหน้าที่คุณใช้งานจริงหรือไม่
Jack M.

จนถึงตอนนี้ฉันยังคงเปิดแท็บสามแท็บ: หนึ่งแท็บสำหรับแต่ละอุโมงค์ งานจริงของฉันส่วนใหญ่เกิดขึ้นใน Eclipse และเบราว์เซอร์
sprugman

(อุโมงค์เป็นเพียงเพื่อให้สามารถเข้าถึงระยะไกลดีบีเอสจากอินสแตนซ์ Tomcat ท้องถิ่นของฉัน.)
sprugman

คำตอบ:


26

เทคนิคนี้ไม่ใช่คำตอบสำหรับคำถามที่ถาม แต่เป็นคำตอบสำหรับปัญหาของคุณตามที่อธิบายไว้ คำสั่ง ssh มีสวิตช์สองตัวที่อาจเป็นประโยชน์กับคุณ:

ssh -f -N -L 3000:server1:5029 me@server2

บอกให้ ssh แฮงค์ในเบื้องหน้านานพอที่จะขอรหัสผ่านที่จำเป็นจากนั้นใส่ตัวเองในพื้นหลังไม่ดำเนินการคำสั่งระยะไกลใด ๆ แต่เพียงจัดการอุโมงค์

หากคุณต้องการให้สิ่งนี้ปรากฏในแท็บคุณอาจต้องการโซลูชันอื่น


ฉันตั้งค่าคีย์ดังนั้นฉันไม่จำเป็นต้องป้อนรหัสผ่าน แต่ดูเหมือนว่าจะใช้งานได้ ขอบคุณ! คำถามหนึ่ง: ฉันจะเข้าถึงอุโมงค์เพื่อดูว่าพวกเขาหมดเวลาหรือสิ้นสุดได้อย่างไร? ทั้งjobsมิได้psรายการที่จับกับพวกเขา ....
sprugman

2
ps -wwajx | grep ssh ควรแสดงให้คุณเห็นกระบวนการแล้วคุณสามารถฆ่าพวกเขาได้ตามที่เห็นสมควร
zzz

2
ฉันต้องการเพิ่มว่าหากคุณละเว้น-fและวางพื้นหลังของกระบวนการผ่าน&ในตอนท้ายคุณสามารถรับ PID ผ่านทาง$!เป็นตัวจัดการเพื่อฆ่ากระบวนการอุโมงค์ในภายหลังในสคริปต์ของคุณ
bk138

6

ฉันขอแนะนำเพียงรวมอุโมงค์ของคุณเข้ากับการเชื่อมต่อ "หนึ่งเดียวกับอะไรก็ตาม" คุณสามารถทำให้เป็นเรื่องง่ายโดยการเพิ่มรายการที่เหมาะสมลงใน~/.ssh/configไฟล์ของคุณ:

Host server2
    HostName 10.1.1.1
    User me
    LocalForward 3000 127.0.0.1:5029
    LocalForward 3001 127.0.0.1:3306

จากนั้นคุณสามารถเข้าสู่ระบบโดยเรียกใช้:

> ssh server2

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

> ssh server2
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3001
Could not request local forwarding.

สิ่งนี้ไม่ทำร้ายอะไรนอกจากดวงตาของคุณ คุณยังสามารถตั้งค่าการส่งต่อเหล่านี้สำหรับเซิร์ฟเวอร์หลายเครื่องโดยเพิ่มบรรทัดที่คล้ายกันสำหรับเซิร์ฟเวอร์อื่น ๆ และมันจะเกิดขึ้นโดยอัตโนมัติ


คำตอบของ @ zzz ดูเหมือนจะทำสิ่งเดียวกันมากกว่าหรือน้อยกว่าและตรงไปตรงมามากกว่าเล็กน้อย ขอบคุณ
sprugman

สิ่งนี้รวมกับตัวเลือก -f -N เป็นวิธีที่ยอดเยี่ยมในการตั้งค่าการส่งต่อสำหรับหลายพอร์ตในหนึ่งช็อต ขอบคุณชาย
narsk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.