การแก้ไขอีกคำตอบของ @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)