텍스트 파일에서 여러 서버에 원격으로 로그인하는 쉘 스크립트

텍스트 파일에서 여러 서버에 원격으로 로그인하는 쉘 스크립트

아래 코드를 사용하여 여러 서버에 원격으로 로그인하고 있습니다.

file=ip.txt
while read line
do
  ip=$( echo "$line" |cut -d ' ' -f 1 )
  port=$( echo "$line" |cut -d ' ' -f 2 )
  if  telnet  $ip $port </dev/null 2>&1 | grep -q Escape 
  then  
    echo "$ip $port Connected" >> Telnet_Success.txt
  elif  telnet  $ip $port </dev/null 2>&1 | grep -q refused 
  then
    echo "$ip $port Refused" >> Telnet_Refused.txt
  else
    echo "$ip $port Failed" >> Telnet_Failure.txt
  fi
done < ${file}

입력 파일은 txt입니다. 여기에 이미지 설명을 입력하세요.예상 출력은 다음과 같습니다.여기에 이미지 설명을 입력하세요.내가 얻는 결과는 다음과 같습니다.여기에 이미지 설명을 입력하세요.예상되는 출력을 얻으려면 스크립트를 작성해야 합니다.

답변1

세 개의 출력 파일을 생성하려는 이유가 명확하지 않지만 이는 귀하의 요청이고 내 요청이 아니므로 다음이 도움이 될 수 있습니다.

data=${1:-ip.txt} while read host port; do preamble="telnet $host $port" case $(telnet $host $port </dev/null 2>&1 | tail -1) in (*closed*) echo "$preamble ... Connected" >>Telnet_Success.txt ;; (*refused*) echo "$preamble ... Refused" >>Telnet_Refused.txt ;; (*) echo "$preamble ... Failed" >>Telnet_Failure.txt esac done <$data exit

첫 번째 줄에서는 입력 데이터를 스크립트에 매개변수로 제공하여 다른 파일(예: data.txt)에 입력 데이터를 제공할지 결정할 수 있습니다. 예를 들어

$ telnet.sh data.txt

지정하지 않으면 "ip.txt" 파일로 간주됩니다. 그런 다음 Case 문을 사용하여 명령 출력의 마지막 줄을 일치시켜 결과 메시지가 있는 파일을 결정합니다.

read명령문을 사용하면 입력 줄에서 개별 "단어"를 선택할 수 있으므로 cut여기와 같은 명령을 사용할 필요가 없습니다. 또한 파일을 사용하는 방식에 따라 후속 스크립트 실행이 기존 출력 행에 추가됩니다. 그것은 아마도 당신이 원하는 것이 아닐 것입니다.

화타이

PS 엄밀히 말하면 #!/bin/sh 또는 이와 유사한 shebang 줄을 맨 위에 넣어야 합니다. 여기서 제가 의지하는 것은 Bash 셸이 있는 Linux 시스템에서 실행되고 있다는 사실입니다.

관련 정보