Como posso identificar o comando que gerou um processo de escuta em uma determinada porta?

0

Estou usando a seguinte versão do Linux

[davea@mydevbox ~]$ uname -a
Linux mydevbox.mydomain.com 5.7.8-35.36.amzn1.x86_64 #1 SMP Wed Mar 16 17:15:34 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Eu quero descobrir o comando que iniciou um processo que escuta em uma porta específica. Idealmente, gostaria de descobrir de onde esse comando está sendo executado. Mas parece que não consigo identificar o comando. Usando o nmap eu posso dizer que é um servidor Jetty ...

[davea@mydevbox ~]$ nmap -sV -p 4444 localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2016-04-07 20:54 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00020s latency).
PORT     STATE SERVICE VERSION
4444/tcp open  http    Jetty 5.1.x (Linux/4.4.5-15.26.amzn1.x86_64 amd64 java/1.7.0_79)

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.25 seconds

Existe alguma maneira de descobrir qual comando gerou o servidor Jetty?

Obrigado, - Dave

Editar: aqui está a saída para a sugestão dada.

[davea@mydevbox ~]$ sudo lsof -i :4444
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    2140 root   10u  IPv6   9994      0t0  TCP *:krb524 (LISTEN)

[davea@mydevbox ~]$ sudo ps -p $(pidof java) -o args
ERROR: Process ID list syntax error.
********* simple selection *********  ********* selection by list *********
-A all processes                      -C by command name
-N negate selection                   -G by real group ID (supports names)
-a all w/ tty except session leaders  -U by real user ID (supports names)
-d all except session leaders         -g by session OR by effective group name
-e all processes                      -p by process ID
                                      -q by process ID (unsorted & quick)
T  all processes on this terminal     -s processes in the sessions given
a  all w/ tty, including other users  -t by tty
g  OBSOLETE -- DO NOT USE             -u by effective user ID (supports names)
r  only running processes             U  processes for specified users
x  processes w/o controlling ttys     t  by tty
*********** output format **********  *********** long options ***********
-o,o user-defined  -f full            --Group --User --pid --cols --ppid
-j,j job control   s  signal          --group --user --sid --rows --info
-O,O preloaded -o  v  virtual memory  --cumulative --format --deselect
-l,l long          u  user-oriented   --sort --tty --forest --version
-F   extra full    X  registers       --heading --no-heading --context
                                      --quick-pid
                    ********* misc options *********
-V,V  show version      L  list format codes  f  ASCII art forest
-m,m,-L,-T,H  threads   S  children in sum    -y change -l format
-M,Z  security data     c  true command name  -c scheduling class
-w,w  wide output       n  numeric WCHAN,UID  -H process hierarchy
[davea@mydevbox ~]$ 
    
por Dave 07.04.2016 / 23:01

2 respostas

0

lsof -i: 4444

deve listar os processos usando 4444. Você deve iniciá-lo como root ou via sudo para evitar a saída restrita a mostrar apenas os processos do seu id.

    
por 07.04.2016 / 23:37
3

Existem muitas maneiras. Um simples envolve ss :

# ss -lntp | grep 22
  LISTEN     0      128                       *:22                    *:*      users:(("sshd",1100,3))
  LISTEN     0      128                      :::22                   :::*      users:(("sshd",1100,4))

As opções significam: -l exibir portas nas quais um processo está atendendo, -n não resolver nomes, -t considerar apenas portas TCP, -p exibir o processo atendendo nessa porta. Nesse caso, você identifica o nome do processo ( sshd , dificilmente surpreendente) e o ID do processo, 1100. Para uma porta UDP, o comando acima deve ser convertido para ss -lnup .

Ou você pode usar lsof :

# lsof -i :22
  COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  sshd    1100 root    3u  IPv4  10089      0t0  TCP *:22 (LISEN)
  sshd    1100 root    4u  IPv6  10091      0t0  TCP *:22 (LISTEN

Para uma porta UDP, o comando deve ser lsof -i UDP:22 .

Por último, se você quiser ver a linha de comando completa que iniciou um determinado processo, faça o seguinte:

# ps -p $(pidof sshd) -o args
  COMMAND
  /usr/sbin/sshd -D

Neste caso, o comando inteiro não é muito informativo, mas ocasionalmente pode ser: você conhece todos os argumentos na invocação do seu servidor X?

# ps -p $(pidof X) -o args
  COMMAND
  /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch

Se você quiser aprender mais, como qual cadeia de processos iniciou o programa em questão, que pode apontar para o usuário que iniciou o programa, use

ps auxf

que mostrará, no lado direito, a cadeia de garfos que leva a um programa em execução no momento, com muitas informações também.

Uma vez que você sabe o ID do processo, PID , você pode encontrar all da informação disponível para o sistema no diretório /proc/PID , a parte complicada é que a informação não é imediatamente -Explanatorio. Se você tiver interesse, este artigo fornece mais informações, caso contrário use man proc .

Por último, lembre-se que esta informação não está definida: os programas podem alterar pelo menos uma parte da sua própria informação, veja por exemplo esta resposta no ServerFault .

    
por 07.04.2016 / 23:44