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

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

그래서 자동화 스크립트 중 일부에서 SSH 연결이 중단된 채로 남아 있는 이유가 궁금합니다. 그리고 이상한 문제에 직면하게 됩니다. SSH는 PTY 없이 사용되는 경우 출력 파이프가 닫힐 때 종료되지 않습니다. . 이것은 여기의 다른 여러 질문에서 논의되었지만 적용되는 답변을 찾지 못했습니다. 일부는 -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

관련 정보