ss - format wyjściowy narzędzia statystyki gniazd linux

21

W przypadku korzystania ssz -popcji user/pid/fdkolumna przeskakuje pod określoną linią. Na przykład to właśnie widzę:

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

Preferowane formatowanie wyjściowe :

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

Aby potwierdzić, że nie ma podziału linii, próbowałem:

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

I rzeczywiście widać, że nie było, ale teraz, co dziwne, format wyjściowy jest taki, jak chciałem. Czy ktoś mógłby wyjaśnić, co się tutaj dzieje? Jak mogę uzyskać preferowane formatowanie?

Jest to jedyna rzecz, zatrzymując mnie od migracji z netstatcelu ss.

NarūnasK
źródło

Odpowiedzi:

10

Jeśli chodzi o dlaczego itp.

ss, część kolekcji narzędzi iproute2 w jądrze systemu Linux, używa żądania ioctl () w celu uzyskania bieżącej szerokości terminala.

Jednak; cała szerokość jest używana dla pól «innych», a pole procesowe zostaje ściśnięte do następnej linii.

Możesz to zobaczyć na przykład (gdy masz ograniczony z terminalem):

script ss.txt
ss -nlup4
exit

Następnie poszerz okno terminala i cat ss.txt.

Powód dlaczego

ss -nulp4 | cat -A

«Działa», ponieważ narzędzie rozpoznaje, czy zapisuje do tty, czy nie :

if (isatty(STDOUT_FILENO)) {

}

Jak widać z poprzedniego wiersza w kodzie źródłowym, domyślna szerokość jest ustawiona na 80. Zatem jeśli twój terminal ma na przykład 130 kolumn i robisz:

ss -nulp4 | cat

rozpoznaje, że dane wyjściowe nie są tty (ale potoku), a pozostałe pola są wciśnięte w 80 kolumn, podczas gdy pole procesu jest zapisywane po tych 80 kolumnach. Ale ponieważ twój terminal jest szerszy niż 80 kolumn i ma miejsce na wejście do procesu, jest wyświetlany w jednym wierszu.

To samo dotyczy na przykład:

ss -nulp4 > ss.txt

Jeśli chodzi o sposób „osiągnięcia preferowanego formatowania”, jednym prawdopodobnie nieodpowiednim sposobem jest zrobienie czegoś w kierunku (w zależności od terminala):

stty cols 100
ss -nlup4
Runium
źródło
Cudowne wyjaśnienie i niezła sztuczka z tym stty cols ustawienie. Wielkie dzięki!
monsune
Dobre wyjaśnienie, ale użycie column -twydaje się być najprostszym sposobem.
pevik
18

Następująca może być pomocna do zmiany wyniku:

ss -ltunp | column -t 
tamerlaha
źródło
1
To powinien być komentarz do odpowiedzi. Masz wystarczającą reputację, aby dodawać komentarze, skorzystaj z niej.
grochmal