ssh "-f"는 stdout/stderr을 들을 때 bash에서 폴백하지 않습니다.

ssh "-f"는 stdout/stderr을 들을 때 bash에서 폴백하지 않습니다.

다음을 참조하십시오:

## Does NOT return to the shell, but Ctrl-C can exit
ssh -S none -fNR 13018:localhost:22 example.com | cat

## Returns to the shell (no "-S none")
ssh         -fNR 13019:localhost:22 example.com | cat

## Returns to the shell (no "| cat")
ssh -S none -fNR 13020:localhost:22 example.com

첫 번째 명령이 셸로 반환되지 않는 이유는 무엇입니까? 다른 쉘처럼 쉘로 돌아가기를 원합니다(예:-f 명령이 실행되기 전에 SSH에 백그라운드로 들어가도록 요청합니다.)은 제가 제공한 3가지 예에 존재하며 출력을 리디렉션할 때 비정상적으로 동작하는 것 같습니다(여기에서는 로 표시됨 | cat). 이것은 -S none관련 옵션은 아니지만(특히 -S noneControlMaster 옵션이 설정되어 있지 않기 때문에 이것이 기본 동작이어야 하기 때문에) 여전히 변경되는 것 같습니다 -f.

마지막 명령의 stdout/stderr을 캡처하고 해당 명령이 출력에 따라 반응할 수 있도록 셸로 반환되도록 하는 방법이 있습니까?

전체 이야기:

SSH 터널을 실행하고 싶습니다. 실패하면 사용 중인 포트와 관련이 있는지 확인하세요. 이 경우 다른 포트를 사용해 보겠습니다. 고유하지 않기 때문에 오류 수준을 사용할 수 없으며 stderr을 캡처하려고 할 때 명확하지 않게 동작하는 ssh를 실행합니다. 심지어 가짜처럼 보입니다( -S none사용하는 것과 사용하지 않는 것 사이에 아무 것도 없어야 합니다. 차이점은 다음과 같습니다. 기본값인 경우 내 ~/.ssh/config값이 비어 있고 관련 옵션이 설정 /etc/ssh/ssh_config되지 않은 것을 확인했습니다 ControlMaster.)

편집하다:

  • 설명된 두 번째 예를 재현할 수 없는 것 같습니다. 때때로 프로세스가 ssh종료됩니까?앞으로때때로뒤쪽에 cat프로세스가 파이프를 열까요?

답변1

이상하게도 내가 이해하지 못하는 것은 두 번째 예제가 쉘로 반환되는 이유입니다(재현할 수 없음).

SSH 프로세스는 실행하는 동안 백그라운드에 남아 있습니다 ssh -S none -fNR 13018:localhost:22 example.com | cat. 여전히 파이프의 쓰기 쪽이 열려 있습니다. 따라서 cat파일의 끝이 표준 입력에 표시되지 않으므로 계속해서 읽습니다.

Ctrl+를 눌러 프로세스를 C종료합니다 cat(백그라운드 SSH 프로세스가 자체 프로세스 그룹으로 이동되고 포그라운드 SSH 프로세스가 분기되면 종료되기 때문에 이것은 여전히 ​​실행 중인 작업의 유일한 부분입니다). 백그라운드 ssh 프로세스가 표준 출력에 쓰기를 시도하면(때문에 -N) EPIPE로 인해 쓰기가 실패합니다(ssh가 SIGPIPE를 차단함). 백그라운드 SSH 프로세스를 종료하면 해당 cat프로세스도 종료됩니다.

관련 정보