ssh 目标主机 &; fg - 不起作用,但为什么呢?

ssh 目标主机 &; fg - 不起作用,但为什么呢?

我尝试了以下组合来获取 ssh 会话的 pid(在后台运行显示 pid),然后使用 fg 返回 ssh 会话并输入密码:

ssh targetHost &; fg

我收到以下错误:

-bash: syntax error near unexpected token `;'

为什么会有“;”在这种情况下无法按预期工作?

我的目标是启动 ssh 会话并了解其 pid,我需要用尽可能少的行来完成此操作。我需要启动几个 ssh 会话,将它们放在后台,最后杀死它们 - 这就是我需要 pid 的原因。

答案1

您混淆了两种不同的情况:

  • foo ; bar将运行 foo,等待它完成,然后运行 ​​bar
  • foo & bar将启动 foo,将其置于后台,然后直接启动 bar。

您必须决定是使用其中一种还是另一种。你不能两者兼得。 ;)

要解决您的问题,您只需在后台运行所有作业,然后使用job列出 pid:

michas@lenny:~$ sleep 10 &
[1] 18007
michas@lenny:~$ sleep 10 &
[2] 18011
michas@lenny:~$ sleep 10 &
[3] 18015
michas@lenny:~$ sleep 10 &
[4] 18019
michas@lenny:~$ sleep 10 &
[5] 18026
michas@lenny:~$ jobs -p
18007
18011
18015
18019
18026
michas@lenny:~$ 

您也不一定需要 pid 来发送终止信号。例如kill %1将杀死第一个后台进程。

答案2

&;总是错的。如果您想在后台以紧凑的一行方式运行某些内容,请省略“;”完全且简单地&在命令之间使用。

for i in ./*; do my_command "$i" & done

# 看http://mywiki.wooledge.org/BashPitfalls

答案3

其他人已经解释了&;失败的原因。我想指出最后一个后台进程的 PID 保存为$!.因此,您始终可以访问最后一个命令的 PID:

ssh targetHost & echo $!; fg

至于杀死它们,您可以ssh使用以下命令杀死所有会话:

pkill -x ssh

原因并匹配完整的命令名称,这确保您不会x杀死或。如果您只想终止与特定计算机的连接,您也可以这样做:pkillpgrepsshdssh-agent

pkill $(pgrep -alx ssh | grep TARGET_IP | cut -d ' ' -f 1)

相关内容