如何通过Shell脚本将隧道作为后台进程进行管理?


19

我需要从shell脚本中设置几个ssh-tunnels。我尝试使用以下命令将其作为bg任务运行:

#!/bin/sh
ssh -L 3000:server1:5029 me@server2 &
ssh -L 3001:server3:3306 me@server2 &

但是当我以这种方式启动隧道时,它们似乎无法正常工作。

当我在自己的选项卡中手动设置它们时,它们可以正常工作,所以我的下一个想法是让脚本在终端中打开新的选项卡,并在其中运行命令作为前台进程。

注意:这个问题最初是“如何从外壳启动新的终端选项卡,然后在其中运行命令?”,但是我得到了有关处理隧道的两个答案。对于“打开外壳”问题,我在SuperUser上发现了问题,问题将起作用,尽管后台的新选项卡比打开的前景窗口更可取。


您是否保持与服务器的活动SSH会话?意思是,您是否在后台运行隧道,并在实际工作中使用前台SSH会话?
杰克

到现在为止,我一直打开三个选项卡:每个隧道一个,另外一个用于其他任何选项。我的大部分实际工作都是在Eclipse和浏览器中进行的。
sprugman 2011年

(仅使用隧道,因此我可以从本地Tomcat实例访问一些远程数据库。)
sprugman 2011年

Answers:


26

从技术上讲,这不是对所提问题的解答,而是对所描述问题的解答。ssh命令有两个可能对您有用的开关:

ssh -f -N -L 3000:server1:5029 me@server2

告诉ssh在前台闲逛足够长的时间以询问任何必要的密码,然后将其置于后台,而不是执行任何远程命令,而只是处理隧道。

如果您确实希望将其显示在选项卡中,则可能需要其他解决方案。


我设置了密钥,因此不需要输入密码,但这似乎可行。谢谢!一个问题:如何访问隧道以查看隧道是否超时或结束隧道等?无论是jobsps列出了把手给他们....
sprugman

2
ps -wwajx | grep ssh应该向您显示进程,然后您可以根据需要将其杀死。
zzz

2
我想补充一点,如果您最后省略-f并通过后台处理&,则可以通过$!稍后获取PID 作为句柄,以稍后在脚本中终止隧道处理。
bk138 '18

6

我建议您将隧道简单地集成到“一个随便一个”连接中。您可以通过在~/.ssh/config文件中添加适当的条目来简化操作:

Host server2
    HostName 10.1.1.1
    User me
    LocalForward 3000 127.0.0.1:5029
    LocalForward 3001 127.0.0.1:3306

然后,您只需运行以下命令即可登录:

> ssh server2

隧道应该启动并开始工作,只剩下一个SSH实例,您可以在其中执行“任何操作”。但是,如果您需要打开与的第二个连接server2,则可能会收到错误消息:

> ssh server2
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3001
Could not request local forwarding.

这不会伤害到您的眼睛。您还可以通过为其他服务器添加类似的行来为多台服务器设置这些转发,这将自动发生。


@zzz的答案似乎或多或少都在做同样的事情,并且更加直接。谢谢,不过。
sprugman 2011年

结合使用-f -N选项,这是一种极好的设置一次转发多个端口的方法。谢啦。
纳尔斯克,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.