쉘 스크립트에서 텔넷 포트가 활성화되어 있는지 테스트

쉘 스크립트에서 텔넷 포트가 활성화되어 있는지 테스트

텔넷을 통해 로그인할 수 있는지 테스트하기 위한 스크립트를 작성하려고 합니다. 실제로 로그인하고 싶지 않으므로 기대할 필요가 없습니다. 로그인 프롬프트를 받을 수 있는지 확인하고 싶습니다. 이 작업은 Linux 시스템에서 수행되므로 다음을 사용하려고 했습니다 nc.

nc 192.168.10.5 23 -w 1 | grep -q login 
if [ $? -eq 1 ]
then
    echo "console is down"
fi

문제는 이로 인해 콘솔이 잠긴다는 것입니다. 실제로 -w연결이 끊어지는 것 같지 않습니다.

또한 텔넷을 사용해 보았으나 스크립트 연결을 끊을 수 없었습니다. 노력하다

\echo "\035" | telnet 192.168.10.5

로그인 프롬프트가 표시되기 전에 중단됩니다.

답변1

Bash는 와 같은 친숙한 의사 장치를 제공합니다 . 그러나 Bash 스크립트에서도 사용할 수 있는 네트워크 연결 테스트 용 /dev/null장치도 있습니다 ./dev/tcp/dev/udp

Bash 매뉴얼 페이지에서

Bash는 다음 표에 설명된 대로 리디렉션에서 여러 파일 이름을 사용할 때 특별히 여러 파일 이름을 처리합니다.

          /dev/fd/fd
                 If fd is a valid integer, file descriptor fd is duplicated.
          /dev/stdin
                 File descriptor 0 is duplicated.
          /dev/stdout
                 File descriptor 1 is duplicated.
          /dev/stderr
                 File descriptor 2 is duplicated.
          /dev/tcp/host/port
                If  host  is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a TCP connection to the corresponding socket.
          /dev/udp/host/port
                If host is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a  UDP  connection to the corresponding socket.

내 도메인의 Skinner라는 호스트에 대한 연결을 테스트하고 있으며 해당 호스트의 포트 22에 연결할 수 있는지 확인하고 있습니다.

노트:포트 22는 SSH에 사용되고 포트 23은 텔넷에 사용됩니다.

$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up

좋습니다. 포트가 아닌 것을 시도해 보겠습니다.

$ echo > /dev/tcp/skinner/223 && echo "it's up" || echo "it's down"
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused
it's down

좋아, 이것은 작동하지만 출력은 매우 보기 흉합니다. 괜찮아요. 서브셸에서 실행 echo > /dev/tcp/...하고 모든 출력을 로 리디렉션하여 /dev/null약간 정리할 수 있습니다. 다음은 쉘 스크립트에서 사용할 수 있는 패턴입니다.

$ (echo > /dev/tcp/skinner/22) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's up

$ (echo > /dev/tcp/skinner/223) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's down

답변2

올바른 트랙을 사용하고 있지만 nc연결이 가능한지 테스트하고 싶다면 다음을 사용하세요.-zCNC 스위치:

#!/bin/bash
REMOTEHOST=10.11.12.13
REMOTEPORT=1234
TIMEOUT=1

if nc -w $TIMEOUT -z $REMOTEHOST $REMOTEPORT; then
    echo "I was able to connect to ${REMOTEHOST}:${REMOTEPORT}"
else
    echo "Connection to ${REMOTEHOST}:${REMOTEPORT} failed. Exit code from Netcat was ($?)."
fi

답변3

대답이 약간 늦었다는 것을 알고 있지만 이 작업을 수행하는 방법을 찾고 있었으며 보안상의 이유로 nc를 사용하는 것은 옵션이 아니므로 누군가에게 도움이 될 수 있는지 여기에 있습니다.

초기 echo에서 누락된 것은 -e 스위치입니다.

   -e     enable interpretation of backslash escapes
   -E     disable interpretation of backslash escapes (default)

연결을 끊은 후 텔넷을 종료하려면 개행 + 종료 명령을 사용하세요. 이와 같이:

echo -e '\035\nquit' | telnet 10.0.0.1 23 && echo "success" || echo "failed"

분명히 블록 스타일 if 문을 사용하고 $?를 평가하는 경우에도 동일하게 작동합니다. 원래 그랬던 것처럼:

echo -e '\035\nquit' | telnet 10.0.0.1 23
if [ $? -eq 1 ]
then
  echo "Console is down."
fi

우리가 주제에 대해 이야기하는 동안 nc에 관해서는 가지고 있는 nc 유형(gnu ncat 대 nmap-ncat)에 따라 다릅니다. Gnu에는 -z 스위치가 있습니다:

  -z                         Zero-I/O mode, report connection status only
nc -z 10.0.0.1 23
# (evaluate $? here)

다른 하나는 그렇지 않습니다. 막히지 않으려면 nc에 빈 줄을 연결해야 합니다.

echo | nc 10.0.0.1 23
# (evaluate $? here)

답변4

명령 프롬프트에서 이 명령을 실행 nc -z 192.168.10.5 23하거나 bash 스크립트를 생성하십시오.

연결에 성공하면 다음 문이 반환됩니다.

192.168.10.5 포트 23 [tcp/*]에 성공적으로 연결되었습니다!

관련 정보