Eu estava tentando a seguinte combinação para obter o pid da sessão ssh (executar em segundo plano exibe o pid) e depois fg para voltar à sessão ssh e inserir a senha:
ssh targetHost &; fg
Estou tendo o erro a seguir:
-bash: syntax error near unexpected token `;'
Por que o ";" não funciona como esperado neste caso?
Meu objetivo é iniciar uma sessão ssh e conhecer seu pid e preciso fazer isso no mínimo de linhas possível. Preciso iniciar várias sessões ssh, colocá-las em segundo plano e no final matá-las - é por isso que preciso dos pids.
Responder1
Você está confundindo dois casos diferentes:
foo ; bar
irá rodar foo, esperar terminar e então rodar barfoo & bar
irá iniciar foo, colocá-lo em segundo plano e iniciar a barra logo em seguida.
Você tem que decidir se usa um ou outro. Você não pode fazer as duas coisas. ;)
Para resolver seu problema, você pode simplesmente executar todos os trabalhos em segundo plano e depois usar job
para listar os pids:
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:~$
Você também não precisa necessariamente dos pids para enviar sinais de eliminação. Por exemplo, kill %1
matará o primeiro processo em segundo plano.
Responder2
&;
está sempre errado. Se você quiser executar coisas em segundo plano em uma linha compacta, omita o ';' inteiramente e simplesmente use &
entre comandos.
for i in ./*; do my_command "$i" & done
Responder3
Outros já explicaram por que &;
falha. Eu queria salientar que o PID do último processo em segundo plano é salvo como $!
. Você pode, portanto, sempre acessar o PID do último comando:
ssh targetHost & echo $!; fg
Quanto a matá-los, você pode matar todas ssh
as sessões com este comando:
pkill -x ssh
As x
causas pkill
e pgrep
para corresponder ao nome completo do comando, isso garante que você não matará sshd
ou ssh-agent
. Se você quiser apenas eliminar conexões com uma máquina específica, você também pode fazer o seguinte:
pkill $(pgrep -alx ssh | grep TARGET_IP | cut -d ' ' -f 1)