@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
'
优点
- 在6.7之前的opensh上运行(例如CentOS 7)
- 在ssh终止时杀死socat,而不必重新SSH到远程服务器
- 允许非公共ssh登录(与ijk解决方案不同)
特征
- 由于
-f
未使用该选项,因此您可以使用公共密钥并通过在后台运行,&
也可以交互式登录并使用Ctrl + Z并使用该密钥$!
来存储pid。
缺点
- 不能轻易使用
-f
ssh选项,因为那样会失去ssh的能力。此方法依赖于在前台运行并按Ctrl + C杀死。
- 更复杂
说明
socat ...&
-在远程服务器上的后台运行socat
pid=$!
-存储pid
trap kill\ $pid 0
- kill $pid
在bash终止上运行
while :; sleep...
-无限循环
echo -ne \ \b
-回声空间,后退空格。SSH断开连接后,此操作将失败。使用sleep 5
,这意味着socat
ssh后最多可以运行5秒
注意:实际使用docker,port 2375
,/var/run/docker.sock
和environment变量进行了测试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
)