-p
オプションを指定してss
を使用すると、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
への移行を妨げる唯一の理由です。
理由などは.
ss
、Linuxカーネルの iproute2ユーティリティコレクション の一部、 を使用ioctl()request 端末の現在の幅を取得します。
しかしながら; "other"フィールドには幅全体が使用され、プロセスフィールドは次の行に圧縮されます。
たとえば、これを表示することができます(端末に制限がある場合):
script ss.txt
ss -nlup4
exit
それからwiden端末ウィンドウとcat ss.txt
。
理由理由
ss -nulp4 | cat -A
"機能する"は、ユーティリティがそれを認識するかどうかです ttyに書き込むかどうか :
if (isatty(STDOUT_FILENO)) {
}
ソースコードの前の行からわかるように、デフォルトの幅は80に設定されています。したがって、ターミナルが130カラムである場合、次のようにします。
ss -nulp4 | cat
出力がtty(ではなくパイプ)ではなく、otherフィールドが80列に詰め込まれていることを認識し、processフィールドこれらの80列の後に書き込まれます。しかし、あなたの端末はもっと広いそして80カラムであり、プロセスエントリのためのスペースがあるので、それは1行で表示されます。
たとえば、同じことが言えます:
ss -nulp4 > ss.txt
"私の好みのフォーマットを実現する方法"については、おそらく不適切な方法の1つは、(端末によっては)方向に何かを行うことです:
stty cols 100
ss -nlup4
次のいずれかが出力の変更に役立つ場合があります。
ss -ltunp | column -t