检查服务器是否在没有 telnet 的情况下从 CLI 进行侦听?

检查服务器是否在没有 telnet 的情况下从 CLI 进行侦听?

通常,检查应用程序服务器是否正在运行的简单诊断方法是再次在主机和端口上运行 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在发现这个问答使用catecho完成工作的示例方法:

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 均适用。
  • tcpclientdjbwares 包,丹尼尔·J·伯恩斯坦原作的稍微修饰版tcpclient:
    tcpclient -H -R -l 0 "${HOST}" "${PORT}" \
         sh -c 'echo 已成功连接到 ${TCPREMOTEIP}:${TCPREMOTEPORT}。'
    尽管存在一些也可以执行 IPv6 的修补版本,但这只适用于 IPv4。
  • 洛朗·贝尔科特s6-tcpclients6 网络:
    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

相关内容