일반적으로 애플리케이션 서버가 실행 중인지 확인하는 간단한 진단 방법은 호스트 및 포트에서 텔넷을 다시 실행하는 것입니다.
telnet somehost port
문제는 macOS와 같은 일부 운영 체제에서는 이제 기본적으로 이 도구를 사용할 수 없다는 것입니다. 그래서 텔넷을 설치하는 방법을 알아보는 대신 특별한 권한을 요구하지 않고 서버가 수신 대기 중인지 확인할 수 있는 다른 CLI 방법이 있는지 궁금합니다.
명확히 하기 위해 저는 모든 시스템에서 텔넷만큼 빠르게 작동하고 단 5초만 소요되는 솔루션을 찾고 있습니다. 솔루션을 작성한다고 해서 실제로 빠른 액세스 방법이 제공되는 것은 아닙니다.
답변1
특정 포트에서 무언가가 수신 대기 중인지 확인할 수 있는 방법은 여러 가지가 있습니다.
그리고 wget
/curl
wget your_IP:port
그리고netstat
netstat -an|grep LISTEN|grep :port
그리고lsof
lsof -i :port
그리고netcat
nc -vz your_IP port
/proc
파일 시스템 사용 (Linux에서만 작동 가능)(여기에 설명되어 있습니다)
그리고ss
ss|grep LISTEN|grep :port
그리고nmap
nmap -sS -O -pport your_IP
편집 1또한 (거의) 모든 ssh, http, ftp 클라이언트가 작동하지만 때로는 포트가 방화벽에 의해 닫혀 있는지 또는 사용할 수 없는지 이해하기 어렵습니다.
편집 2발견 중이 Q&A작업을 사용 cat
하고 완료하는 echo
방법의 예 :
true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed
또는 exec
다음 명령을 사용하십시오(오류 포트가 열려 있지 않은 경우).
exec 6<>/dev/tcp/your_IP/port
나는 awk
단지 일을 할 수 있는 방법을 찾았습니다(원본여기):
awk -v port=your_port 'function hextodec(str,ret,n,i,k,c){
ret = 0
n = length(str)
for (i = 1; i <= n; i++) {
c = tolower(substr(str, i, 1))
k = index("123456789abcdef", c)
ret = ret * 16 + k
}
return ret
}
function getIP(str,ret){
ret=hextodec(substr(str,index(str,":")-2,2));
for (i=5; i>0; i-=2) {
ret = ret"."hextodec(substr(str,i,2))
}
ret = ret":"hextodec(substr(str,index(str,":")+1,4))
return ret
}
NR > 1 {{local=getIP($2);remote=getIP($3) }{ if (remote ~ "0:0" && local ~ ":"port) print local}}' /proc/net/tcp
편집 3의견에서 언급했듯이 일부 접근 방식, 특히 /dev
파일 시스템 기반 접근 방식은 귀하의 환경에서 작동할 수 있습니다.
편집 4내가 찾은 솔라리스의 경우우수한 Q&Apfiles
열린 포트를 얻는 데 사용됩니다 .
답변2
나는 이 문제를 해결하기 위해썼다Perl 스크립트:
#!/usr/bin/perl -w
# tries to connect to the given IP and port (tcp)
use strict;
use IO::Socket;
my $desthost = shift or die "Usage: $0 host port\n";
my $destport = shift or die "Usage: $0 host port\n";
gethostbyname($desthost) || die "Invalid host given\n";
my $handle = IO::Socket::INET->new(
PeerAddr => $desthost,
PeerPort => $destport,
Proto => 'tcp')
or die "can't connect to $desthost:$destport: $!\n";
close $handle;
print "Success!\n"
텔넷 연결을 시뮬레이션하고(하드코딩 참조 'tcp'
) 호스트 이름과 포트를 입력할 수 있으며 해당 포트에 대한 원격 측의 응답(수신)을 기반으로 성공 또는 실패를 보고합니다.
답변3
telnet
실제로 는 TCP 소켓을 여는 것 이상을 수행하고 경우에 따라 열린 연결을 통해 TELNET 프로토콜을 사용하려고 시도하는 이 도구를 사용하지 않는 것이 가장 좋습니다 . TCP 소켓을 여는 데 사용할 수 있는 도구가 많이 있으며, 특히 모든 클라이언트 도구가 있습니다.다른FTP 클라이언트와 같은 TCP 기반 프로토콜. 다시 말하지만, telnet
이들은 결국 연결이 열린 후 각자의 프로토콜을 말하려고 시도할 수 있습니다.
TCP 연결을 설정하고 연결을 통해 프로토콜을 사용하지 않고 즉시 연결을 닫는 매우 기본적인 작업을 위해서는 낮은 수준의 도구를 살펴보는 것이 가장 좋습니다. nc
그 중 하나입니다. 다른 답변에 맡기겠습니다. 하지만 다른 사람들은 다 달라요UCSPI-TCP 및 UCSPI-SSL직업이 있는 고객홀로원하는 것을 정확히 수행하십시오. 연결을 여십시오. 프로그램 체인을 로드하고 성공을 보고하는 것 외에는 아무것도 하지 마십시오.
tcp-socket-connect
존재하다스낵백:tcp-socket-connect "${HOST}" "${PORT}" \ sh -c 'echo ${TCPREMOTEIP}:${TCPREMOTEPORT}에 성공적으로 연결되었습니다. '
IPv4와 IPv6 모두에 적용됩니다.- 이것
tcpclient
존재하다djbwares 패키지, Daniel J. Bernstein의 원본을 약간 수정한 버전입니다.tcpclient
:tcpclient -H -R -l 0 "${HOST}" "${PORT}" \ sh -c 'echo ${TCPREMOTEIP}:${TCPREMOTEPORT}에 성공적으로 연결되었습니다. '
IPv6도 지원하는 일부 패치 버전이 있지만 이는 IPv4에서만 작동합니다. - 로랑 베르코
s6-tcpclient
~에서s6 네트워크:s6-tcpclient -N -H -R -l 0 "${HOST}" "${PORT}" \ sh -c 'echo ${TCPREMOTEIP}:${TCPREMOTEPORT}에 성공적으로 연결되었습니다. '
IPv4와 IPv6 모두에 적용됩니다. - 윌리엄 백스터의
sslclient
:sslclient -H -R -l 0 "${HOST}" "${PORT}" \ sh -c 'echo ${SSLREMOTEIP}:${SSLREMOTEPORT}에 성공적으로 연결되었습니다. '
이는 SSL/TLS도 협상합니다. Felix von Leitner는 IPv6도 지원하는 패치 버전을 출시했지만 IPv4만 지원합니다.
자세한 내용은 매뉴얼 페이지를 참조하십시오. 여기에 사용된 옵션은 연결 테스트에 필요하지 않은 끝점에 대한 다양한 정보 조회를 해제합니다. 입력 호스트와 포트는 기호식일 수 있습니다. 인쇄되는 것은 숫자입니다.
이러한 도구는 이식 가능하며 다양한 시스템의 소스에서 구축될 수 있습니다. 실제로, 이는 여러 운영 체제용 바이너리로 사전 구축 및 패키징되거나 다음을 포함하되 이에 국한되지 않는 포트를 통해 제공됩니다.
- 아치 리눅스 s6 네트워크
- 아키노스및 패키지데비안 리눅스의 경우,OpenBSD의 경우, 그리고FreeBSD의 경우
- ucspi TCP 프로토콜아치 리눅스의 경우, 데비안 리눅스의 경우,우분투 리눅스의 경우,FreeBSD 포트 트리에서,OpenBSD 포트 트리에서,NetBSD 패키지 컬렉션, 그리고MacPorts에서
- ucspi-sslFreeBSD 포트 트리에서그리고NetBSD 패키지 컬렉션
답변4
원격 검사의 경우 Romeo의 탁월한 답변에 따라 nmap과 nc가 선택된 도구입니다. 서버 자체를 사용하는 경우 FreeBSD와 Ubuntu에는 sockstat
완벽한 최고의 도구가 있습니다.
sockstat -p 80 -4 -6