ss - linux 套接字统计实用程序输出格式

Nar*_*asK 27 linux command-line command ss

使用sswith-p选项时,user/pid/fd列会跳到特定行下方。例如,这就是我实际看到的:

# ss -nulp4
State      Recv-Q Send-Q                                           Local Address:Port                                             Peer Address:Port 
UNCONN     0      0                                                            *:20000                                                       *:*      
users:(("perl",pid=9316,fd=6))
UNCONN     0      0                                                            *:10000                                                       *:*      
users:(("perl",pid=9277,fd=6))
UNCONN     0      0                                               192.168.100.10:53                                                          *:*      
users:(("named",pid=95,fd=517),("named",pid=95,fd=516))
UNCONN     0      0                                                    127.0.0.1:53                                                          *:*      
users:(("named",pid=95,fd=515),("named",pid=95,fd=514))
Run Code Online (Sandbox Code Playgroud)

首选输出格式:

# ss -nulp4
State      Recv-Q Send-Q                                           Local Address:Port                                             Peer Address:Port 
UNCONN     0      0                                                            *:20000                                                       *:*      users:(("perl",pid=9316,fd=6))
UNCONN     0      0                                                            *:10000                                                       *:*      users:(("perl",pid=9277,fd=6))
UNCONN     0      0                                               192.168.100.10:53                                                          *:*      users:(("named",pid=95,fd=517),("named",pid=95,fd=516))
UNCONN     0      0                                                    127.0.0.1:53                                                          *:*      users:(("named",pid=95,fd=515),("named",pid=95,fd=514))
Run Code Online (Sandbox Code Playgroud)

为了确认没有换行符,我试过这个:

# ss -nulp4 | cat -A
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port $
UNCONN     0      0                         *:20000                    *:*      users:(("perl",pid=9316,fd=6))$
UNCONN     0      0                         *:10000                    *:*      users:(("perl",pid=9277,fd=6))$
UNCONN     0      0            192.168.100.10:53                       *:*      users:(("named",pid=95,fd=517),("named",pid=95,fd=516))$
UNCONN     0      0                 127.0.0.1:53                       *:*      users:(("named",pid=95,fd=515),("named",pid=95,fd=514))$
Run Code Online (Sandbox Code Playgroud)

事实上你可以看到没有,但现在,奇怪的是,输出格式是我想要的方式。有人可以解释这里发生了什么吗?如何实现我喜欢的格式?

这是阻止我从 迁移netstat到的唯一原因ss。

小智 23

以下一项可能有助于更改输出:

ss -ltunp | column -t 
Run Code Online (Sandbox Code Playgroud)


Run*_*ium 16

至于为什么等等。

ss是 Linux 内核中iproute2实用程序集合的一部分,它使用ioctl()请求来获取终端的当前宽度。

然而; 整个宽度用于“其他”字段,过程字段被挤压到下一行。

例如,您可以通过以下方式查看(当在终端上有限制时):

script ss.txt
ss -nlup4
exit
Run Code Online (Sandbox Code Playgroud)

然后扩大您的终端窗口和cat ss.txt.

原因为何

ss -nulp4 | cat -A
Run Code Online (Sandbox Code Playgroud)

«works»是因为该实用程序识别它是否写入 tty:

if (isatty(STDOUT_FILENO)) {

}
Run Code Online (Sandbox Code Playgroud)

正如您从源代码中的前一行中看到的,默认宽度设置为 80。因此,如果您的终端位于 130 列并且您执行以下操作:

ss -nulp4 | cat
Run Code Online (Sandbox Code Playgroud)

它识别输出不是到 tty(而是到管道)并且其他字段被塞进 80 列,而过程字段被写入这 80 列之后。但是由于您的终端比80 列更宽,并且有空间用于流程条目,因此它显示在一行中。

例如:

ss -nulp4 > ss.txt
Run Code Online (Sandbox Code Playgroud)

至于如何“实现我的首选格式”,一种可能不合适的方法是在(取决于终端)的方向上做一些事情:

stty cols 100
ss -nlup4
Run Code Online (Sandbox Code Playgroud)

  • 很好的解释,但使用“column -t”似乎是最简单的方法。 (2认同)