快速的问题 – 我运行两个Linux的盒子,一个我自己的桌面和其他我的VPS。 出于VPS端的安全原因,我select了与MySQL的套接字连接( /var/run/mysqld/mysql.sock
)。 我知道我可以像这样隧道: ssh -L 3307:127.0.0.1:3306 [email protected]
如果我设置远程SQL服务器来侦听某个端口,但我想知道的是我可以这样做: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sock
从而隧道两个套接字,而不是两个端口?
一个完全可以接受的解决scheme也将本地端口转发到远程套接字文件,但在可能的情况下,我试图不在远程框上运行TCP服务器。
(是的,我知道tcp会更容易)。
socat
export SOCKET_DIR=~/.remote-sockets socat "UNIX-LISTEN:$SOCKET_DIR/mysqld.sock,reuseaddr,fork" \ EXEC:'ssh user@server socat STDIO UNIX-CONNECT\:/var/run/mysqld/mysqld.sock'
然后
mysql -S $SOCKET_DIR/mysqld.sock -u mysqluser -p
用ssh和socat转发unix域套接字被盗
在那个时候,当问题被问到的时候,这是不可能的,但现在是可能的。
你可以同时使用:UNIX => TCP和UNIX => UNIX转发。
例如:
ssh \ -R/var/run/mysql.sock:/var/run/mysql.sock \ -R127.0.0.1:3306:/var/run/mysql.sock \ somehost
从OpenSSH 6.7开始是可能的。
我没有这样做,但我会尝试与socat 。 也许是这样的:
ssh [email protected] -L 9999:localhost:9999 "socat TCP-LISTEN:localhost:9999 UNIX-CONNECT:/var/run/mysqld/mysql.sock" socat UNIX-LISTEN:/path/to/local/socket TCP:localhost:9999
再次,我从来没有做过这样的事情。
哈维尔的答案详细阐述,这对我的作品:
ssh -f [email protected] -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"
您需要fork
才能在closures第一个连接后多次连接而无需死亡。 此外,socat让你指定一个地址绑定的方式是通过bind
选项,而不是作为端口之前的地址。
在这之后,只要正常连接到localhost:9999
。 然后去拆卸隧道
ssh -f [email protected] "killall socat"
(或类似的东西,你可以做更复杂的事情,涉及保持社会的PID)
是的,你可以使用socat。
首先用SSH进行TCP隧道。 然后使用这样的socat:
socat unix-listen:/var/run/mysqld/mysqld.sock,fork,unlink-early tcp:127.0.0.1:3306
然后授予新创build的套接字(chmod 777可能)
从ssh 6.7开始,不再需要socat了。 您可以直接转发unix域套接字,如:
ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock user@someremote
更多信息: https : //medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160
@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 '
-f
选项,您可以使用公钥并通过&
在后台运行,也可以交互式login并使用Ctrl + Z并使用相同的$!
存储的PID。 -f
ssh选项,因为这样会丢失ssh的pid。 这种方法依赖于在前台运行和Ctrl + C来杀死。 socat ...&
– 在远程服务器的后台运行socat pid=$!
– 存储pid trap kill\ $pid 0
– 在bash终止时运行kill $pid
while :; sleep...
while :; sleep...
– 坐在一个无限循环 echo -ne \ \b
– 回显空格,后跟退格键。 一旦ssh断开连接就会失败。 在sleep 5
,这意味着socat
可以在ssh之后运行5秒钟 注意:实际上使用docker,端口2375
,/ DOCKER_HOST='tcp://localhost:2375'
和环境variablesDOCKER_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
)