고쳐 쓰다

고쳐 쓰다

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 지식을 보여주셔서 대단히 감사합니다. 그러나 지금까지 답변은 너무 길거나 복잡합니다.

간단한 해결책은 없을까요? 필요한 도구는 무엇이든 설치할 수 있지만 사용법이 간단하고 쉬웠으면 합니다.

여러분 모두에게 현상금을 줄 수는 없지만…

필요한 정보를 얻기 위해 후처리할 수 있는 몇 가지 답변이 있습니다. 각 답변은 서로 다른 접근 방식을 사용하며 한 솔루션이 다른 솔루션보다 낫다고 생각하지 않습니다.

불행하게도, 어떤 유닉스/리눅스도 이 기능을 즉시 수행할 수 있는 것 같지 않습니다. 하지만 당신이 나를 도우려고 한 것은 당신 잘못이 아닙니다.

불행히도 모든 답변에 대해 현상금을 제공할 수는 없습니다. :-)

평판 점수가 가장 낮은 사용자에게 현상금을 지급했습니다.

답변1

이것은 제가 한동안 경험해 본 "우아한" 솔루션에 대한 가장 흥미로운 검색입니다. 감사해요.

일반적인 답변:

실행하는 것이 구문 분석하는 것보다 /proc/pid/cmdline더 의미가 있습니다 readlink /proc/pid/exe.

모습:

full나는 복잡성을 추상화하기 위해 쉘 함수를 설정했습니다 . 주로 타이핑 시간을 절약하기 위해서였습니다.

유일한 종속성은POSIX 호환ex그리고 리눅스 표준 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모두 인쇄하세요

관련 정보