Pregunta

Estoy usando la sinergia del programa junto con un túnel ssh

Funciona, solo tengo que abrir una consola y escribir estos dos comandos:

ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
synergyc localhost

porque soy flojo, hice un Bash-Script que se ejecuta con un clic del mouse en un ícono:

#!/bin/bash
ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
synergyc localhost

el Bash-Script anterior también funciona, pero ahora también quiero eliminar la sinergia y el túnel ssh con un clic del mouse, así que tengo que guardar los PID de sinergia y ssh en el archivo para eliminarlos más tarde:

#!/bin/bash

mkdir -p /tmp/synergyPIDs || exit 1
rm -f /tmp/synergyPIDs/ssh || exit 1
rm -f /tmp/synergyPIDs/synergy || exit 1

[ ! -e /tmp/synergyPIDs/ssh ] || exit 1
[ ! -e /tmp/synergyPIDs/synergy ] || exit 1

ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
echo $! > /tmp/synergyPIDs/ssh
synergyc localhost
echo $! > /tmp/synergyPIDs/synergy

Pero los archivos de este script están vacíos.

¿Cómo obtengo los PID de ssh y sinergia?
(Intento evitar las combinaciones ps aux | grep ... | awk ... | sed ... , tiene que haber una manera más fácil).

¿Fue útil?

Solución 5

bueno, no quiero agregar un & amp; al final de los comandos ya que la conexión morirá si la consola wintow está cerrada ... así que terminé con un ps-grep-awk-sed-combo

ssh -f -N -L localhost:12345:otherHost:12345   otherUser@otherHost
echo `ps aux | grep -F 'ssh -f -N -L localhost' | grep -v -F 'grep' | awk '{ print $2 }'` > /tmp/synergyPIDs/ssh
synergyc localhost
echo `ps aux | grep -F 'synergyc localhost' | grep -v -F 'grep' | awk '{ print $2 }'` > /tmp/synergyPIDs/synergy

(podría integrar grep en awk, pero ahora soy demasiado vago)

Otros consejos

Resumen rápido: no funcionará.

Mi primera idea es que necesita iniciar los procesos en segundo plano para obtener sus PID con $! .

Un patrón como

some_program &
some_pid=$!
wait $some_pid

podría hacer lo que necesita ... excepto que ssh ya no estará en primer plano para pedir más frases de contraseña.

Bueno, entonces podrías necesitar algo diferente después de todo. ssh -f probablemente genera un nuevo proceso que su shell nunca podrá conocer al invocarlo de todos modos. Idealmente, ssh en sí mismo ofrecería una forma de escribir su PID en algún archivo.

Con el debido respeto a los usuarios de pgrep , pkill , ps | awk , etc., hay una much mejor manera.

Tenga en cuenta que si confía en ps -aux | grep ... para encontrar un proceso que corra el riesgo de una colisión. Es posible que tenga un caso de uso en el que es poco probable, pero como regla general, no es el camino a seguir.

SSH proporciona un mecanismo para gestionar y controlar procesos en segundo plano. Pero como tantas cosas de SSH, es un "avanzado". característica, y muchas personas (al parecer, de las otras respuestas aquí) desconocen su existencia.

En mi propio caso de uso, tengo una estación de trabajo en casa en la que quiero dejar un túnel que se conecta a un proxy HTTP en la red interna de mi oficina, y otro que me da acceso rápido a las interfaces de administración en co -localizados servidores. Así es como puede crear los túneles básicos, iniciados desde casa:

$ ssh -fNT -L8888:proxyhost:8888 -R22222:localhost:22 officefirewall
$ ssh -fNT -L4431:www1:443 -L4432:www2:443 colocatedserver

Esto hace que ssh se trasfiera, dejando los túneles abiertos. Pero si el túnel desaparece, estoy atascado, y si quiero encontrarlo, tengo que analizar mi lista de procesos y en casa tengo el "correcto". ssh (en caso de que accidentalmente haya lanzado varios que se parecen).

En cambio, si deseo administrar múltiples conexiones, utilizo la opción de configuración ControlMaster de SSH, junto con la opción de línea de comandos -O para el control. Por ejemplo, con lo siguiente en mi archivo ~ / .ssh / config ,

host officefirewall colocatedserver
    ControlMaster auto
    ControlPath ~/.ssh/cm_sockets/%r@%h:%p

los comandos ssh anteriores, cuando se ejecutan, dejarán spoor en ~ / .ssh / cm_sockets / que luego puede proporcionar acceso para el control, por ejemplo:

