developer tip

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

copycodes 2020. 10. 18. 18:28
반응형

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

누군가가 원격 시스템에서 포트 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"

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

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

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

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

ping -w 1 -c 1 "IP Address" 

bash 스크립트를 만드는 명령입니다.


I feel like you're trying to solve the wrong problem here. Shouldn't you be trying to make the ssh daemons more stable? Try running something like monit, which will check to see if the daemon is running and restart it if it isn't (giving you time to find the root problem behind sshd shutting down on you). Or is the network service troublesome? Try looking at man ifup. Does the Whole Damn Thing just like to shut down on you? Well, that's a bigger problem ... try looking at your logs (start with syslog) to find hardware failures or services that are shutting your boxen down (maybe a temperature monitor?).

Making your scripts fault tolerant is great, but you might also want to make your boxen fault tolerant.

참고URL : https://stackoverflow.com/questions/1405324/how-to-create-a-bash-script-to-check-the-ssh-connection

반응형