En Cygwin, quiero un script Bash para:
- Cree un túnel SSH a un servidor remoto.
- Haga un trabajo local que use el túnel.
- Luego cierra el túnel.
La parte de apagado me tiene perplejo.
Actualmente, tengo una solución poco convincente. En un shell ejecuto lo siguiente para crear un túnel:
# Create the tunnel - this works! It runs forever, until the shell is quit.
ssh -nNT -L 50000:localhost:3306 jm@sampledomain.com
Luego, en otra ventana de shell, hago mi trabajo:
# Do some MySQL stuff over local port 50000 (which goes to remote port 3306)
Finalmente, cuando termino, cierro la primera ventana de shell para matar el túnel.
Me gustaría hacer todo esto en un script como:
# Create tunnel
# Do work
# Kill tunnel
¿Cómo hago un seguimiento del proceso del túnel, para saber cuál matar?

Respuestas:
Puede hacerlo limpiamente con un ssh 'control socket'. Para hablar con un proceso SSH que ya se está ejecutando y obtener su pid, matarlo, etc. Utilice el 'socket de control' (-M para master y -S para socket) de la siguiente manera:
Tenga en cuenta que my-ctrl-socket será un archivo real creado.
Recibí esta información de una respuesta muy RTFM en la lista de correo de OpenSSH .
fuente
Operation not permittedsubo al entorno de integración continua drone.io:muxserver_listen: link mux listener ssh-ctrl-socket.wsASkszgSBlK7kqD => ssh-ctrl-socket: Operation not permittedmy-ctrl-socketarchivo después de ejecutar esto? Cuando lo hagols -laen la carpeta actual ya no puedo ver el archivo.while [ ! -e $ctrl_socket ]; do sleep 0.1; doneopen failed: administratively prohibited: open failedy no creo que esté abriendo el túnelPuede decirle a SSH que se ejecute en segundo plano con la opción -f, pero no obtendrá el PID con $ !. Además, en lugar de que su script duerma una cantidad arbitraria de tiempo antes de usar el túnel, puede usar -o ExitOnForwardFailure = yes con -f y SSH esperará a que todos los puertos remotos se establezcan con éxito antes de colocarse en segundo plano. Puede grep la salida de ps para obtener el PID. Por ejemplo, puedes usar
y asegúrese de obtener el PID deseado
fuente
sshque vaya al fondo&y no cree un shell en el otro lado (solo abra el túnel) con una bandera de línea de comando (veo que ya lo hizo-N).PID=$!kill $PIDEDITAR: fijo $? a $! y agregó el &
fuente
trap 'kill $PID' 1 2 15cubrirá muchos casos de falla de script.trap "kill $PID", porque bash solo interpolará variables dentro de cadenas dobles entre comillasPIDvariable se redefiniera más adelante. La variable se expande cuandotrapse llama al incorporado (el enfoque del OP) o cuando se ha captado una señal (su enfoque); ambos enfoques producen el mismo resultado aquí.Prefiero lanzar un nuevo shell para tareas separadas y a menudo uso la siguiente combinación de comandos:
o algunas veces:
Estos comandos crean un shell anidado donde puedo hacer todo mi trabajo; cuando termino, presiono CTRL-D y el shell principal se limpia y sale también. Puede lanzar fácilmente
bash;su script de túnel ssh justo antes de lakillparte para que cuando cierre la sesión del shell anidado su túnel se cierre:fuente
Puede iniciar el
sshcon un&final, para ponerlo en segundo plano y tomar su identificación cuando lo haga. Entonces solo tiene que hacer unakillde esa identificación cuando haya terminado.fuente
Otra opción potencial: si puede instalar el paquete esperado, debería poder hacer un script completo. Algunos buenos ejemplos aquí: http://en.wikipedia.org/wiki/Expect
fuente