修正する

修正する

netsatpostfixデーモンは、次のように使用する場合にのみ「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-p20文字そしてリストのみ完全なコマンドラインの一部

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でした)。psgrep$NFpid/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すべて印刷

関連情報