한 줄 명령을 실행하여 텔넷을 사용하여 원격 TCP 포트 테스트


12

매우 제한된 명령과 디스크 공간을 가진 수많은 리눅스 상자가 있습니다. 그러나 그것에 telnet명령이 있습니다.

프로그래밍 방식으로 각 프로브에 원격으로 연결하고 SSH를 통해 한 줄 Linux 명령을 실행합니다.

텔넷을 사용하여 특정 컴퓨터에 연결하려면 단일 명령을 실행 한 다음 바로 연결을 끊어야합니다 .

나는 모든 것을 할 수 있지만 단절 부분은 바로 . 텔넷은 일종의 콘솔 또는 터미널을 열고 텔넷 명령을 실행 한 다음 한 줄 명령을 실행하여 즉시 연결을 끊을 수 없습니다.

그렇게하면 지정된 포트의 컴퓨터에 연결할 수 없다는 오류 메시지의 텍스트 출력을 쉽게 구문 분석 할 수 있으며 이것이 바로 내가 찾는 것입니다.

어떻게 한 줄 명령을 실행하여 텔넷을 사용하여 컴퓨터에 연결하고 나중에 연결을 끊을 수 있습니까?


텔넷 클라이언트가 직접 전송을 지원하지 않는다는 것을 알고 있습니까?
IBr

@IBr, 무슨 뜻인가요?
Muhammad Gelbana

클라이언트 측 종료 명령을 사용하여 종료 한 후보고 된 종료 클라이언트의 종료 코드가 다릅니다. 따라서 제로 종료 코드는 포트가 열린 신호로 간주되어서는 안됩니다. 최소한 RHEL telent RPM에는 작동하지 않습니다.
Oliver Gondža

답변:


28

에서 exit명령을 STDIN 으로 파이프 할 수 있어야합니다 telnet. 시험:

echo 'exit' | telnet {site} {port}

그것이 작동하는지 확인하십시오. (내 웹 서버에서는 작동하지만 YMMV에서는 작동하는 것 같습니다).


작동하지만 바보 같다 수도 - 텔넷은 첫 접촉에 종료 또는 뭔가 옵션이 있어야
알렉산더 밀스

10

가장 간단하고 쉬운 방법은 다음과 같습니다.

 sleep <n> | telnet <server> <port>

n- 자동 종료 전 대기 시간 (초)입니다. 0.5와 같이 분수 일 수 있습니다. 지정된 대기 시간에 일부 필수 출력이 반환되지 않을 수 있습니다. 따라서 그에 따라 증가해야 할 수도 있습니다.

server- 대상 서버 IP 또는 호스트 이름

port- 대상 서비스 포트 번호

출력을 다음과 같이 파일로 리디렉션 할 수도 있습니다.

sleep 1 | telnet <server> <port> > output.log

이것은 완벽하게 작동합니다! 출력이 실제로 리디렉션되는 동안 여전히 "외부 호스트에 의해 연결이 닫혔습니다."라는 메시지가 나타납니다. output.log 파일이 아니라 휴면 후 콘솔에 출력됩니다. 이것을 막을 방법이 있습니까?
dan

5

제 경우에는 이것이 작동합니다. (CentOS 7) :

while read host port; do
r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
done

1
이봐, 대단해. 본인은 직장에있는 모든 Linux 시스템의 사용자이지만 관리자가 아닙니다 (관리자 권한이 없음). 네트워크 연결을 테스트 할 수 있도록 항상 텔넷을 설치하도록 요청하는 것이 심합니다 (네트워크 엔지니어입니다). 이것은 훌륭한 해결 방법입니다. 텔넷과 같은 성능을 발휘하도록 약간 변경했습니다. 나는 여기에 내 자신의 대답을 수정 사항으로 제공했다.
theglossy1

3

명령을 직접 보내고 출력을 얻는 더 좋은 도구는 netcat이라고 생각합니다. 포트를 통해 명령을 넣는 간단하지만 강력한 도구입니다. 이 수퍼 유저의 질문에 사용 예를 볼 수 있습니다 : /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive - 아스 커 작업 예제를 제공합니다 몇 초 후에 연결이 닫힙니다.

연결 만 테스트하려면 다음을 사용하십시오. http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/


지금 netcat을 설치하려고하는데 그렇게 할 수 없습니다. 컴파일 된 powerpc 버전을 다운로드했지만 glibc 라이브러리가 없습니다. 컴파일 된 powerpc 버전을 다운로드했지만 장치에 라이브러리 파일을 복사 할 공간이 충분하지 않았습니다! glibc 라이브러리가 이미 존재하지만 netcat에서 찾을 수 없습니까?
Muhammad Gelbana

Netcat은 클라이언트 측에서만 필요합니다. 서버 (프로브)는 동일한 일반 텔넷 일 수 있습니다.
IBr

또한 Glibc는 이미 존재해야하며 일반적인 시스템의 많은 부분에서 사용됩니다.
IBr

telnet 스크립트에 추가하여 && exit연결이 끊어 졌는지 확인할 수 있습니다 (ssh에서는 충분합니다).
IBr

&& exit작동하지 않았다. glibc가 존재해야한다고 생각합니다. 왜 nc.traditional그것이없는 것처럼 불평할까요?
Muhammad Gelbana

1

이것은 "일반적인"텔넷 구문과 비슷하게 작동하는 의 다른 대답 버전입니다 . 당신이 내 대답을 좋아한다면, 이것에 대한 찬성이 아니라 원본에 공감하십시오.

#!/bin/bash
if [ "$2" == "" ]; then
 echo "Syntax: $0 <host> <port>"
 exit;
fi

host=$1
port=$2

r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi

1

인터넷에서 찾은 솔루션은 다음과 같습니다.

( echo open 127.0.0.1 23
sleep 5
echo your_login
sleep 5
echo your_password
sleep 5
echo hostname
sleep 5
echo exit ) | telnet

SunOS 및 HP-UX에서 작동합니다.


0

시험

echo -e '\x1dclose\x0d' | telnet {HOSTNAME} {PORT}

위의 가장 중요한 부분은 종료 상태도 얻는 것입니다. 텔넷이 성공하면 종료 코드는 0이거나 그렇지 않으면 1입니다.


0

라우팅 규칙을 따르지 않으므로 사용자 지정 경로가있는 경우 netcat을 사용하지 마십시오. 유사 방법 nslookup, dighost/ etc / hosts 파일 (무시 nslookup을 발굴은 파이어 폭스가 무시 / etc / hosts 파일 항목 ).

즉 , 시스템의 라우팅 규칙을 따르는 telnet/dev/tcp( 한 줄 명령을 실행하여 텔넷을 사용하여 원격 TCP 포트 테스트) 과 같은 응용 프로그램 및 도구와 달리 다음 nc과 함께 소스 IP 주소를 사용하도록 특별히 지시하지 않는 한 기본 게이트웨이를 사용합니다 -s.

nc -w 3 -s 192.168.1.12 example.com 8080

응용 프로그램이 리소스에 도달 할 수 있는지 테스트하고 경로가 다운 netcat된 경우 소스 주소가 테스트에 지정된 이후 모든 것이 정상이라고보고했습니다. 사용으로 전환하고 /dev/tcp있습니다.

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