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


86

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

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


2
일반적으로 ssh-keygen로컬 컴퓨터에서 키 쌍을 생성 한 다음 ssh-copy-id공개 키를 원격 컴퓨터에 복사하기 위해 실행 됩니다 . 당신은 일을 다르게하고있는 것 같습니다. 왜, 당신의 목표는 무엇입니까?
ephemient

1
원격 컴퓨터가 연결을 설정하는 방법을 분명히 변경하고 있으므로 mosh 배포를 고려하십시오 . mosh.mit.edu 불안정한 연결에서 SSH를 보완하기위한 것입니다. 나는 그것에 대해 아주 좋은 경험이 있습니다.
Aeyoun 2013-08-13

나는 그것이 조금 늦게 알고 있지만, 그들은 중요한 것을 매우 간단 보인다 @ephemient 하지 로컬 컴퓨터 또는 하지 로컬 사용자.
버려진 카트

답변:


170

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에 실패를 의미하는지 나타낼 수 있습니까?
Henley Chiu

SSH 시도가 멈 추면 어떻게 될지 궁금하십니까?
Sibbs Gambling

2
좋은 대답! 그러나 ssh다운 된 호스트로의 시도는 60 초와 같은 시간 초과 후에 만 ​​실패 한다는 것을 언급하지 않습니다 . 이는 일부 사용에서는 금지 될 수 있습니다. 또한 호스트 이름이에 정의 된 경우 ~/.ssh/config첫 번째 ssh방법은 작동하지만 두 번째 nmap방법은 Failed to resolve "<hostname>".
ssc

1
명령에 대한 설명이 전혀 없습니다 ... 또는 실제로 수행중인 작업 .. 무엇 $?입니까? etc
Toskan

더 간결한 # 1 : ssh -q user@downhost exit | echo $? 연결 결과를 echo로 파이프
philn5d

22
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

2
한 줄 출력 : (ssh -q -o "BatchMode = yes"-o "ConnectTimeout = 3"user@host.com "echo 2> & 1"&& echo SSH_OK || echo SSH_NOK) | 꼬리 -n1
XDG

21

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

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

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


14

@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

7

시험:

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

1
이 방법의 문제는 (즉,을 / etc / SSH / 설정이나 ~ / 스푸핑 / 설정) ssh_config를 정의 호스트 인식하지 못하는 것입니다
땡 - 이순신 첸

1

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

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

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

큰! 대상 포트가 필터링되는 경우 더 빠른 종료를 위해 -o ConnectTimeout = 5를 추가하는 것이 좋습니다.
Daniel

0

누군가 원격 컴퓨터에서 포트 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"

0

원격 폴더가 있는지 확인하거나 다른 파일 테스트가 실제로 있는지 확인하려면 다음을 수행하십시오.

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

의 따옴표를 잊지 마십시오 "$(ssh ...)".


이것은 질문에 대한 답이 아닙니다. OP는 원격 ssh 위치의 파일을 확인하지 않고 SSH 연결을 설정할 수 있는지 확인하려고합니다.
Rakib Fiha

0

여러 인터페이스가있는 서버에 연결하려면

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

0

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

0

https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-host.html

위 링크는 연결 확인을위한 Python 스크립트를 생성하는 것입니다. 비슷한 방법을 사용하고 다음을 사용할 수 있습니다.

ping -w 1 -c 1 "IP Address" 

bash 스크립트를 작성하는 명령입니다.


2
이것은 원격 IP에 대해서만 ping을 수행합니다. ssh 연결이 가능한지 보장하지 않습니다.
RJ

지적 해 주셔서 감사합니다. 다음은 ssh xlinu.blogspot.com/2019/09/… export user = "username"export pass = "password"export i = "hostname"export SSHPASS = $ pass sshpass -e ssh $의 코드입니다. 사용자 @ $ 내가 -q "에코 $ 내가 접근"
데라즈 쿠마르

-7

여기서 잘못된 문제를 해결하려는 것 같습니다. ssh 데몬을 더 안정적으로 만들려고하지 않습니까? monit 과 같은 것을 실행 하여 데몬이 실행 중인지 확인하고 그렇지 않은 경우 다시 시작합니다 (sshd가 종료 된 뒤의 근본 문제를 찾을 시간을 제공). 아니면 네트워크 서비스가 번거 롭습니까? 를보십시오 man ifup. 전체 망할 일이 당신을 폐쇄하는 것과 같은가요? 글쎄, 그것은 더 큰 문제입니다 ... 로그를 살펴보고 (syslog로 시작) 하드웨어 오류 또는 박스를 종료하는 서비스 (아마 온도 모니터?)를 찾으십시오.

스크립트를 내결함성으로 만드는 것은 좋지만 박스형 내결함성으로 만들고 싶을 수도 있습니다.


3
Sam : 스크립트가 검사하도록하는 유효한 사용 사례가 있습니다. 예 (나와 같은) : 내 컴퓨터에서 rsync를 통해 내 데이터를 내 집에 백업하기 위해 cron 작업을 실행하고 있습니다. 지금은 외부에 있거나 연결이 자주 끊어져 연결을 사용할 수없는 경우 다시 예약해야합니다. 내 boxen은 꽤 잘 실행되지만 속담은 항상 케이블입니다 (일명 네트워크)
stwissel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.