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

StackOverflow https://stackoverflow.com/questions/1405324

  •  05-07-2019
  •  | 
  •  

문제

나는 원격 기계에 로그인하고 개인 및 공개 키를 만들 수있는 bash 스크립트를 만드는 과정에 있습니다.

내 문제는 원격 기계가 신뢰할 수 없으며 항상 올라오는 것은 아니라는 것입니다. SSH 연결이 올라 있는지 확인하는 Bash 스크립트가 필요합니다. 실제로 향후 사용을위한 키를 만들기 전에.

도움이 되었습니까?

해결책

Return-Value 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)

그러나 메시지를 방목해야합니다 (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

누군가가 원격 시스템에서 포트 22가 열려 있는지 확인하기를 원하는 경우이 간단한 NetCat 명령은 유용합니다. NMAP와 TELNET을 사용할 수 없었기 때문에 사용했습니다. 또한 SSH 구성은 키보드 비밀번호 인증을 사용합니다.

추측이 제안한 솔루션의 변형입니다.

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

원격 폴더가 존재하거나 다른 파일 테스트가 실제로 확인하려면 다음과 같습니다.

if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
    # exists
else
    # doesn't exist
fi

인용문을 잊지 마십시오 "$(ssh ...)".

여러 인터페이스가있는 서버에 연결합니다

ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51

Bash 4+ 스크립트 사용 예 :

# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)

# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
    echo "It's Open! Let's SSH to it.."
else
    echo "The host ${ip} is not accessible!"
fi

여기서 잘못된 문제를 해결하려고하는 것 같습니다. SSH 데몬을 더 안정적으로 만들려고하지 않아야합니까? 같은 것을 실행해보십시오 모니트, 데몬이 실행 중인지 확인하고 그렇지 않은 경우 다시 시작하는지 확인합니다 (SSHD 뒤에서 루트 문제를 찾을 시간을 제공합니다). 아니면 네트워크 서비스가 번거롭습니까? 보십시오 man ifup. 빌어 먹을 것이 당신을 닫는 것을 좋아합니까? 글쎄, 그것은 더 큰 문제입니다 ... 통나무 (syslog로 시작)를보고 박스 렌을 종료하는 하드웨어 고장이나 서비스를 찾으십시오 (온도 모니터 일 수 있습니까?).

스크립트 결함을 허용하는 것은 훌륭하지만 Boxen 결함을 허용 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top