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ì
-f
tù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
-f
tù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 $pid
trê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à socat
có 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.sock
và 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 -f
cờ 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 -o
tùy chọn có thể được lưu trong .ssh/config
tệ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
)