通常,检查应用程序服务器是否正在运行的简单诊断方法是再次在主机和端口上运行 telnet:
telnet somehost port
问题是,某些操作系统(例如 macOS)现在默认使该工具不可用。因此,我不想尝试了解如何安装 telnet,而是想知道是否有其他 CLI 方法来检查服务器是否正在侦听,而不需要特殊权限?
澄清一下,我正在寻找在任何系统上都可以像 telnet 一样快速使用的解决方案,只需 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在发现这个问答使用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对于Solaris我发现优秀的问答用于pfiles
获取开放端口。
答案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"
它模拟 telnet 连接(请参阅硬编码'tcp'
)并允许您输入主机名和端口;它根据远程端在该端口的应答(侦听)来报告成功或失败。
答案3
实际上最好不要使用该telnet
工具,该工具的作用不仅仅是打开 TCP 套接字,在某些情况下还尝试通过打开的连接使用 TELNET 协议。有许多工具可用于打开 TCP 套接字,尤其是所有客户端工具其他基于 TCP 的协议,如 FTP 客户端。同样,telnet
在连接打开后,这些最终可能会尝试说出各自的协议。
对于建立 TCP 连接并立即关闭它这一非常基本的操作,而不尝试通过该连接使用任何协议,最好查看低级工具。 nc
是其中之一,我将其留给其他答案。但其他的都是各种各样的UCSPI-TCP 和 UCSPI-SSL客户,其工作是独自准确地执行您想要的操作:打开连接。只需让程序链式加载,除了报告成功之外什么都不做。
tcp-socket-connect
在小吃包:tcp-socket-connect "${HOST}" "${PORT}" \ sh -c 'echo 已成功连接到 ${TCPREMOTEIP}:${TCPREMOTEPORT}。'
IPv4 和 IPv6 均适用。- 这
tcpclient
在djbwares 包,丹尼尔·J·伯恩斯坦原作的稍微修饰版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。它只支持 IPv4,尽管 Felix von Leitner 发布了一个也支持 IPv6 的修补版本。
有关详细信息,请参阅手册页。此处使用的选项会关闭连接测试不需要的有关端点的各种信息查找。输入主机和端口可以是符号性的。打印的内容将是数字。
这些工具是可移植的,并且可以在一系列系统上从源代码构建。事实上,它们甚至是预先构建并打包为多个操作系统的二进制文件,或者通过端口提供,包括但不限于:
答案4
对于远程检查,根据 Romeo 的出色回答,nmap 和 nc 是首选工具。如果您使用服务器本身,FreeBSD 和 Ubuntu 拥有最优秀的sockstat
工具,非常完美:
sockstat -p 80 -4 -6