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

1

Eu estava tentando a seguinte combinação para obter o pid da sessão ssh (rodando em segundo plano exibe o pid) e então fg para voltar para a sessão ssh e introduzir a senha:

ssh targetHost &; fg

Eu recebo o seguinte erro:

-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 com o menor número de linhas possível. Eu preciso começar várias sessões ssh, colocá-las em segundo plano e no final matá-las - é por isso que eu preciso dos pids.

    
por Andreea 30.09.2013 / 16:31

3 respostas

2

Você está misturando dois casos diferentes:

  • foo ; bar será executado foo, espere que ele termine e execute a barra
  • foo & bar vai começar foo, colocar em segundo plano e começar a barra logo em seguida.

Você tem que decidir, use um ou outro. Você não pode fazer as duas coisas. ;)

Para resolver o problema, você pode simplesmente executar todos os trabalhos em segundo plano e 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 kill. Por exemplo, kill %1 irá matar o primeiro processo em segundo plano.

    
por 30.09.2013 / 16:46
1

&; está sempre errado. Se você quiser executar as coisas em segundo plano em um one-liner compacto, omita o ';' completamente e simplesmente use & entre os comandos.

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

# consulte link

    
por 30.09.2013 / 16:35
1

Outros já explicaram porque &; falha. Eu queria que o PID do último processo em segundo plano fosse salvo como $! . Você pode, portanto, sempre acessar o PID do último comando:

ssh targetHost & echo $!; fg

Quanto a matá-los, você pode matar todas as ssh sessões com este comando:

pkill -x ssh

O x faz com que pkill e pgrep correspondam ao nome completo do comando, isso garante que você não eliminará sshd ou ssh-agent . Se você quiser apenas matar conexões com uma máquina específica, você também pode fazer isso:

pkill $(pgrep -alx ssh | grep TARGET_IP | cut -d ' ' -f 1)
    
por 30.09.2013 / 17:26