Telnet 명령을 실행하고 쉘 스크립트의 출력을 얻으려고 합니다. 그러나 포트가 열려 있지 않거나 IP가 존재하지 않는 경우. 명령이 응답하는 데 너무 많은 시간이 걸립니다. 텔넷의 최대 시도 시간을 제한할 수 있습니까?
telnet host port
답변1
이 작업은 2초 이내에 실행됩니다.
[]# echo quit | timeout --signal=9 2 telnet [SERVER] [PORT]
답변2
nc
논의된 것처럼 더 간결한 명령 netcat을 고려해 볼 수 있습니다.여기
echo 'QUIT' | nc -w SECONDS YOUR_HOST PORT; echo $?
답변3
텔넷을 실행해야 합니까? 내 생각에는 timeout(1)이 도움이 될 것 같습니다.
대안 #1: GNU coreutils의 일부인 시간 초과를 사용합니다. 연결을 설정할 수 있는지 여부는 확인되지 않습니다.
TIMEOUT=10 timeout $TIMEOUT telnet <host> <port>
대안 #2: Bash/Perl/Python을 사용하여 어느 정도 세분화하여 동일한 문제를 해결하세요.
몇 가지 예를 들면 다음과 같습니다.
큰 타격: TIMEOUT=10; telnet <host> <port> 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID
펄:perl -e "alarm 10; exec @ARGV" "telnet my.server.com 23"
파이썬: python -c 'import telnetlib;HOST="my.server.com"; PORT=23; TIMEOUT=10; PATTERN="Login: "; t = telnetlib.Telnet (HOST, PORT); t_read = t.read_until(PATTERN, TIMEOUT); print(repr(t_read))'
답변4
호스트에 연결할 수 있는지, 포트에 연결할 수 있는지/거부되었는지 또는 호스트가 작동 중인지 확인하세요.
참고: 이 스크립트는 시각적 피드백만 제공합니다.
BASH v4+를 사용하는 예에서는 목록에서 호스트를 읽고 해당 목록의 포트를 사용합니다. 이 예에서는 포트를 테스트하고 호스트 등에 도달할 수 있는지 테스트합니다.
#!/bin/bash
declare -a remote_hosts=("10.10.236.221:8080" "10.10.236.222:22")
for each in ${remote_hosts[@]} ;do
ip=$(echo $each | cut -d ':' -f1)
port=$(echo $each | cut -d ':' -f2)
echo "Connecting ${ip}:${port} .."
telnet $ip $port & WPID=$!
sleep 3
if ps -p $WPID > /dev/null ;then
echo "FAILED TO REACH ($WPID is running)"
kill $! 2>&1 >/dev/null
wait $WPID 2>&1 >/dev/null
fi
done