내 Bash 파일에 다음 줄이 있습니다.
LIST=$(ssh 192.168.0.22 'ls -1 /web');
내가 겪고 있는 문제는 이것이 자동화 스크립트의 일부이고 stdout
필요한 데이터 대신에 종종 이것을 얻는다는 것입니다.
ssh_exchange_identification: Connection closed by remote host
LIST
나는 단지 얻을 수 있다는 것을 알고 있습니다 stdout
. ls
그래서 나는 명령에서 더 많은 정보를 얻을 수 있는 명령을 찾고 있습니다. 특히:
stdout
왜냐면ls
- 지금 갖고 있으니까stderr
- 별로ls
관심이 없고 문제가 없다고 생각합니다.stdout
forssh
- 관심이 없습니다. 무엇을 출력할지조차 모르겠습니다.stderr
ssh
for-이것이 내가 찾고 있는 것이다올바른지 확인하세요ssh
. 비어 있다는 것은$LIST
예상한 데이터 가 있다는 의미입니다.
답변1
Ubuntu 16.04(LTS)의 ssh 매뉴얼 페이지에서:
EXIT STATUS
ssh exits with the exit status of the remote command or with 255 if an error occurred.
ssh
이를 알면 명령의 종료 상태를 확인할 수 있습니다 . 종료 상태가 이면 오류 225
라는 것을 알 수 있고 , 0이 아닌 다른 값이면 오류 ssh
입니다 .ls
#!/bin/bash
TEST=$(ssh $USER@localhost 'ls /proc' 2>&1)
if [ $? -eq 0 ];
then
printf "%s\n" "SSH command successful"
elif [ $? -eq 225 ]
printf "%s\n%s" "SSH failed with following error:" "$TEST"
else
printf "%s\n%s" "ls command failed" "$TEST"
fi
답변2
명령 대체에서 표준 오류를 ssh
파일로 리디렉션한 다음 파일이 비어 있는지 테스트합니다.
output="$( ssh server 'command' 2>ssh.err )"
if [[ -s ssh.err ]]; then
echo 'SSH error:' >&2
cat ssh.err >&2
fi
rm -f ssh.err
SSH error:
그러면 캡처된 오류 출력이 표시됩니다 ssh
.
답변3
약간의 변형이 필요했던 것으로 기억합니다. 이 시도:
cmd 2>>>$errmsg
아마도 삼중 리디렉션일 것입니다. 그것은 수년 전의 일입니다. 오류 메시지는 errmsg 변수에 인쇄되어야 합니다. 어쩌면 내가 틀렸을 수도 있습니다. 이 경우 이 변형은 100% 보장된다는 메시지를 받습니다.
errmsg=`cmd 2>/dev/null`
이 변형은 필요하거나 필요하지 않을 때 오류 메시지를 표시하지 않습니다. 그러나 일반 출력도 캡처할 수 있습니다. 그렇다면 $를 사용하여 두 경우를 구별할 수 있습니까? 주의를 기울여 스크립트를 수정하세요.