我想使用netcat来testing一些端口是否正在侦听,但是由于这个命令将会在那些语言不同于英语的机器上执行,所以根据单词LISTENING来grep它的输出并不是一个好主意(例如,我在德国电脑上看到了ABHOREN这个词)。
我试图看看netcat的manpages,但我似乎无法find解决scheme,所以我想知道是否有人设法将端口的状态转换为数字格式,而不是string。
提前致谢 :)
如果你说LISTENING,我猜你实际上想要netstat (而不是netcat )。 大多数现代系统都理解netstat -lnt ,它只列出LISTENING tcp套接字,没有别的。 要小心RHEL7的最小安装,没有netstat – 它被弃用在ss (同样的标志ss -lnt但略有不同的输出格式)。
在一般情况下,答案是正确设置环境中的语言环境,这样所有的stream程都会用英语(或者更好的是C)和你交谈。
您可以在运行之前导出netcat的语言(甚至可以导出整个脚本):
LANG=C netcat ...
像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列(Status)下面的hex数字中查找关键字段。
状态列在内核源代码./include/net/tcp_states.h中被./include/net/tcp_states.h ,但是有人在./include/net/tcp_states.h上问了一个问题: https : ./include/net/tcp_states.h -socket-状态,从进程内
我会在这里复制完整性:
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