unix - usando - ¿Qué proceso está escuchando en un puerto determinado en Solaris?
ver puertos abiertos red hat (11)
Así que me conecto a un cuadro de Solaris, trato de iniciar Apache y descubro que ya hay un proceso de escucha en el puerto 80, y no es Apache. Nuestras cajas no tienen lsof instalado, por lo que no puedo consultar con eso. Creo que podría hacer:
pfiles `ls /proc` | less
y busque "port: 80", pero si alguien tiene una mejor solución, ¡soy todo oídos! Mejor aún si puedo buscar el proceso de escucha sin ser root. Estoy abierto a soluciones shell y C; No me importaría tener un pequeño ejecutable personalizado para llevar conmigo la próxima vez que esto ocurra.
Actualizado: estoy hablando de instalaciones genéricas de Solaris para las que no soy administrador (aunque sí tengo acceso de superusuario), por lo que instalar cosas desde el disco de software gratuito no es una opción. Obviamente, ninguno de los dos está utilizando extensiones específicas de Linux para fuser, netstat u otras herramientas. Hasta el momento, correr archivos en todos los procesos parece ser la mejor solución, desafortunadamente. Si ese sigue siendo el caso, probablemente publique una respuesta con un código ligeramente más eficiente que el anterior.
Lo más probable es que sea el servidor administrativo del sol ... Generalmente se incluye junto con el directorio de Sun y algunas otras cosas del webmin-ish que están en la instalación predeterminada.
Si tiene acceso a netstat
, eso puede hacer precisamente eso.
Es posible que no desee, pero su mejor opción es tomar el CD de Sunfreeware e instalar lsof.
Aparte de eso, sí, puede arrastrarse en / proc con un guión de shell.
Este es un enfoque indirecto, pero se puede ver si un sitio web se carga en el navegador web de su elección de lo que se está ejecutando en el puerto 80. O puede telnet al puerto 80 y ver si obtiene una respuesta que le da una pista como a lo que se está ejecutando en ese puerto y puedes apagarlo. Como el puerto 80 es el puerto predeterminado para el tráfico http, existe algún tipo de servidor HTTP ejecutándose de manera predeterminada, pero no hay garantía.
La respuesta de Mavroprovato informa más que solo los puertos de escucha. Los puertos de escucha son tomas sin par. El siguiente programa Perl informa solo los puertos de escucha. Funciona para mí en SunOS 5.10.
#! /usr/bin/env perl
##
## Search the processes which are listening on the given port.
##
## For SunOS 5.10.
##
use strict;
use warnings;
die "Port missing" unless $#ARGV >= 0;
my $port = int($ARGV[0]);
die "Invalid port" unless $port > 0;
my @pids;
map { push @pids, $_ if $_ > 0; } map { int($_) } `ls /proc`;
foreach my $pid (@pids) {
open (PF, "pfiles $pid 2>/dev/null |")
|| warn "Can not read pfiles $pid";
$_ = <PF>;
my $fd;
my $type;
my $sockname;
my $peername;
my $report = sub {
if (defined $fd) {
if (defined $sockname && ! defined $peername) {
print "$pid $type $sockname/n"; } } };
while (<PF>) {
if (/^/s*(/d+):.*$/) {
&$report();
$fd = int ($1);
undef $type;
undef $sockname;
undef $peername; }
elsif (/(SOCK_DGRAM|SOCK_STREAM)/) { $type = $1; }
elsif (/sockname: AF_INET[6]? (.*) port: $port/) {
$sockname = $1; }
elsif (/peername: AF_INET/) { $peername = 1; } }
&$report();
close (PF); }
Encontré este script en alguna parte. No recuerdo dónde, pero funciona para mí:
#!/bin/ksh
line=''---------------------------------------------''
pids=$(/usr/bin/ps -ef | sed 1d | awk ''{print $2}'')
if [ $# -eq 0 ]; then
read ans?"Enter port you would like to know pid for: "
else
ans=$1
fi
for f in $pids
do
/usr/proc/bin/pfiles $f 2>/dev/null | /usr/xpg4/bin/grep -q "port: $ans"
if [ $? -eq 0 ]; then
echo $line
echo "Port: $ans is being used by PID:/c"
/usr/bin/ps -ef -o pid -o args | egrep -v "grep|pfiles" | grep $f
fi
done
exit 0
Editar: Aquí está la fuente original: [Solaris] ¿Qué proceso está vinculado a un puerto determinado?
Aquí hay un trazador de líneas:
ps -ef| awk ''{print $2}''| xargs -I ''{}'' sh -c ''echo examining process {}; pfiles {}| grep 80''
el "PID del proceso examinador de eco" se imprimirá antes de cada búsqueda, por lo que una vez que vea una salida que hace referencia al puerto 80, sabrá qué proceso está sosteniendo el asa.
Alternativamente use:ps -ef| grep $USER|awk ''{print $2}''| xargs -I ''{}'' sh -c ''echo examining process {}; pfiles {}| grep 80''
Dado que a ''pfiles'' podría no gustarle que intente acceder a los procesos de otros usuarios, a menos que sea la raíz, por supuesto.
Creo que la primera respuesta es la mejor que escribí mi propio script de shell desarrollando esta idea:
#!/bin/sh
if [ $# -ne 1 ]
then
echo "Sintaxis:/n/t"
echo " $0 {port to search in process }"
exit
else
MYPORT=$1
for i in `ls /proc`
do
pfiles $i | grep port | grep "port: $MYPORT" > /dev/null
if [ $? -eq 0 ]
then
echo " Port $MYPORT founded in $i proccess !!!/n/n"
echo "Details/n/t"
pfiles $i | grep port | grep "port: $MYPORT"
echo "/n/t"
echo "Process detail: /n/t"
ps -ef | grep $i | grep -v grep
fi
done
fi
#!/usr/bin/bash
# This is a little script based on the "pfiles" solution that prints the PID and PORT.
pfiles `ls /proc` 2>/dev/null | awk "/^[^ //t]/{smatch=/$0;next}/port:[ //t]*${1}/{print smatch, /$0}{next}"
netstat en Solaris no le dirá esto, ni las versiones anteriores de lsof, pero si descarga y construye / instala una versión más nueva de lsof, esto puede decirle eso.
$ lsof -v
lsof version information:
revision: 4.85
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
configuration info: 64 bit kernel
constructed: Fri Mar 7 10:32:54 GMT 2014
constructed by and on: user@hostname
compiler: gcc
compiler version: 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
8<- - - - ***SNIP*** - - -
Con esto puedes usar la opción -i:
$ lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 521 root 3u IPv6 0xffffffff89c67580 0t0 TCP *:ssh (LISTEN)
sshd 5090 root 3u IPv6 0xffffffffa8668580 0t322598 TCP host.domain.com:ssh->21.43.65.87:52364 (ESTABLISHED)
sshd 5091 johngh 4u IPv6 0xffffffffa8668580 0t322598 TCP host.domain.com:ssh->21.43.65.87:52364 (ESTABLISHED)
Lo que muestra exactamente lo que estás pidiendo.
Ayer tuve un problema con un proceso Jetty (Java) estrellado, que solo dejó 2 archivos en su directorio / proc / [PID] (psinfo y uso).
pfiles no pudo encontrar el proceso (porque la fecha que necesitaba no estaba allí)
Lo encontré por mí.
Desde Solaris 11.2 en adelante, puede hacerlo con el comando netstat
. Echa un vistazo aquí . El -u
es lo que estás buscando.
Si se encuentra en una versión inferior de Solaris, como lo han señalado otros, la forma de hacerlo de Solaris es una especie de envoltorio de scripts alrededor del comando pfiles
. Sin embargo, ten en cuenta que el comando pfiles
detiene el proceso por una fracción de segundo para inspeccionarlo. Para el 99.9% de los procesos esto no es importante. Desafortunadamente tenemos un proceso que dará un volcado de núcleo si se golpea con un comando pfiles
por lo que somos un poco cautelosos con el uso del comando. Tu situación puede ser totalmente diferente si estás en el 99.9%, lo que significa que puedes usar el comando pfiles
forma segura.