Secuencia de comandos de shell desde la máquina local para ejecutar el comando en la máquina remota, luego continuar en la máquina local

10

El problema es este: quiero copiar archivos de una máquina remota.

Estoy buscando una manera de escribir un script de shell que se conecte a la máquina remota, obtenga la ubicación del archivo almacenado, una vez que la ubicación se desconecte del servidor remoto y use scp desde dentro de la máquina local con la ubicación obtenida para Copia el archivo.

Específicamente, quiero saber cómo, desde un script, me conectaría a una máquina remota, realizaría tareas en esa máquina. Desconecte y continúe la ejecución localmente.

gnsr
fuente

Respuestas:

15

Solución 1:

remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path

Esto funciona conectándose a la máquina remota, ejecutando algunos comandos y copiando la salida a una variable en su máquina local. Digamos, haciendo eco de la ruta del archivo de forma remota, capturando localmente.

Solución 2:

ssh user@host "determine_path; cat filename" >local_filename

Esto funciona al buscar y generar el archivo directamente desde el remoto, y redirigirlo a un archivo localmente. Esto omite scp. Esto requiere que los pasos anteriores a "cat" no tengan salida (que puede resolver con &> / dev / null).

Mark Griffin
fuente
1
+1 para mostrar cómo resolver todo el problema con una conexión, en lugar de separar ssh + scp.
Peter Cordes
Todas las respuestas son útiles pero éste direcciones mi problema más específicamente
gnsr
20

Puede escribir un script en el siguiente formato:

command1
command2
...
ssh user@machine command3
...
command4
command5

Debe configurar las claves SSH para que se command3ejecuten sin solicitar una contraseña.

Khaled
fuente
2
Cabe señalar que esto será sincrónico. Mientras se ssh user@remote command3está ejecutando, command4no se puede iniciar
aaaaa dice que reinstale a Mónica el
3
@aaaaaa a menos que lo hicierasssh user@machine command3 &
Isaac
3
@ Isaac sí, mi punto es que cualquiera puede ser un comportamiento deseable, pero debería ser una decisión consciente
aaaaa dice que reinstalar a Mónica el
2

Supongo que ya tiene alguna idea de cómo identificará el archivo que desea copiar y que puede, o ya ha escrito, un script o un conjunto de comandos que se ejecutarán en la máquina remota que realiza esta identificación .

Además, también supondré que esos comandos imprimen en la salida estándar la ruta completa al archivo, o la ruta relativa al archivo, en relación con el directorio de inicio del usuario SSH que se utiliza para la copia. En mi ejemplo, el nombre del script es "getfilepath.sh", aunque no tiene que ser un script de shell, podría ser algún otro ejecutable o incluso una serie de comandos.

# Script to be executed on local machine.

# put any leading local commands here.

FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .

# put any trailing local commands here.

En el código anterior, la notación "$ ()" es una forma de capturar la salida estándar de un comando como una variable de shell. Es bastante estándar, pero si está utilizando un shell que no lo entiende, puede rodear el comando con "tics de retroceso", que son las tildes a la izquierda de la tecla 1 en la mayoría de los teclados de EE. UU.

Jeremy Impson
fuente
0

tal vez sea posible activar una Tarea programada en la máquina remota que hace todo el trabajo.

Esto evitaría que se conecte a la máquina remota mientras busca la ubicación de los archivos que desea copiar.

Estoy haciendo esto:

comand line desencadena una tarea programada que ejecuta un script por lotes en mi caso.

schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"

Atentamente

Denyo
fuente