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 permitted
subo al entorno de integración continua drone.io:muxserver_listen: link mux listener ssh-ctrl-socket.wsASkszgSBlK7kqD => ssh-ctrl-socket: Operation not permitted
my-ctrl-socket
archivo después de ejecutar esto? Cuando lo hagols -la
en la carpeta actual ya no puedo ver el archivo.while [ ! -e $ctrl_socket ]; do sleep 0.1; done
open failed: administratively prohibited: open failed
y 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
ssh
que 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 $PID
EDITAR: fijo $? a $! y agregó el &
fuente
trap 'kill $PID' 1 2 15
cubrirá muchos casos de falla de script.trap "kill $PID"
, porque bash solo interpolará variables dentro de cadenas dobles entre comillasPID
variable se redefiniera más adelante. La variable se expande cuandotrap
se 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 lakill
parte para que cuando cierre la sesión del shell anidado su túnel se cierre:fuente
Puede iniciar el
ssh
con un&
final, para ponerlo en segundo plano y tomar su identificación cuando lo haga. Entonces solo tiene que hacer unakill
de 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