![永久后台 ssh 连接创建反向隧道:正确的方法是什么?](https://linux22.com/image/37485/%E6%B0%B8%E4%B9%85%E5%90%8E%E5%8F%B0%20ssh%20%E8%BF%9E%E6%8E%A5%E5%88%9B%E5%BB%BA%E5%8F%8D%E5%90%91%E9%9A%A7%E9%81%93%EF%BC%9A%E6%AD%A3%E7%A1%AE%E7%9A%84%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
相关问题:启动服务器到客户端的 ssh 连接
那里的答案对我帮助很大,这个命令满足我的需要:
ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
所以我写了一个脚本来一直重新连接:
#!/bin/bash
while true; do
echo "try to connect..."
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
echo "restarting in 5 seconds.."
sleep 5
done
并将其添加到/etc/crontab
.但我发现,只要我从 shell 中“手动”执行它,它就可以工作,但如果它是由 cron 调用的,则 ssh 连接并立即完成。 (因此,上面的脚本始终重新连接)
从man ssh
,我发现对于后台连接,我应该用-n
key 调用它,但这没有帮助。然后,我只是四处寻找类似的脚本,我发现如果我调用tail -f something
,即一些“永无止境”的命令,它就可以工作,所以我只是创建了空文件/tmp/dummy_file
,现在我的 ssh 命令如下所示:
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
现在可以了!但是,这个解决方案看起来有点丑陋,而且我并不真正理解这种行为的实际原因。只是偶然,我尝试调用bash
而不是tail -f
(bash
在我看来也是“永无止境”的命令),但它不起作用。
那么,任何人都可以解释一下这种行为,以及创建后台 ssh 连接以保持反向 ssh 隧道正常运行的正确方法是什么?
答案1
听起来您想要-N
ssh 选项。
-N Do not execute a remote command. This is useful for just forwarding ports
(protocol version 2 only).
答案2
我强烈建议你考虑autossh
。它具有某些启发式方法,可以确定连接丢失是否是根本原因,并降低重新连接尝试的频率。此外,它还使用额外的隧道来监视连接,这使得它对于您所询问的场景非常有用。
例如,如果您使用的是 Ubuntu,则可以进行网络搜索以autossh upstart
查找一些有关如何配置 Ubuntu 的有用示例,以便以持久的方式保持隧道。
我使用它来为某些服务始终保持与我的服务器打开的隧道连接。
答案3
我会第二@0xC0000022L的建议并使用autossh
。当我将笔记本电脑从一个地方带到另一个地方时,我用它来维持与笔记本电脑的 SSH 连接,并且它可以正常工作。我使用此连接通过隧道返回端口 25 和 2143,以访问我的个人 SMTP 和 IMAP 服务器。
这是我使用的脚本:
$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash
autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o
然后,我Host
在$HOME/.ssh/config
文件中维护一个 host条目imap-o
。
$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes
GatewayPorts yes
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa
Host imap-o
User sam
ProxyCommand ssh [email protected] nc `echo %h|sed 's/-o//'` %p
autossh_mail.sh
当我登录时,该脚本将作为我的桌面的一部分运行。您可以通过 访问它gnome-session-properties
。