ssh -L (error: enlace: dirección ya en uso)

48

Bastante simple, sé que esto me ha pasado antes. No se pudo encontrar una buena respuesta en AU.

Estaba ejecutando una sesión ssh con puertos vinculados:

ssh -L 3000:<server_name>:22

Acabo de perder mi conexión. Cuando intento reconectarme usando el mismo comando, aparece el siguiente error:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000

¿Cómo reinicio ssh en mi máquina para permitir que el puerto vuelva a estar vinculado? Restablecer la máquina local funciona.

kbuilds
fuente

Respuestas:

66

¿No podrías matar lo que sea que esté usando ese puerto?

 lsof -ti:5901 | xargs kill -9

lsof -ti:5901para encontrar lo que sea que esté usando el puerto 5901.

Pase todo kill -9para matar todo lo que estaba usando el puerto 5901.

Reemplace con el puerto que desea abrir nuevamente.

usuario974407
fuente
Sí, puede cambiar el número de puerto a cualquier puerto que esté siendo bloqueado. Voy a marcar esto como la respuesta.
kbuilds
Si eres cauteloso y / o olvidadizo como yo, es posible que desees ejecutar lsof solo y descubrir cuál es el proceso antes de matarlo. lsof -ti:5901devolverá un número de proceso, que luego pasarákill -9
octern
3
¿Qué pasa si nada está usando el puerto 5901 (o cualquier puerto local que esté especificando)?
Michael
Pruebe sudosi el proceso no está surgiendolsof
rico remer
2
No hay razón para hacerlo a kill -9menos que el programa no responda por completo . Eliminar un proceso con la señal n. ° 9 (SIGKILL) lo finaliza inmediatamente sin darle al proceso la posibilidad de vaciar los búferes, cerrar los mangos de archivos y los sockets, eliminar los archivos temporales, etc., todo lo cual el proceso puede hacer si lo usa kill(por defecto es SIGTERM) , seguido de kill -1(SIGHUP; hangup) y kill -2(SIGINT; qué envía Ctrl + C) si eso no funciona, y finalmente kill -9 si nada más funciona .
TheDudeAbides
12

Supongo que todavía tienes algo conectado al puerto local 3000.

Puedes encontrarlo con

netstat -tulpn | grep 3000 

y luego deséchelo. Por ejemplo en mi máquina:

[:~] % netstat -tulpn | grep 5900
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      2547/vino-server
tcp6       0      0 :::5900                 :::*                    LISTEN      2547/vino-server

identifica correctamente el proceso en espera y conectado en el puerto 5900 (servidor vnc).

Otro comando útil es

fuser 3000/tcp 

... es posible que deba ejecutarlos todos sudosi no posee el proceso que está abriendo el puerto.

Rmano
fuente
Gracias por la respuesta. Tendré que investigar para ver si puedo recrear el problema. La única aplicación posible que podría haber estado escuchando en el puerto 3000 era la antigua sesión ssh que estaba desconectada. Mi usuario era el propietario del proceso, por lo que supuse que sería capaz de ejecutar killall sshy hacer que muriera. Supongo que ese no es el caso
kbuilds
Gracias por el recordatorio de uso sudo, eso es lo que me faltaba.
ACV
5

Pude recrearlo y arreglarlo haciendo lo siguiente:

  • Abre algo que enumere tus procesos ( ps -ae)
  • Mata el proceso llamado sh( kill <proc_number>)

Luego vuelva a abrir la conexión ssh

Alternativamente, he tenido éxito con:

killall ssh

En la terminal en la máquina local

kbuilds
fuente
2

Un contendiente más: ss

se puede usar así: ss -ltp | grep 3000para encontrar el programa escuchando en el puerto 3000

mnagel
fuente