Một sửa đổi khác của câu trả lời của @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'
Sạch hơn
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
'
PROS
- Hoạt động trên openssh sớm hơn 6,7 (như CentOS 7)
- Giết socat khi chấm dứt ssh thay vì phải re-ssh vào máy chủ từ xa
- Cho phép đăng nhập ssh không công khai (không giống như giải pháp ijk)
Đặc tính
- Vì -ftùy chọn này không được sử dụng, bạn có thể sử dụng khóa chung và chạy trong nền thông qua&hoặc bạn có thể đăng nhập tương tác và sử dụng Ctrl + Z và sử dụng tương tự$!để lưu trữ pid.
TIÊU DÙNG
- Không thể dễ dàng sử dụng -ftùy chọn ssh, vì bạn sẽ mất pid của ssh theo cách đó. Phương pháp này dựa vào việc chạy ở nền trước và Ctrl + C để tiêu diệt.
- Phức tạp hơn nhiều
Giải trình
- socat ...&- chạy socat trong nền trên máy chủ từ xa
- pid=$!- lưu trữ pid
- trap kill\ $pid 0- chạy- kill $pidtrên chấm dứt bash
- while :; sleep...- ngồi trong một vòng lặp vô hạn
- echo -ne \ \b- Echo không gian theo sau là backspace. Điều này không thành công ngay khi ssh bị ngắt kết nối. Với a- sleep 5, điều này có nghĩa là- socatcó thể chạy tới 5 giây sau ssh
Lưu ý: Trên thực tế thử nghiệm sử dụng Docker, cổng 2375, /var/run/docker.sockvà biến môi trường DOCKER_HOST='tcp://localhost:2375', nhưng nên làm việc cho mysql tất cả cùng
Cập nhật
Sử dụng Điều khiển SSH , bạn có thể sử dụng -fcờ theo cách của tôi, chỉ cần thêm các cờ sau
-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto
Và bạn sẽ nhận được
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'
Bây giờ bạn có thể chấm dứt tất cả các phiên được kiểm soát bằng cách sử dụng
ssh -o ControlPath=~/.ssh/%C -O exit remoteserver
Các -otùy chọn có thể được lưu trong .ssh/configtệp của bạn hoặc bạn có thể sử dụng -S thay thế (nhưng bạn vẫn cần -o ControlMaster)