¿Cómo detener / matar un túnel autossh?

17

Ahora que tengo un túnel autossh, ¿cuál es la forma correcta de detenerlo?

Parece que no hay una manera fácil de hacer esto. La documentación no está clara en esta parte.

¿La forma más fácil parece ser reiniciar la máquina? ¿Es esto correcto?

onknows
fuente

Respuestas:

21

No, la forma correcta de matar autosshes simplemente matar el proceso autossh, nada más.

La razón es

# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable

eso autosshes simplemente un script de shell, no un servicio . Comienza un nuevo programa, en su última línea,

exec /usr/lib/autossh/autossh "$@"

De nuevo no es un servicio. En cuanto a exec(puede verificarlo en la wiki de los piratas informáticos de Bash ), es un comando integrado en el shell que reemplaza el shell actual con el siguiente comando ( /usr/lib/autossh/autossh "$@"en este caso) sin iniciar un nuevo proceso. Entonces, la única forma de detenerse autosshes matar el script de llamada, por ejemplo

pkill -3 autossh

(gracias a dviljoen por señalar la importancia de usar la bandera -3 , ver más abajo). Por cierto, matar la sshconexión no funcionará, porque el comando de llamada ( es decir , el anterior) simplemente comenzará una nueva conexión tan pronto como se dé cuenta de que la anterior se ha caído.

MariusMatutiae
fuente
1
En realidad deberías matar autossh sin el -9. Si ya se ha realizado una conexión a través del túnel, habrá generado un proceso sshd secundario para manejarlo. Matar el autossh padre con -9 dejará atrás el proceso sshd. El túnel seguirá funcionando hasta que el proceso sshd se agote. Si usa la señal predeterminada (-3) en el kill, se cerrará con gracia y se llevará el proceso sshd generado.
dviljoen
hola ya que el -3 es la señal de
apagado
@ AndrésAlcarraz ¿De verdad estás seguro? SIGTERMes el predeterminado, y ese es 15. SIGQUITes decir 3, consulte superuser.com/questions/352147/what-does-kill-3-mean y en.wikipedia.org/wiki/Kill_(command) - Además, FWIW, acabo de comprobarlo y -15no lo apagué , entonces SIGTERMno se puede usar.
Daniel F
Y el uso pkillsin señal (= the default) tampoco termina autossh.
Daniel F
@DanielF tienes razón, estaba confundido con la "señal predeterminada (-3)" del comentario de dvijoen
Andrés Alcarraz
5

ejecutar auto ssh con:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

mátalo con:

kill pid

Por cierto

pkill -9 autossh es un error

-9se asegura de que el proceso no salga con gracia, por lo que el sshproceso aún está allí cuando autosshse termina

sin -9sigue siendo malo, si tienes varios túneles funcionando, pkilllos matarás a todos

la forma correcta es establecer AUTOSSH_PIDFILEenv var entonces killese pid solo

Erik
fuente
Bienvenido a Super User. Parece que su párrafo final es su respuesta real, mientras que el resto de su pregunta es un comentario sobre otra respuesta . Dada la naturaleza de preguntas y respuestas de este sitio, sería útil agregar suficientes detalles a su respuesta para que pueda ser independiente. Gracias por contribuir y no te olvides de visitar el recorrido .
Digo reinstalar a Mónica el
4

Busca el proceso:

ps aux | grep ssh

La segunda columna es el número PID

Proceso de eliminación por PID :)

kill -9 PIDnumber

Use sudo si no tiene privilegios de root.

NIZ
fuente
1

Sé que esto ha sido respondido, pero al contrario de los comentarios anteriores, el uso pkill -3 autosshNO mata los procesos secundarios sshd para mí.

Yo uso esta función en mi .bashrcarchivo.
Básicamente, es como agregar un --killargumento a autossh.

  if [ "$1" = "--kill" ]; then
    ps aux | 
    grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
    awk '{print $2}' |
    xargs -r kill
  else
    $(which autossh) "$@"
    echo "" # prevents line wrapping when you kill the ssh process
  fi

Puede ejecutar which sshy which autosshverificar las rutas en su sistema.

Mientras el primer argumento no lo sea --kill, simplemente pasa los argumentos a autossh.

Este script mata las instancias de autossh y ssh. Esto es importante si está utilizando el reenvío de puertos porque, al matar SOLAMENTE la instancia de autossh no mata el túnel, solo evita que se vuelva a conectar si / cuando finalmente se desconecta.

También puede especificar un término de búsqueda (nombre de host) para eliminar solo túneles específicos.

autossh --kill dbserver1mata solo las conexiones a dbserver1
autossh --kill dbservermatará dbserver1, dbserver2, etc.
autossh --kill dbservermatará TODAS las conexiones autossh

Para aclarar, DEBE matar solo las sesiones SSH iniciadas por autossh.

Si ejecuta ps aux | grep sshmientras tiene las sesiones autossh y ssh ejecutándose, verá que las iniciadas por autossh usan la ruta completa (/ usr / bin / ssh y / usr / lib / autossh / autossh).
Este script solo hace coincidir los resultados con los procesos iniciados con la ruta específica. Hice esto porque (y supongo que la mayoría de las personas) usualmente escribo sshy no la ruta completa, lo que evita que mate mis sesiones ssh normales.

Espero que esto ayude a otros.

KeithMcFly
fuente
alguna razón en particular para en $(which autossh)lugar de simplemente autossh?
MestreLion