Tengo un script que se parece al siguiente:
ssh host command1
scp file1 host:/tmp
ssh host command2
¿Hay alguna manera de combinarlos todos en una sola ssh/scp
llamada? El problema que tengo es combinar la copia de archivos con la ejecución de comandos, lo cual debe hacerse de forma intercalada. Esperaba algo como:
ssh_sometool host -c command1 -cp file1 /tmp -c command2
No se trata de la sintaxis (podría escribir una función como esa), se trata de que todo suceda dentro de la misma ssh
sesión.
Respuesta1
En primer lugar, no existe una forma sencilla o estándar de hacer lo que desea. Además, déjame aclarar:no hay manera de hacer lo que quieres con un cliente ssh predeterminado.
Hay un tenedor extremadamente viejo.ssh-xfer. Tenga en cuenta que incluso los desarrolladores de esta herramienta enfatizan que su solución es "pirateada" y muy antigua, por lo que no debería usarla. La última versión de SSH que fue parcheada para poder usarse con esta herramienta es OpenSSH-3.8.1p1
(en Arch Linux, la versión actual es OpenSSH_7.6p1
).
Si es importante para usted mantener las cosas rápidas y minimizar la cantidad de conexiones/apretones de manos realizados entre hosts, puede buscar algún tipo de herramientas de aprovisionamiento/orquestación.ansibleparece ser la forma más fácil de realizar la tarea sin mucha configuración adicional mientrasSalpodría ser el más rápido.
De todos modos, tanto Ansible como Salt utilizan conexiones adicionales para que las cosas funcionen y no estoy seguro de que ganarías algo en cuanto a rendimiento usándolas en lugar de la combinación ssh/scp.
ACTUALIZACIÓN: Si tiene que enviar y extraer muchos archivos con algunos scripts adicionales ejecutándose entre estas transferencias, casi cualquier herramienta de aprovisionamiento (Chef, Puppet, Salt, Ansible) hará el trabajo más rápido que ssh/scp simple.
Respuesta2
SSH permite tener una sesión activa durante un tiempo después de desconectarse, por lo que no es necesario iniciar la conexión la próxima vez. Estas son las opciones de configuración ssh para habilitarlo:
Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 30
ControlMaster
permite compartir múltiples sesiones a través de una única conexión de red. Cuando se establece en auto
, cada nuevo intento comprueba si existe la conexión respectiva y la utiliza o crea una nueva conexión.
ControlPath
especifica la ruta donde se almacenan las conexiones.¡Asegúrate de que este camino exista!Es decir, cree el directorio (enchufesaquí, pero asígnele el nombre que desee) manualmente.
ControlPersist
Especifica cuánto tiempo dura la conexión después de desconectarse. Acepta el tiempo en segundos.
Para obtener más aclaraciones sobre las opciones, utilice man ssh_config
.
Después de agregarlos a su archivo ~/.ssh/config
, solo se abrirá una sesión para estos tres comandos.
En mi computadora, ofrece una aceleración 5 veces mayor: 100 conexiones seguidas a algún host (cercano) funcionan en 30 segundos sin sesiones persistentes y solo entre 5 y 6 segundos con ellas.
PD: A veces (por ejemplo, si cambió la red) sus conexiones ssh existentes se interrumpen y las nuevas no se establecen porque el archivo con la conexión sí existe. En este caso, simplemente acceda ~/.ssh/sockets
y elimine el archivo necesario manualmente.
Respuesta3
Puedes unir y pasar todos tus archivos a través de la entrada estándar ssh y recibirlos en tu sesión remota, me refiero a algo como esto:
tar -cf - file1 file2 | ssh host 'TDIR=`mktemp -d`; tar -xf - -C "$TDIR"; cat "$TDIR/file1"; command1; command2 ...'
- El
cat "$TDIR/file1"
comando es sólo un ejemplo de cómo acceder a los archivos recibidos; - Utilice tar con el modificador -j o -J tanto en el lado local como en el remoto para pasar sus archivos comprimidos;
- Puede poner todos sus comandos en un script bash, incluirlo en su archivo y ejecutarlo en el lado remoto como
...tar -xf - -C "$TDIR"; bash "$TDIR/script.sh"'
Respuesta4
En su script, una vez que se ejecuta la primera línea...
ssh host command1
La ejecución se transfiere a ssh + su segundo comando (scp) solo se ejecutará cuando finalice el comando1. Una forma de ejecutarlos en paralelo es poner en segundo plano cada tarea, como esta...
ssh host command1 &
scp file1 host:/tmp &
ssh host command2 &
Ahora las tres tareas se ejecutan en segundo plano, al mismo tiempo.