SSH 가용성 확인을 위한 서버 목록

SSH 가용성 확인을 위한 서버 목록

SSH를 통해 액세스하고 해당 주소에 액세스할 수 있는지 기록해야 하는 IP 주소 목록이 있습니다. Ping 스크립트를 사용하겠지만 DNS가 주소를 재할당했을 수도 있습니다. 나는 내가 닿을 수 없는 사람들에 대해서는 관심이 없습니다. SSH가 제대로 작동하고 해당 IP 주소를 기록해야 하는 경우 상자에 로그인하고 싶지 않기 때문에 비밀번호나 키에 대해 걱정할 필요가 없습니다. SSH를 통해 연결할 수 있는지 확인하고 싶었습니다. 지금까지 나는 다음을 가지고 있습니다 :

touch logfile_$(date "+%Y%m%d%T")
IP_FILE="path/to/ip_address.txt"
LOGFILE="path/to/logfile_$(date "+%Y%m%d%T")"


if [[ ! -f ${IP_FILE} ]]; then
   echo "Cannot find IP address!"
   exit 1
fi

for IP_ADDRESS in `cat $IP_FILE` ; do

    ssh $IP_ADDRESS >> $LOGFILE 2>&1

저는 아직 스크립팅을 처음 접했기 때문에 어떤 도움이라도 도움이 될 것입니다. LanceBaynes가 게시한 "서버에 SSH로 접속할 수 있는지 어떻게 확인하나요?"를 살펴봤지만 실제로 필요한 것은 아닙니다.

이 상자에는 아무것도 설치할 수 없습니다. 아니면 좋은 스캐너를 다운로드하겠습니다. Netcat이나 Nmap과 마찬가지로 둘 다 좋은 선택입니다.

답변1

방법 #1: ssh-keyscan

한 가지 방법은 명령을 사용하여 ssh-keyscanssh 데몬이 제대로 실행되고 있는지 확인하는 것입니다.

IP 주소와 ssh-keyscan <ip> | grep -v ...각 서버를 반복하면 됩니다. 서버가 있는 경우 ssh-keyscan ... | grep -v ...이 명령을 실행하여 반환되는 상태는 0이 되며, 다른 값(1 이상)은 서버가 없음을 의미합니다.

