[bash] SSH 연결을 확인하기 위해 bash 스크립트를 만드는 방법은 무엇입니까?

원격 컴퓨터에 로그인하고 개인 및 공개 키를 만드는 bash 스크립트를 만드는 중입니다.

내 문제는 원격 시스템이 그다지 신뢰할 수 없으며 항상 작동하지 않는다는 것입니다. SSH 연결이 작동하는지 확인하는 bash 스크립트가 필요합니다. 나중에 사용하기 위해 실제로 키를 만들기 전에.



답변

ssh가 제공하는 반환 값으로 이것을 확인할 수 있습니다.

$ ssh -q user@downhost exit
$ echo $?
255

$ ssh -q user@uphost exit
$ echo $?
0

편집 : 또 다른 접근 방식은 nmap을 사용하는 것입니다 (키나 로그인 항목이 필요하지 않음).

$ a=`nmap uphost -PN -p ssh | grep open`
$ b=`nmap downhost -PN -p ssh | grep open`

$ echo $a
22/tcp open ssh
$ echo $b
(empty string)

그러나 메시지를 grep해야합니다 (nmap은 포트가 필터링되었는지, 닫혔는지 또는 열려 있는지 표시하기 위해 반환 값을 사용하지 않습니다).

EDIT2 :

당신은 SSH 포트의 실제 상태에 관심이 있다면, 당신은 대체 할 수 grep open와 함께 egrep 'open|closed|filtered':

$ nmap host -PN -p ssh | egrep 'open|closed|filtered'

완전하게.


답변

ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK


답변

다음과 같이 사용할 수 있습니다.

$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

ssh 연결이 정상이면 “ok”를 출력합니다.


답변

@Adrià Cidre당신 의 응답을 보완하면 다음을 수행 할 수 있습니다.

status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

if [[ $status == ok ]] ; then
  echo auth ok, do something
elif [[ $status == "Permission denied"* ]] ; then
  echo no_auth
else
  echo other_error
fi


답변

시험:

echo quit | telnet IP 22 2>/dev/null | grep Connected


답변

아래 ssh명령 0에는 성공적인 연결에 대한 종료 코드가 있어야하고 그렇지 않으면 0이 아닌 값 이 있어야합니다 .

ssh -q -o BatchMode=yes user@remote.com exit

if [ $? != "0" ]; then
    echo "Connection failed"
fi


답변

누군가 원격 컴퓨터에서 포트 22가 열려 있는지 확인하려는 경우에만이 간단한 netcat 명령이 유용합니다. nmap과 telnet을 사용할 수 없었기 때문에 사용했습니다. 또한 내 ssh 구성은 키보드 비밀번호 인증을 사용합니다.

GUESSWHOz가 제안한 솔루션의 변형입니다.

nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"