비대화형으로 SSH 연결을 설정할 수 없는 경우 bash 스크립트를 중지합니다.

비대화형으로 SSH 연결을 설정할 수 없는 경우 bash 스크립트를 중지합니다.

스크립트 작업 중 특정 시점에 git을 통해 SSH 연결을 설정하는 Bash 스크립트를 개발 중입니다. 스크립트의 마지막 부분이 실패하기 전에 스크립트를 중지하여 발생할 수 있는 일부 오류를 정상적으로 처리하려고 합니다.

git push어떤 시점에서는 SSH를 통해 푸시를 시작하는 데 사용된 것과 유사한 명령을 실행합니다 . 새 호스트에 처음으로 연결하는 경우 호스트의 유효성을 확인하라는 대화형 프롬프트가 표시될 수 있습니다.

RSA key fingerprint is 96:a9:23:5c:cc:d1:0a:d4:70:22:93:e9:9e:1e:74:2f.
Are you sure you want to continue connecting (yes/no)? yes

SSH 호스트가 이전에 사용자 승인을 받지 못한 경우 SSH 프롬프트를 피하거나 스크립트를 조기에 실패시키는 방법에 대한 아이디어를 찾고 있습니다.

나는 살펴보았다이 문제. 틀림없이 이 질문은 그 질문과 중복되지만 거기에 나열된 솔루션은 제 경우에는 작동하지 않습니다. 프롬프트 없이는 SSH 연결을 설정할 수 없으며 이 경우 실패한다는 것을 감지하고 싶습니다.

답변1

따라서 호스트를 자동으로 추가하고 싶지 않고 known_hosts호스트가 아직 존재하지 않으면 연결이 실패하도록 만들고 싶습니다. (링크된 질문에 표시된 대로) 이 작업을 StrictHostKeyChecking수행할 수 있는 옵션이 여전히 있지만 . 호스트 키를 알 수 없으면 연결이 실패하게 됩니다.noyes

$ ssh -oStrictHostKeyChecking=yes [email protected]
No ECDSA host key is known for somehost.somewhere and you have requested strict checking.
Host key verification failed.

ssh오류가 발생하면(이 경우 포함) 상태 255로 종료되므로 스크립트에서 다음과 같이 테스트할 수 있습니다.

if [ "$?" = 255 ] ; then
    echo "there was an error"
fi

물론 다른 오류가 있을 수 있으므로 ssh이를 확인하려면 출력을 확인해야 합니다.

답변2

OpenSSH 클라이언트는 터미널이나 X11 디스플레이를 통해 사용자에게 메시지를 표시할 수 있습니다. 사용자에게 프롬프트가 표시되지 않도록 하려면 터미널과 X 디스플레이를 제어하지 않고 클라이언트를 실행하도록 준비하십시오. X 디스플레이를 제거하는 것은 쉽습니다. DISPLAY환경 변수를 설정 해제하거나 빈 문자열로 설정하세요. 제어 터미널 없이 프로세스를 실행하려면 별도의 세션에서 실행하세요. 이를 수행할 수 있는 POSIX 유틸리티는 없지만 Linux에는 하나가 있습니다.setsid유용.

DISPLAY= setsid ssh …

자체 세션에서 SSH 클라이언트를 실행하면 자체 프로세스 그룹에서도 실행됩니다. + 사용의 주요 실제 결과는 setsid대화형 셸에서 스크립트를 실행하는 경우 Ctrl+가 CSSH 클라이언트를 종료하지 않는다는 것입니다. SSH 클라이언트를 종료하려면 스크립트에 SIGINT 트랩을 배치해야 합니다.

ssh_pid=
trap INT TERM 'if [ -n "$ssh_pid" ]; then kill "$ssh_pid"; fi'
DISPLAY= setsid ssh … &
wait "$ssh_pid"
unset ssh_pid

ssh호스트 키 확인 실패로 인해 연결을 설정할 수 없는 경우 상태 코드 0이 반환되므로 주의하세요 . 명령이 성공했는지 확인하려면 다른 방법을 사용해야 합니다.

관련 정보