Terminando o SSH chamado de um script (manipulação do SIGPIPE?)

3

Então eu fiquei me perguntando por que ainda há alguns pendentes de conexão SSH em alguns dos meus scripts automatizados e cheguei a um problema estranho - o SSH, se usado sem PTY, não termina quando o canal de saída é fechado. Isso já foi discutido em várias outras questões aqui, mas não encontrei uma resposta aplicável - algumas pessoas são aconselhadas a usar a opção -t , mas que solicita que o PTY e a tubulação não funcionem.

De qualquer forma, reduzi o problema para o exemplo mínimo:

#this works
cat /dev/zero |false

#this never terminates
ssh user@host "cat /dev/zero" |false

Existe alguma explicação por que o SSH ignoraria o SIGPIPE que passa da gravação para o pipe já morto (aquele que levou a false) ou qualquer método para fazer esse "trabalho" corretamente?

Note que "retransmitir" o SIGPIPE para o host remoto não é necessário - simplesmente matar o cliente ssh (que é exatamente o que aconteceria sem ignorar os SIGPIPEs) leva ao mesmo resultado com menos complexidade e algumas suposições "mais corretas".

Obrigado pelas suas ideias!

-mk

EDIT : acontece apenas no servidor Sun_SSH, parece algum tipo de problema não documentado. Estou procurando uma boa solução alternativa.

    
por exa 12.10.2014 / 12:56

1 resposta

1

Respondendo a minha própria pergunta: esse é um problema conhecido com o Sun SSH. A melhor solução encontrada é detectar "Sun_SSH" na saída de ssh -V e aplicar algo assim:

#!/bin/bash
# ....
( ssh host 'localCommand' | remoteCommand || pkill -P $BASHPID )

Você também pode usar $$ em vez de $BASHPID em outros shells ou em situações mais simples (se seu shell não tiver nenhum outro processo filho).

    
por 12.10.2014 / 15:40