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

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

então eu queria saber por que ainda há alguma conexão SSH suspensa em alguns dos meus scripts automatizados e me deparei com 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 aconselharam usar -ta opção, mas que solicita o PTY e a tubulação não funciona.

De qualquer forma, reduzi o problema a seguir um exemplo mínimo:

#this works
cat /dev/zero |false

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

Existe alguma explicação de por que o SSH ignoraria o SIGPIPE que passa da gravação para o pipe já morto (aquele que levou ao falso), ou algum método para fazer isso "funcionar" corretamente?

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

Obrigado por suas ideias!

-mk

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

Responder1

Respondendo à minha própria pergunta: Este é um problema conhecido do Sun SSH. A melhor solução que encontrei é detectar "Sun_SSH" na saída ssh -Ve aplicar algo assim:

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

Você também pode usar $$em vez de $BASHPIDem outros shells ou em situações mais simples (se o seu shell não tiver outros processos filhos).

informação relacionada