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-keyscan
ssh 데몬이 제대로 실행되고 있는지 확인하는 것입니다.
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
무슨 일이 일어나고 있는지, 무엇을 실행할지, 반환된 출력(둘 다 stderr
및 stdout
병합) 을 명확하게 알 수 있도록 더 자세히 분석해 보겠습니다 . 그런 다음 이 모든 출력은 으로 파이프되어 grep -v "^$"
출력을 반환하는 줄(ssh 서버가 실행 중)에 대해 0을 반환하고 출력을 반환하지 않는 줄( "^$"
빈 줄)에 대해 1을 반환합니다.
위의 루프 메커니즘(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
^M
while 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 서비스를 실행하는 서버만 인쇄됩니다.