$ ssh -O check officefirewall
Master running (pid=23980)
$ ssh -O exit officefirewall
Exit request sent.
$ ssh -O check officefirewall
Control socket connect(/home/ghoti/.ssh/cm_socket/ghoti@192.0.2.5:22): No such file or directory

Y en este punto, el túnel (y el control de la sesión SSH) se ha ido, sin la necesidad de usar un martillo ( kill , killall , pkill , etc.).

Devolviendo esto a su caso de uso ...

Estás estableciendo el túnel a través del cual quieres que syngergyc hable con syngergys en el puerto TCP 12345. Para eso, haría algo como lo siguiente.

Agregue una entrada a su archivo ~ / .ssh / config :

Host otherHosttunnel
    HostName otherHost
    User otherUser
    LocalForward 12345 otherHost:12345
    RequestTTY no
    ExitOnForwardFailure yes
    ControlMaster auto
    ControlPath ~/.ssh/cm_sockets/%r@%h:%p

Tenga en cuenta que la opción de línea de comando -L se maneja con la palabra clave LocalForward , y las líneas Control {Master, Path} se incluyen para asegurarse de que tiene control después se establece el túnel.

Entonces, puede modificar su script bash a algo como esto:

#!/bin/bash

if ! ssh -f -N otherHosttunnel; then
    echo "ERROR: couldn't start tunnel." >&2
    exit 1
else
    synergyc localhost
    ssh -O exit otherHosttunnel
fi

La opción -f pone en segundo plano el túnel, dejando un zócalo en su ControlPath para cerrar el túnel más tarde. Si el ssh falla (lo que podría deberse a un error de red o ExitOnForwardFailure ), no es necesario salir del túnel, pero si no falló ( else ), synergyc se inicia y luego se cierra el túnel después de salir.

También es posible que desee ver si la opción SSH LocalCommand se puede usar para iniciar synergyc directamente desde su archivo de configuración ssh.

acabo de encontrar este hilo y quería mencionar el " pidof " utilidad de Linux:

$ pidof init
1

Puede usar lsof para mostrar el pid del proceso escuchando el puerto 12345 en localhost:

lsof -t -i @localhost:12345 -sTCP:listen

Ejemplos:

PID=$(lsof -t -i @localhost:12345 -sTCP:listen)
lsof -t -i @localhost:12345 -sTCP:listen >/dev/null && echo "Port in use"

Puede soltar el -f , lo que lo hace ejecutarlo en segundo plano, luego ejecutarlo con eval y forzarlo usted mismo al fondo.

Luego puede tomar el pid . Asegúrese de poner el & amp; dentro de la instrucción eval .

eval "ssh -N -L localhost:12345:otherHost:12345 otherUser@OtherHost & " 
tunnelpid=$!

Este es más un caso especial para synergyc (y la mayoría de los otros programas que intentan demonizarse). Usando $! funcionaría, excepto que synergyc hace una clys () syscall durante la ejecución que le dará un nuevo PID diferente al que bash pensó que tenía. Si quiere evitar esto para poder usar $ !, puede decirle a synergyc que permanezca en primer plano y luego en segundo plano.

synergyc -f -n mydesktop remoteip &
synergypid=$!

synergyc también hace algunas otras cosas, como el inicio automático, que es posible que desee desactivar si está tratando de administrarlo.

Otra opción es usar pgrep para encontrar el PID del proceso ssh más reciente

ssh -fNTL 8073:localhost:873 otherUser@OtherHost
tunnelPID=$(pgrep -n -x ssh)
synergyc localhost
kill -HUP $tunnelPID

Puede buscar el proceso ssh que está vinculado a su puerto local, utilizando esta línea:

netstat -tpln | grep 127\.0\.0\.1:12345 | awk '{print $7}' | sed 's#/.*##'

Devuelve el PID del proceso usando el puerto 12345 / TCP en localhost. Por lo tanto, no tiene que filtrar todos los resultados de ssh de ps .

Si solo necesita verificar, si ese puerto está vinculado, use:

netstat -tln | grep 127\.0\.0\.1:12345 >/dev/null 2>&1

Devuelve 1 si ninguno está vinculado o 0 si alguien está escuchando este puerto.

Basado en la muy buena respuesta de @ghoti, aquí hay un script más simple (para probar) que utiliza los zócalos de control SSH sin la necesidad de una configuración adicional:

#!/bin/bash
if ssh -fN -MS /tmp/mysocket -L localhost:12345:otherHost:12345 otherUser@otherHost; then
    synergyc localhost
    ssh -S /tmp/mysocket -O exit otherHost
fi

synergyc solo se iniciará si el túnel se ha establecido con éxito, que se cerrará tan pronto como synergyc regrese. Aunque la solución carece de informes de error adecuados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top