$ for IP_ADDRESS in `cat $IP_FILE` ; do
    ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null
    [ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1
  done

ssh-keyscan $IP_ADDRESS 2>&1무슨 일이 일어나고 있는지, 무엇을 실행할지, 반환된 출력(둘 다 stderrstdout병합) 을 명확하게 알 수 있도록 더 자세히 분석해 보겠습니다 . 그런 다음 이 모든 출력은 으로 파이프되어 grep -v "^$"출력을 반환하는 줄(ssh 서버가 실행 중)에 대해 0을 반환하고 출력을 반환하지 않는 줄( "^$"빈 줄)에 대해 1을 반환합니다.

루프의 빠른 접선(for 대 while 및 구문 분석 방법)

위의 루프 메커니즘(for 루프)은 파일에 공백 없이 하나의 문자열만 포함되어 있고 각 "문자열"이 개행 문자로 끝나기 때문에 작동합니다. 기본적으로 공백은 for 루프가 전달된 인수를 구문 분석하는 방법을 지정하는 데 사용되는 특수 구분 문자입니다. 이 문자는 변수에 의해 정의되며 $IFS대체될 수 있습니다. 예를 들어 개행 문자( )입니다 IFS='^M'.

cat $IP_FILE로 대체하여 효율성을 높일 수 있습니다 $( < $IP_FILE ). 예를 들어:

$ for IP_ADDRESS in $( < $IP_FILE ) ; do
    ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null
    [ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1
  done

파일의 줄에 공백이 포함되어 있으면 방금 논의한 내용을 재정의하여 while 루프, 즉 ( ) 로 설정하거나 사용할 $IP_FILE수 있습니다 .$IFS^Mwhile read -ra line ; do ... ; done < $IP_FILE

$ while read -ra IP_ADDRESS ; do
    ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null
    [ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1
  done < $IP_FILE

당신의 모범

touch logfile_$(date "+%Y%m%d%T")
IP_FILE="ip.txt"
LOGFILE="logfile_$(date "+%Y%m%d%T")"


if [[ ! -f ${IP_FILE} ]]; then
 echo "Cannot find IP address!"
 exit 1
fi

for IP_ADDRESS in `cat $IP_FILE` ; do
  #ssh $IP_ADDRESS >> $LOGFILE 2>&1
  ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null
  [ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1
done

방법 #2: nmap

이 도구를 사용하여 수행할 수 있는 작업도 몇 가지 있습니다 nmap.

$ nmap -A -iL ip.txt -p T:22

이는 호스트 이름과 IP 주소를 포함할 수 있는 파일을 반복 ip.txt하고 각 포트에서 TCP 포트 #22를 검색하여 다음과 유사한 결과를 반환합니다.

Nmap scan report for somehost.somedom.local (192.168.1.200)
Host is up (0.012s latency).
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 4.3 (protocol 2.0)
| ssh-hostkey: 1024 2e:32:85:a2:56:23:01:f1:c2:8f:df:aa:83:7a:1e:ad (DSA)
|_2048 f6:a1:23:1d:aa:44:4a:ce:b4:d3:f4:fe:e1:00:47:b7 (RSA)

인용하다

답변2

netcat 유틸리티(바이너리 실행 파일이라고 함)를 찾고 있습니다 nc. TCP 포트 22의 연결 전용 테스트를 포함하여 다양한 네트워크 테스트를 수행할 수 있습니다. 이전 netcat 유틸리티를 사용하는 경우 명령은 다음과 같습니다.

nc -vz [ip.or.hostname] 22 -w [desired.timeout.value.in.seconds]

-z최신 버전에서는 기본적으로 해당 옵션이 제거되었다고 생각합니다.

예를 들어:

[jadavis6@cmsoracle ~]$ nc -vz wfwhite.xxx.edu 22 -w 5
nc: connect to wfwhite.xxx.edu port 22 (tcp) timed out: Operation now in progress
[jadavis6@cmsoracle ~]$ echo $?
1
[jadavis6@cmsoracle ~]$ nc -vz ditirlns01.xxx.edu 22 -w 5
Connection to ditirlns01.xxx.edu 22 port [tcp/ssh] succeeded!
[jadavis6@cmsoracle ~]$ echo $?
0
[jadavis6@cmsoracle ~]$

답변3

누군가 netcat을 언급했지만 원하는 작업을 수행하는 명령 중 하나인 nmap을 추천합니다.

nmap -iL path/to/ip_address.txt -p 22

그러면 필요한 모든 정보가 제공됩니다.

답변4

아무것도 설치할 수 없다면 다음과 같이 할 수 있어야 합니다.여기):

$ for ip in `cat ips.txt`; do 
    ssh -o PreferredAuthentications=publickey foobar@$ip "echo ''" 2>&1 | 
    grep denied >/dev/null && echo "$ip has SSH"; 
  done < ips.txt

여기서의 비결은 PreferredAuthentications. ssh에 저장된 키 정보를 이용하여 연결을 시도하라는 명령입니다 ~/.ssh. 사용자가 원격 시스템에 대한 액세스 권한이 없는 한 foobar(원하는 임의의 이름으로 변경) "권한 거부" 오류와 함께 연결이 실패합니다. 이는 grep denied성공할 것이므로 echo명령이 실행된다는 것을 의미합니다. &&이전 명령(여기서는 grep)이 성공한 경우 다음 명령을 실행함을 나타냅니다.

IP가 포함된 파일에서 이 스크립트를 실행하면 SSH 서비스를 실행하는 서버만 인쇄됩니다.

관련 정보