本地化 - 与 netcat 无关的输出

本地化 - 与 netcat 无关的输出

我想使用 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_addressst

状态列在内核源代码中引用./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

相关内容