텔넷을 통해 로그인할 수 있는지 테스트하기 위한 스크립트를 작성하려고 합니다. 실제로 로그인하고 싶지 않으므로 기대할 필요가 없습니다. 로그인 프롬프트를 받을 수 있는지 확인하고 싶습니다. 이 작업은 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는 다음 표에 설명된 대로 리디렉션에서 여러 파일 이름을 사용할 때 특별히 여러 파일 이름을 처리합니다.
/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
연결이 가능한지 테스트하고 싶다면 다음을 사용하세요.-z
CNC 스위치:
#!/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/*]에 성공적으로 연결되었습니다!