การแก้ไขอีกคำตอบของ @mpontes '/ @ javier นั้น
ssh user@remoteserver -L 9999:localhost:9999 'socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'
ทำความสะอาด
ssh user@remoteserver -L 9999:localhost:9999 '
socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock&
pid=$!
trap "kill $pid" 0
while echo -ne " \b"; do
sleep 5
done
'
ข้อดี
- ทำงานบน openssh ก่อนหน้า 6.7 (เช่น CentOS 7)
- ฆ่า socat เมื่อยกเลิก ssh แทนที่จะต้อง re-ssh เข้าไปในรีโมตเซิร์ฟเวอร์
- อนุญาตการลงชื่อเข้าใช้แบบสาธารณะ ssh (ไม่เหมือนกับโซลูชัน ijk)
ลักษณะ
- เนื่องจาก
-f
ไม่ได้ใช้ตัวเลือกคุณสามารถใช้พับลิกคีย์และรันในพื้นหลังผ่าน&
หรือคุณสามารถล็อกอินแบบโต้ตอบและใช้ Ctrl + Z และใช้แบบเดียวกัน$!
เพื่อเก็บ pid
ข้อเสีย
- ไม่สามารถใช้
-f
ตัวเลือก ssh ได้อย่างง่ายดายเนื่องจากคุณจะสูญเสีย pid ของ ssh ด้วยวิธีนั้น วิธีนี้อาศัยการทำงานในเบื้องหน้าและ Ctrl + C เพื่อฆ่า
- ไกลยิ่งซับซ้อน
คำอธิบาย
socat ...&
- เรียกใช้ socat ในพื้นหลังบนเซิร์ฟเวอร์ระยะไกล
pid=$!
- เก็บ pid
trap kill\ $pid 0
- ทำงานkill $pid
เมื่อสิ้นสุดการทุบตี
while :; sleep...
- นั่งในวงวนไม่สิ้นสุด
echo -ne \ \b
- พื้นที่ Echo ตามด้วย backspace สิ่งนี้จะล้มเหลวทันทีที่ยกเลิกการเชื่อมต่อ ssh ด้วย a sleep 5
หมายความว่าsocat
สามารถทำงานได้นานถึง 5 วินาทีหลังจาก ssh
หมายเหตุ:การทดสอบจริงโดยใช้นักเทียบท่าพอร์ต2375
, /var/run/docker.sock
และตัวแปรสภาพแวดล้อมDOCKER_HOST='tcp://localhost:2375'
แต่ควรจะทำงานสำหรับ MySQL เหมือนกันทั้งหมด
ปรับปรุง
ใช้การควบคุม SSHคุณสามารถใช้การ-f
ตั้งค่าสถานะโดยใช้วิธีของฉันเพียงเพิ่มการตั้งค่าสถานะต่อไปนี้
-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto
และคุณจะได้รับ
ssh -f -o ControlPath=~/.ssh/%C -o ControlMaster=auto user@remoteserver -L 9999:localhost:9999 'set -m; socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'
ตอนนี้คุณสามารถยุติเซสชันที่ควบคุมทั้งหมดโดยใช้
ssh -o ControlPath=~/.ssh/%C -O exit remoteserver
-o
ตัวเลือกที่สามารถบันทึกไว้ในของคุณ.ssh/config
แฟ้มหรือคุณสามารถใช้ -S แทน ( แต่คุณจะยังคงจำเป็น-o ControlMaster
)