netsat
postfixデーモンは、次のように使用する場合にのみ「master」という名前を持ちます。
root@myhost# netstat -tulpen| grep master
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 0 53191445 13640/master
以下を使用すると、ps
より詳細な名前を取得できます。
root@myhost# ps aux| grep 13640
root 13640 0.0 0.0 25036 1500 11:35 0:00 /usr/lib/postfix/master
netstat
出力に長い名前を知らせる方法はありますか?
この場合は/usr/lib/postfix/master
。
修正する
netstatではできないようです。他のツールを使用してこれを行う方法を知っている場合は、この質問も有効な質問です。 (しかし、netstatベースのソリューションは依然として好ましいです)。
アップデート2
すべての回答が有効です。 UNIXの知識を見せてくれてありがとう。しかし、これまでの答えは長すぎるか複雑です。
簡単な解決策はありませんか?必要なツールは何でもインストールできますが、使い方が簡単で簡単であればと思います。
皆さんに賞金を与えることはできませんが…。
必要な情報を得るために後処理することができるいくつかの答えがあります。各回答は異なるアプローチを使用し、ある解決策が他の解決策よりも優れているとは思わない。
残念ながら、どのUnix / Linuxもこの機能をすぐに実行できるようには思えません。しかし、あなたが私を助けようとしていたのはあなたのせいではありません。
残念ながら、すべての回答に賞金を提供することはできません。 :-)
評判スコアが最も低いユーザーに賞金を支払いました。
答え1
これは私がしばらく経験した「エレガントな」ソリューションの最も興味深い検索です。ありがとうございます。
一般的な答え:
実行することは解析するよりも/proc/pid/cmdline
意味がありますreadlink /proc/pid/exe
。
外観:
full
私は複雑さを抽象化するためにシェル関数を設定しました。主にタイピング時間を節約するためでした。
唯一の依存関係はPOSIX互換ex
そしてLinux標準readlink
。
head
簡潔さのために、以下の端子出力をパイプで接続しました。
[root@localhost ~]# netstat -tulpen | head
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 9581 1237/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 0 10164 1493/master
tcp 0 0 0.0.0.0:555 0.0.0.0:* LISTEN 0 14326 2824/nc
tcp 0 0 0.0.0.0:46638 0.0.0.0:* LISTEN 29 8848 960/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 0 8749 940/rpcbind
tcp 0 0 :::22 :::* LISTEN 0 9583 1237/sshd
tcp 0 0 ::1:25 :::* LISTEN 0 10166 1493/master
tcp 0 0 :::47166 :::* LISTEN 29 8856 960/rpc.statd
[root@localhost ~]# netstat -tulpen | head | full
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 9581 1237/usr/sbin/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 0 10164 1493/usr/libexec/postfix/master
tcp 0 0 0.0.0.0:555 0.0.0.0:* LISTEN 0 14326 2824/usr/bin/nc
tcp 0 0 0.0.0.0:46638 0.0.0.0:* LISTEN 29 8848 960/sbin/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 0 8749 940/sbin/rpcbind
tcp 0 0 :::22 :::* LISTEN 0 9583 1237/usr/sbin/sshd
tcp 0 0 ::1:25 :::* LISTEN 0 10166 1493/usr/libexec/postfix/master
tcp 0 0 :::47166 :::* LISTEN 29 8856 960/sbin/rpc.statd
[root@localhost ~]#
netstat -p
また、一部の行に追加の末尾データがある場合でも、すべてのフォームで機能します。
[root@localhost ~]# netstat -p | head
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.0.2.15:ssh 10.0.2.2:63550 ESTABLISHED 2557/sshd
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 11 [ ] DGRAM 8584 895/rsyslogd /dev/log
unix 2 [ ] DGRAM 9124 1045/hald @/org/freedesktop/hal/udev_event
unix 2 [ ] DGRAM 7116 340/udevd @/org/kernel/udev/udevd
unix 2 [ ] DGRAM 16523 3537/pickup
unix 2 [ ] DGRAM 15036 2865/su
[root@localhost ~]# netstat -p | head | full
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.0.2.15:ssh 10.0.2.2:63550 ESTABLISHED 2557/usr/sbin/sshd
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 11 [ ] DGRAM 8584 895/sbin/rsyslogd /dev/log
unix 2 [ ] DGRAM 9124 1045/usr/sbin/hald @/org/freedesktop/hal/udev_event
unix 2 [ ] DGRAM 7116 340/sbin/udevd @/org/kernel/udev/udevd
unix 2 [ ] DGRAM 16523 3537/usr/libexec/postfix/pickup
unix 2 [ ] DGRAM 15036 2865/bin/su
[root@localhost ~]#
定義方法:
[root@localhost ~]# type full
full is a function
full ()
{
ex -c 'g/^.*\(\<[0-9]\+\)\/.*$/ya|pu|s::readlink /proc/\1/exe:|.!sh' -c 'g/^\//-ya|pu|-2s/^\(.*\<[0-9]\+\)\/[^[:space:]]*\(.*\)$/\1/|+2s//\2/|-2j!3' -c%p -c 'q!' /dev/stdin
}
[root@localhost ~]#
仕組み(段階別分析):
(すぐに発売される予定です。これまで使ってみて、気に入ったら教えてください。)
答え2
すでにわかっているように、オプションを含むフル出力はデフォルトnetstat
では使用できません。ソースによると、次のように制限されているようです。cmdline
-p
20文字そしてリストのみ完全なコマンドラインの一部
netstatの周りに独自のラッパーを作成して、詳細全体を表示できます。完全なcmd行を表示する次のPythonコードを追加しました。
#!/usr/bin/env python
from subprocess import Popen,PIPE
out,err = Popen(['netstat','-antlp'],stdout=PIPE).communicate()
for l in out.splitlines():
line = l.split()
if '/' in line[-1]:
p = line[-1].split('/')[0]
line[-1] = str(p) + ' -> ' + open('/proc/'+p+'/cmdline','r').readline().split('-')[0]
print '\t'.join(line)
出力例:
$ sudo ./netstat.py
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:11443 0.0.0.0:* LISTEN 4007 -> /usr/sbin/apache2
tcp 0 0 192.168.2.125:53 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 172.17.0.1:53 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 192.168.125.1:53 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 192.168.0.200:53 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3125 -> /usr/sbin/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 30845 -> /usr/sbin/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3884 -> /usr/sbin/exim4
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 0.0.0.0:32765 0.0.0.0:* LISTEN 3014 -> /sbin/rpc.statd
tcp 0 0 0.0.0.0:8895 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 0.0.0.0:23423 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 0.0.0.0:32767 0.0.0.0:* LISTEN 3827 -> /usr/sbin/rpc.mountd
tcp 0 0 0.0.0.0:23424 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:23523 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 0.0.0.0:23524 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 192.168.0.200:44331 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 3002 -> /sbin/rpcbind
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 4007 -> /usr/sbin/apache2
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 3908 -> /usr/bin/Xorg:0
同様の行の周りにラッパーを直接作成してツールボックスに追加できます。
答え3
私はただ楽しみのためにこれをしました:
sudo netstat -putan | awk '/master/ {out=""; for(i=1;i<=6;i++){out=out" "$i}; split($7,result,"/"); system("ps aux | grep -v grep | grep " result[1] " >> x&"); getline < "x"; print out " " $14}'
私はこれがあなたが望むものだと思います。使用を簡素化するために、いつでもエイリアスとして使用できます。
説明する:
次の行は、netstatの出力を取得してフィルタリングします。master
sudo netstat -putan | awk '/master/
次の行は、netstatの出力を保存します。
out=""; for(i=1;i<=6;i++){out=out" "$i}
次の行はpidを取得します。
split($7,result,"/")
次の行はps auxからフルネームを取得し、すべての内容を印刷します。
system("ps aux | grep -v grep | grep " result[1] " >> x&"); getline < "x";
最後に印刷してみてください。
print out " " $14
答え4
@iñaki-murilloに似たソリューション/proc/pid/cmdline
ですが。また、最後のフィールドが$ 7であると仮定して代わりにフォーマットされたと仮定して使用しました(私のシステムでは実際には$ 6でした)。ps
grep
$NF
pid/procname
netstat -putan|awk '/master/ {split($NF, pid,"/");sub(FS $NF,x);getline cmd < ("/proc/"pid[1]"/cmdline");print $0" "pid[1]"/"cmd}'
説明する
/master/
マスターを含む行をフィルタリングします。
split($NF, pid,"/");
最後のフィールドを分割して/
次の場所に保存します。pid
sub(FS $NF,x);
最後のフィールドを削除します。
getline cmd < ("/proc/"pid[1]"/cmdline")
そのpidのコマンドライン呼び出しを読みますcmd
。
print $0" "pid[1]"/"cmd
すべて印刷