我嘗試使用以下組合來獲取 ssh 會話的 pid(在後台運行顯示 pid),然後使用 fg 返回 ssh 會話並引入密碼:
ssh targetHost &; fg
我收到以下錯誤:
-bash: syntax error near unexpected token `;'
為什麼會有“;”在這種情況下無法如預期般工作?
我的目標是啟動 ssh 會話並了解其 pid,我需要用盡可能少的行來完成此操作。我需要啟動幾個 ssh 會話,將它們放在後台,最後殺死它們 - 這就是我需要 pid 的原因。
答案1
您混淆了兩種不同的情況:
foo ; bar
將運行 foo,等待它完成,然後運行 barfoo & 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
答案3
其他人已經解釋了&;
失敗的原因。我想指出最後一個後台進程的 PID 保存為$!
.因此,您始終可以存取最後一個命令的 PID:
ssh targetHost & echo $!; fg
至於殺死它們,您可以ssh
使用以下命令殺死所有會話:
pkill -x ssh
原因並匹配完整的命令名稱,這確保您不會x
殺死或。如果您只想終止與特定電腦的連接,您也可以這樣做:pkill
pgrep
sshd
ssh-agent
pkill $(pgrep -alx ssh | grep TARGET_IP | cut -d ' ' -f 1)