ss - формат вывода утилиты статистики сокетов linux

21

При использовании ssс -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))

Предпочтительное форматирование вывода :

# 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))

Чтобы подтвердить, что нет разрывов строк, я попробовал это:

# 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))$

И действительно, вы можете видеть, что их не было, но теперь, как ни странно, формат вывода такой, каким я хотел его видеть. Может ли кто-нибудь объяснить, что здесь происходит? Как мне добиться желаемого форматирования?

Это единственное, что мешает мне netstatперейти с на ss.

NarūnasK
источник

Ответы:

10

Что и почему

ss, Часть iproute2 сбора полезной в Linux ядре, использует IOCTL () запрос , чтобы получить текущую ширину терминала.

Тем не мение; вся ширина используется для «других» полей, а поле процесса помещается на следующую строку.

Вы можете просмотреть это, например (если у вас есть ограничение на терминале):

script ss.txt
ss -nlup4
exit

Затем расширите окно вашего терминала и cat ss.txt.

Причина почему

ss -nulp4 | cat -A

«Работает» потому, что утилита распознает, пишет ли она tty или нет :

if (isatty(STDOUT_FILENO)) {

}

Как вы можете видеть из предыдущей строки в исходном коде, ширина по умолчанию установлена ​​равной 80. Таким образом, если ваш терминал имеет, скажем, 130 столбцов, и вы делаете:

ss -nulp4 | cat

он распознает, что вывод не в tty (но в трубу), а другие поля забиты в 80 столбцов, в то время как поле процесса записано после этих 80 столбцов. Но поскольку ваш терминал шире 80 столбцов и имеет место для входа в процесс, он отображается в одной строке.

То же самое касается, например:

ss -nulp4 > ss.txt

Что касается того, как «добиться моего предпочтительного форматирования», то один, вероятно, неподходящий способ - это сделать что-то в направлении (в зависимости от терминала):

stty cols 100
ss -nlup4
Runium
источник
Замечательное объяснение и хороший трюк с настройкой stty cols. Большое спасибо!
понедельник,
Хорошее объяснение, но использовать, column -tкажется, самый простой способ.
pevik
18

Следующий может быть полезным для изменения вывода:

ss -ltunp | column -t 
tamerlaha
источник
1
Это должен быть комментарий к ответу. У вас достаточно репутации, чтобы добавлять комментарии, пожалуйста, используйте ее.
grochmal