我想使用 netcat 来测试某些端口是否正在监听,但是由于该命令将在使用不同于英语的语言的机器上执行,因此grep
根据单词来输出并不是一个好主意LISTENING
(例如,我在德国电脑上看到了这个词ABHOREN
)。
我尝试查看 netcat 的手册页,但似乎找不到解决方案,所以我想知道是否有人设法将端口的状态转换为数字格式,而不是字符串。
提前致谢 :)
答案1
如果您说 LISTENING,我猜您实际上想要netstat
(不是netcat
)。大多数现代系统netstat -lnt
只知道列出 LISTENING tcp 套接字,没有其他内容。请注意,在最小 RHEL7 安装中没有 netstat - 它已被弃用,取而代之ss
(相同的标志,ss -lnt
但输出格式略有不同)。
一般情况下,答案是在环境中正确设置语言环境,这样所有进程都会用英语(或者更好的是 C)与您交谈。
答案2
您可以在运行 netcat 之前导出其语言(甚至可以导出整个脚本):
LANG=C netcat ...
答案3
就像netstat
你可以直接询问内核一样。它的信息来自/proc/net/tcp
和/proc/net/tcp6
。这两个文件的格式相同,并且轻微地(咳嗽)输出内容更难阅读netstat
,但与语言无关
这是一个切碎并稍微掩盖的样本输出:
$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0385 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 5126 1 f4807080 100 0 0 10 -1
1: 00000000:2328 00000000:0000 0A 00000000:00000000 00:00000000 00000000 113 0 5264 1 f62ff540 100 0 0 10 -1
2: 00000000:008B 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4535 1 f5bf1540 100 0 0 10 -1
9: 0200000A:08AE xxxxxxxx:D512 01 00000030:00000000 01:00000018 00000000 0 0 759198 4 f63e95c0 24 4 3 10 19
10: 0200000A:0D9B xxxxxxxx:7582 01 00000000:00000000 00:00000000 00000000 113 0 634192 1 f63e90c0 21 4 22 5 3
您正在查看的关键字段位于(本地端口)和(状态)列:
后面的十六进制中。local_address
st
状态列在内核源代码中引用./include/net/tcp_states.h
,但有帮助的是,有人在 StackExchange 上提出了这个问题:https://stackoverflow.com/questions/5992211/list-of-possible-internal-socket-statuses-from-proc
为了完整性,我将在这里重复:
enum {
TCP_ESTABLISHED = 1,
TCP_SYN_SENT,
TCP_SYN_RECV,
TCP_FIN_WAIT1,
TCP_FIN_WAIT2,
TCP_TIME_WAIT,
TCP_CLOSE,
TCP_CLOSE_WAIT,
TCP_LAST_ACK,
TCP_LISTEN,
TCP_CLOSING, /* Now a valid state */
TCP_MAX_STATES /* Leave at the end! */
};
正如其中一条评论所述,这是一个enum
状态从 1 开始按顺序编号的情况。您主要要寻找的是0A
(LISTENING) 和01
(ESTABLISHED)
注意:为了找出 netstat 从哪里获取此信息,我运行了strace -e open,write netstat -an
。
这里有更深入的字段标题:http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html