스크립트에서 호출된 SSH 종료(SIGPIPE 처리?)

스크립트에서 호출된 SSH 종료(SIGPIPE 처리?)

그래서 자동화된 스크립트 중 일부에 SSH 연결이 남아 있는 이유가 궁금했고 이상한 문제가 발생했습니다. PTY 없이 사용하는 경우 SSH는 출력 파이프가 닫힐 때 종료되지 않습니다. 이것은 여기의 다른 여러 질문에서 이미 논의되었지만 적용 가능한 답변을 찾지 못했습니다. 일부 사람들은 -t옵션을 사용하도록 조언했지만 PTY 및 배관을 요청하면 작동하지 않습니다.

어쨌든 문제를 다음과 같은 최소한의 예로 축소했습니다.

#this works
cat /dev/zero |false

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

SSH가 이미 데드 파이프(거짓으로 이어진 파이프)에 쓰기에서 발생하는 SIGPIPE를 무시하는 이유 또는 이 "작동"을 올바르게 만드는 방법에 대한 설명이 있습니까?

SIGPIPE를 원격 호스트에 "중계"하는 것은 필요하지 않습니다. 간단히 ssh 클라이언트를 종료하면(SIGPIPE를 무시하지 않고 정확히 발생하는 일) 복잡성이 덜하고 "더 정확한" 가정으로 동일한 결과를 얻을 수 있습니다.

귀하의 아이디어에 감사드립니다!

-mk

편집하다: Sun_SSH 서버에서만 발생하며 문서화되지 않은 문제인 것 같습니다. 좋은 해결 방법을 찾고 있습니다.

답변1

내 질문에 답하기: 이것은 Sun SSH의 알려진 문제입니다. 내가 찾은 가장 좋은 해결 방법은 출력에서 ​​"Sun_SSH"를 감지 ssh -V하고 다음과 같이 적용하는 것입니다.

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

다른 쉘이나 더 간단한 상황(쉘에 다른 하위 프로세스가 없는 경우) $$대신 사용할 수도 있습니다 .$BASHPID

관련 정보