¿Cómo elimino un puerto reenviado SSH?

52

Solía ssh -L 10002:192.168.0.30:10002 192.168.1.135establecer el reenvío de puertos, pero ahora necesito eliminarlo.

¿Cómo hago esto?

usuario16654
fuente
A menudo nos damos cuenta de que el puerto aún se reenvía cuando activamos una nueva sesión ssh que ejecuta el mismo comando nuevamente y recibe el Warning: remote port forwarding failed for listen portmensaje.
GabLeRoux

Respuestas:

56

Si está utilizando Linux, puede eliminar el proceso de la siguiente manera:

ps aux | grep ssh

y luego usar

kill <id>

Para matar el proceso.

Si el comando kill no tiene éxito, puede intentar

kill -9 <id>
zpon
fuente
31
No. No. No. Por favor, por favor, no lo use kill -9hasta después de haberlo intentado kill. Muchos procesos tendrán manejadores de señales que limpiarán su uso de recursos, cerrarán conexiones y otras tareas previas al cierre. Si matas con -9, el proceso muere inmediatamente sin hacer la limpieza. La matanza sin -9 será trabajar la mayor parte del tiempo.
Doug Harris
17
kill -9sin razón es como usar una escopeta para matar un mosquito. :)
Darren Hall
2
Usualmente hago un trazador de líneas pgrep ssh | xargs kill. No utilices -9para nada de hecho
GabLeRoux
2
@GabLeRoux Eso supone que solo tiene un solo sshcomando, o que todos los sshcomandos que está ejecutando están bien para matar. Esta no es una buena suposición general.
tripleee
2
@Avamander Me conecto a múltiples sshinstancias en múltiples servidores remotos todo el tiempo, algunas de ellas sin mi participación activa directa. Por ejemplo, el modo Emacs Tramp abre una sshconexión detrás de escena cuando visito un búfer remoto. Algunas personas usan sistemas de archivos de espacio de usuario que hacen algo similar. No es nada raro. De hecho, asumiría que un solo usuario, una sola sshinstancia, es un caso de uso marginal minoritario. Si funciona para usted, bien por usted, pero no es un buen consejo general.
tripleee
20

Cuando se usa la multiplexación ssh, matar el proceso ssh a menudo es indeseable (mata todas las conexiones abiertas con ese host), y no puede acceder fácilmente al escape porque "el escape no está disponible para sesiones multiplexadas". La forma correcta es ejecutar el análogo del comando de reenvío que desea cancelar, pero agregando -O cancel. Por ejemplo:

ssh -O cancel -L 10002:192.168.0.30:10002 192.168.1.135

Esto deshabilitará este reenvío de puertos sin terminar la sesión. Nuevamente, esto solo funcionará si se usa multiplexación ssh para la conexión a 192.168.1.135 .

a3nm
fuente
Estoy muy contento de que esto exista y lo encontré, ¡muchas gracias!
galva
2
Esta es una mejor solución. Para matar al maestro solo corre ssh -O exit 192.168.1.135.
Oriente el
Si está no multiplexación sesiones, véase el excelente respuesta de Exhuma! (Gracias a3nm por detectar mi error tipográfico.)
Alan De Smet
¡increíble! ¡Esta debería ser la respuesta elegida!
Truong Nguyen
13

Cómo cancelar un puerto reenviado en una sesión SSH que ya se está ejecutando:

  1. Presione ~+ C(tilde + mayúscula C)
  2. Tipo -KL port
  3. Presione Entrar

Deberías ver esto:

ssh> -KL 10002
Canceled forwarding.
rebelde
fuente
12

Puede usar la "tecla de escape" (generalmente ~) seguida de C para obtener un cli a su conexión. Desde allí puede quitar túneles sin desconectar su conexión.

Jimmy Hedman
fuente
1
Me gustaría saber los detalles de esto. Sé que puede agregar túneles después de haber ingresado SSH, pero aún no he descubierto cómo derribar uno.
Carestad
99
Cuando esté en modo CLI, podría ayudar. -KL es el oppsite de -L, -KR es el oppsite de -R y -KD es el oppsite de -D. Hacer "tecla de escape" (~) seguido de # muestra sus túneles.
Jimmy Hedman
1
@JimmyHedman, es posible que desee editar su respuesta además de agregar un comentario. Hace que todo sea más legible. Y a veces los comentarios están ocultos (en caso de que sean demasiados).
exhuma
7

Puede ingresar a una consola interactiva escribiendo ~C(mayúscula "C"). Esto le permite agregar y eliminar dinámicamente reenvíos de puertos (entre otras cosas).

Esta secuencia tiene que venir justo después de un retorno de carro / nueva línea. Entonces, en caso de duda, solo escriba Enter~C(en secuencia).

Si no ves que los personajes aparecen en la consola, lo estás haciendo bien :)

Ahora debería ver un ssh>mensaje.

Para eliminar el puerto, simplemente ingrese -KL 10002seguido de Enter(donde 10002está su puerto reenviado).

Lo inverso, agregar un nuevo avance, se puede hacer de esta manera (de principio a fin):

Enter~C

ssh> -L 10002:192.168.0.30:10002

Enter

exhuma
fuente
Esta es la respuesta correcta si lo que no multiplexación de conexiones. Si es así, serás rebotado ~C escape not available to multiplexed sessions. Si ese es el caso, vea la excelente respuesta de a3nm.
Alan De Smet