ssh를 통해 서버에 로그인 할 수 있는지 확인하는 방법은 무엇입니까? list.txt 10.10.10.10 servera 10.11.10.10

서버 목록이 있습니다.

cat list.txt
10.10.10.10 servera
10.11.10.10 serverb

ssh를 통해 로그인 할 수 있는지 어떻게 확인할 수 있습니까? 기본적으로 ssh key auth ..를 통해 로그인 할 수 있어야합니다. 즉, list.txt의 줄 (서버)를 다음과 같이 정렬하는 솔루션이 필요합니다.

  • ssh 키를 통해 로그인 할 수있는 서버
  • 암호를 묻는 서버 (물론 암호를 알 수 없습니다.)
  • 연결할 수없는 서버


답변

BatchMode옵션과 출력 “파싱”의 조합으로이를 수행 할 수 있습니다 . ( ssh어떤 이유로 든 연결에 실패하면 항상 255를 리턴하므로 리턴 코드를 사용하여 실패 유형을 구별 할 수 없습니다.)

켜져 있으면 BatchMode암호 프롬프트 나 다른 상호 작용이 시도되지 않으므로 암호가 필요한 연결이 실패합니다. (또한 ConnectTimeout필요에 맞게 조정해야하는 파일 도 넣었습니다 . 실제로 잘못된 파일 이름을 선택했습니다.)

#! /bin/bash

rm good no_auth other
while read ip host ; do
    status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 $ip echo ok 2>&1)
    case $status in
        ok) echo $ip $host >> good ;;
        *"Permission denied"*) echo $ip $host $status >> no_auth ;;
        *) echo $ip $host $status >> other ;;
    esac
done < list.txt

보다 자세한 분류가 필요한 경우 다른 유형의 오류 (예 : 누락 된 서버 공개 키)를 감지 할 수 있습니다. 하나의 정렬 된 파일로 결과가 필요한 경우 cat다양한 출력 파일이 함께 표시됩니다.


답변

ssh를 통해 여러 호스트에서 명령 실행을 자동화하는 다양한 도구를 찾으십시오. 예를 들어 Mussh :

mussh -H hosts.txt -o ConnectTimeout=5 -P -d -c 'echo `hostname` is alive'

필요에 따라 출력을 마사지하십시오.

참고 : 왜 IP 주소를 저장 list.txt합니까? 서버 이름으로 충분합니다. 사용하려는 이름이 DNS 이름이 아닌 경우의 Host지시문을 사용하십시오 ~/.ssh/config.


답변

servers that I can log in via ssh key
servers that prompts for password (of course password is unknown..)

expect는 대화식 명령에 입력을 제공합니다. -v 플래그가있는 ssh 클라이언트는 서버가 승인하는 인증 방법을 알려줍니다. 대화식 프롬프트가 표시되면 종료하십시오. 당신이 원하는 것을하십시오, 당신은 당신이 필요한 모든 것을 가지고 있습니다.

servers that are unreachable

똑같이, 하나의 명령으로 그들 모두를 지배하고 어둠 속에서 그들을 묶으십시오 … 흠.


답변

mussh 명령은 오류 만 출력하므로 디버그없이 실행할 수 있습니다.

$ cat list.txt
10.1.2.93       trustme
10.1.2.92       wobudong
10.41.41.41     failhost

$ awk '{print $2}' list.txt | mussh -H - -t 10 -m -c hostname
trustme: trustme
failhost: ssh: Could not resolve hostname failhost: Name or service not known
wobudong: ssh: connect to host wobudong port 22: Connection timed out