尊敬的
pgrep
、
pkill
和
ps | awk
的用户们,我谨代表所有it技术人员向您致敬,但是有一种方法更好。
考虑到如果您依赖于
ps -aux | grep ...
来查找进程,您会面临冲突的风险。您可能有一个使用场景,这种情况不太可能发生,但一般情况下,这不是一个好的选择。
SSH提供了一种管理和控制后台进程的机制。但是像许多SSH东西一样,这是一个“高级”功能,许多人(从这里其他答案中看来)都不知道它的存在。
在我的个人用例中,我有一台工作站,在家里留下一个连接到办公室内部网络的HTTP代理的隧道,还有另一个可以让我快速访问托管服务器上的管理界面的隧道。以下是您可能创建基本隧道的方式:
$ ssh -fNT -L8888:proxyhost:8888 -R22222:localhost:22 officefirewall
$ ssh -fNT -L4431:www1:443 -L4432:www2:443 colocatedserver
这些命令会让ssh进入后台,保持隧道开启。但如果隧道消失了,我就会陷入困境,如果我想找到它,我必须解析我的进程列表,并确保我有“正确”的ssh(以防我意外启动了多个看起来相似的ssh)。
相反,如果我想管理多个连接,我使用SSH的ControlMaster
配置选项,以及控制的-O
命令行选项。例如,在我的~/.ssh/config
文件中加入以下内容:
host officefirewall colocatedserver
ControlMaster auto
ControlPath ~/.ssh/cm_sockets/%r@%h:%p
以上的ssh命令运行后,会在
~/.ssh/cm_sockets/
中留下痕迹,这些痕迹可以提供访问控制,例如:
$ ssh -O check officefirewall
Master running (pid=23980)
$ ssh -O exit officefirewall
Exit request sent.
$ ssh -O check officefirewall
Control socket connect(/home/ghoti/.ssh/cm_socket/ghoti@192.0.2.5:22): No such file or directory
此时,隧道(以及控制SSH会话)已经关闭,无需使用kill
、killall
、pkill
等命令。
将其带回到您的用例中...
您正在建立通信隧道,以便让syngergyc
与TCP端口12345上的syngergys
进行通信。为此,我会执行以下操作:
在您的~/.ssh/config
文件中添加一个条目:
Host otherHosttunnel
HostName otherHost
User otherUser
LocalForward 12345 otherHost:12345
RequestTTY no
ExitOnForwardFailure yes
ControlMaster auto
ControlPath ~/.ssh/cm_sockets/%r@%h:%p
请注意,命令行选项
-L
是使用关键字
LocalForward
处理的,而Control{Master,Path}行则包含在内,以确保在建立隧道后具有控制权。
然后,您可能会将bash脚本修改为以下内容:
#!/bin/bash
if ! ssh -f -N otherHosttunnel; then
echo "ERROR: couldn't start tunnel." >&2
exit 1
else
synergyc localhost
ssh -O exit otherHosttunnel
fi
-f
选项会将隧道放到后台,留下一个套接字在您的ControlPath上,以便稍后关闭隧道。如果ssh失败(可能是由于网络错误或
ExitOnForwardFailure
),则无需退出隧道,但如果它未失败(
else
),则会启动synergyc,然后在其退出后关闭隧道。
您还可以查看SSH选项
LocalCommand
是否可用于直接从ssh配置文件中启动
synergyc
。
.ssh/config
文件中拥有所有这些选项,但作为对OP问题的极简主义方法,配置中只需要ControlMaster
和ControlPath
。 这只是将OP的-O检查更改为ssh -l otherUser -O check OtherHost
。 - Randall