ssh targetHost &; fg - não funciona, mas por quê?

ssh targetHost &; fg - não funciona, mas por quê?

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 ; barirá rodar foo, esperar terminar e então rodar bar
  • foo & barirá 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 jobpara 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 %1matará 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

# verhttp://mywiki.wooledge.org/BashPitfalls

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 sshas sessões com este comando:

pkill -x ssh

As xcausas pkille pgreppara corresponder ao nome completo do comando, isso garante que você não matará sshdou 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)

informação relacionada