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


11

텔넷을 통해 로그인 할 수 있는지 테스트하는 스크립트를 작성하려고합니다. 실제로 로그인하고 싶지 않습니다. 따라서 기대할 필요는 없습니다. 로그인 프롬프트가 표시되는지 확인하고 싶습니다. 이것은 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

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


답변:


14

Bash는에 익숙한 의사 장치를 제공합니다 /dev/null. 그러나 Bash 스크립트 내에서도 사용할 수있는 네트워크 연결 /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

구체적으로 테스트하려면 telnet, 기본적으로 포트 23에서 실행되므로 slm이 22와 223을 사용한 경우 23을 사용하십시오.
Warwick

@ Warwick-감사합니다. 예제 섹션에 메모를 추가했습니다.
slm

의견을 주셔서 감사합니다. 나는 이것을 전에 보았지만 이것으로 작동시키지 못했습니다. 내 문제는 로그인 프롬프트를 grep하거나 테스트 할 수 있어야한다는 것입니다. 이 경우 콘솔이 잠겨 있고 로그인 프롬프트가 없습니다. # telnet 192.168.10.5 Trying 192.168.10.5... Connected to 192.168.10.5 (192.168.10.5). Escape character is '^]'. Connection closed by foreign host.
rleon

# cat < /dev/tcp/192.168.10.12/23 로그인 프롬프트를 표시하지만 빠져 나올 수 없습니다.
rleon

1
와우 .. 거기에 리디렉션의 할당량. # cat afile ^] 실행 한 후에는 휴식 시간을 에코합니다 afile. 여전히 그것을 가지고 놀고 있지만 나는 거의 거기에 있다고 느낍니다.
rleon

7

을 사용하여 올바른 길을 nc가고 있지만 실제로 연결을 설정할 수 있는지 테스트하려는 경우 nc -z스위치를 사용하십시오 .

#!/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

이것은 모든 시스템에서 작동하지는 않습니다. 제 nc에는 -z 플래그가 없습니다
Shapeshifter

흥미 롭군 이 버전은 nc무엇입니까?
DopeGhoti

저는 CentOS 7을 사용하고 있으며 nc는 해당 옵션이없는 nmap-ncat으로 대체되었습니다. (
Shapeshifter

올바르게 기억하면 CentOS에서 원하는 패키지는 간단 nc합니다.
DopeGhoti

nc는 centos 7의 nmap-ncat입니다
Shapeshifter

2

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

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

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

그리고 줄 바꿈 + quit 명령은 연결을 끊은 후 텔넷을 종료합니다. 따라서 :

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 vs 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)

1

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

연결에 성공하면 아래 명령문을 리턴합니다.

192.168.10.5 23 포트 [tcp / *]에 연결했습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.