Esta es una pregunta complementaria a ¿Cómo se usa ssh en un script de shell? pregunta. Si quiero ejecutar un comando en la máquina remota que se ejecuta en segundo plano en esa máquina, ¿cómo consigo que regrese el comando ssh? Cuando trato de incluir el ampersand (&) al final del comando, simplemente se cuelga. La forma exacta del comando se ve así:
ssh user@target "cd /some/directory; program-to-execute &"
¿Algunas ideas? Una cosa a tener en cuenta es que los inicios de sesión en la máquina de destino siempre producen un banner de texto y tengo claves SSH configuradas, por lo que no se requiere contraseña.
/dev/null
.< /dev/null
significa? Gracias.Esta ha sido la forma más limpia de hacerlo por mí:
Lo único que se ejecuta después de esto es el comando real en la máquina remota
fuente
-n
no es necesario como-f
implica-n
ssh -f
deja el proceso ssh conectado, solo en segundo plano. Las soluciones / dev / null permiten que ssh se desconecte rápidamente, lo que podría ser preferible.Redirigir fd's
La salida debe ser redirigida con lo
&>/dev/null
que redirige stderr y stdout a / dev / null y es sinónimo de>/dev/null 2>/dev/null
o>/dev/null 2>&1
.Paréntesis
La mejor manera es usar
sh -c '( ( command ) & )'
donde el comando sea cualquier cosa.Nohup Shell
También puede usar nohup directamente para iniciar el shell:
Buen lanzamiento
Otro truco es usar nice para iniciar el comando / shell:
fuente
nohup
, y por qué y cuándo usaríanice
? Creo que eso agregaría mucho a esta respuesta.Si no puede / no puede mantener la conexión abierta, puede usar la pantalla , si tiene los derechos para instalarla.
Para separar la sesión de pantalla: ctrl-a d
Para enumerar sesiones de pantalla:
Para volver a adjuntar una sesión:
Tenga en cuenta que la pantalla también puede crear múltiples shells dentro de cada sesión. Se puede lograr un efecto similar con tmux .
Para separar la sesión de tmux: ctrl-b d
Para enumerar sesiones de pantalla:
Para volver a adjuntar una sesión:
La clave de control predeterminada de tmux, ' ctrl-b', es algo difícil de usar, pero hay varios ejemplos de configuraciones de tmux que se envían con tmux que puede probar.
fuente
screen
para esto?Solo quería mostrar un ejemplo de trabajo que puede cortar y pegar:
fuente
La forma más rápida y fácil es usar el comando 'at':
fuente
at
aceptan argumentos de línea de comandos después del tiempo y no solo de un archivo.Creo que tendrá que combinar un par de estas respuestas para obtener lo que desea. Si usa nohup junto con el punto y coma, y envuelve todo entre comillas, obtendrá:
lo que parece funcionar para mí Con nohup, no necesita agregar el & al comando para ejecutarse. Además, si no necesita leer ninguno de los resultados del comando, puede usar
para redirigir toda la salida a / dev / null.
fuente
Esto funcionó para mí muchas veces:
fuente
Puedes hacerlo así ...
fuente
En realidad, cada vez que necesito ejecutar un comando en una máquina remota que es complicado, me gusta poner el comando en un script en la máquina de destino, y simplemente ejecutar ese script usando ssh.
Por ejemplo:
Y luego ejecuto este comando en la máquina de origen:
fuente
Intentaba hacer lo mismo, pero con la complejidad añadida que intentaba hacerlo desde Java. Entonces, en una máquina que ejecutaba Java, estaba tratando de ejecutar un script en otra máquina, en segundo plano (con nohup).
Desde la línea de comandos, esto es lo que funcionó: (es posible que no necesite el "-i keyFile" si no lo necesita para enviar ssh al host)
Tenga en cuenta que para mi línea de comando, hay un argumento después de "-c", que está todo entre comillas. Pero para que funcione en el otro extremo, todavía necesita las comillas, así que tuve que ponerle comillas escapadas.
De java, esto es lo que funcionó:
Tomó un poco de prueba y error para que esto funcionara, pero parece funcionar bien ahora.
fuente
Me pareció bastante conveniente tener una sesión tmux remota usando la
tmux new -d <shell cmd>
sintaxis como esta:Esto lanzará una nueva sesión en el
elsewhere
host y el comando ssh en la máquina local volverá al shell casi instantáneamente. Luego puede enviar ssh al host remoto ytmux attach
a esa sesión. Tenga en cuenta que no hay nada acerca de la ejecución local de tmux, ¡solo remota!Además, si desea que su sesión persista después de finalizar el trabajo, simplemente agregue un iniciador de shell después de su comando, pero no olvide incluir comillas:
fuente
Esto debería ejecutar el comando y asignar una identificación de proceso que puede simplemente seguir -f YOUR-LOG.log para ver los resultados escritos a medida que ocurren. puede cerrar sesión en cualquier momento y el proceso continuará
fuente
Puedes hacer esto sin nohup:
fuente
Creo que esto es lo que necesita: al principio, debe instalarlo
sshpass
en su máquina. entonces puedes escribir tu propio script:fuente
Primero siga este procedimiento:
Inicie sesión en A como usuario ay genere un par de claves de autenticación. No ingrese una frase de contraseña:
Ahora use ssh para crear un directorio ~ / .ssh como usuario b en B. (El directorio ya puede existir, lo cual está bien):
Finalmente, agregue la nueva clave pública de a a b @ B: .ssh / Authorized_keys e ingrese la contraseña de b por última vez:
A partir de ahora puede iniciar sesión en B como b desde A como a sin contraseña:
entonces esto funcionará sin ingresar una contraseña
ssh b @ B "directorio cd / some /; programa para ejecutar &"
fuente