A veces, usar ssh para ejecutar comandos en una máquina remota localmente puede manejar fácilmente algunas tareas repetitivas. Esperamos lograr:

  • Sin entrada de contraseña manual
  • Soporte para ejecutar múltiples comandos y ejecutar scripts de shell
  • Soporte para ejecutar comandos sudo

Sin entrada de contraseña manual

Podemos usar herramientas como ssh mutual trust, sshpass y esperamos evitar ingresar manualmente la contraseña. El proceso de uso puede encontrar los siguientes escenarios engorrosos que requieren la entrada manual de sí:

$ ssh username@hostname
The authenticity of host ... can't be established.
ECDSA key fingerprint is ...
Are you sure you want to continue connecting (yes/no)?

Para evitar el escenario anterior, agregue los siguientes parámetros al comando ssh:

$ ssh -o "StrictHostKeyChecking no" username@password

SSH confianza mutua

La configuración de la confianza mutua SSH es muy simple, primero genere la clave ssh:

$ ssh-keygen

Copie la clave pública a la parte de confianza:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub username@hostname

Luego ejecute el comando sin contraseña:

$ ssh -o "StrictHostKeyChecking no" username@password cmd

sshpass

sshpass  es una herramienta de verificación de contraseña ssh no interactiva, instalada antes de su uso:

$ yum install sshpass

Use de la siguiente manera:

$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@hostname cmd

esperar

Expect  es una herramienta de software utilizada para control y pruebas automatizados. Aunque el costo de aprendizaje es alto, esperar es poderoso, y el uso de esperar puede ejecutar fácilmente comandos remotos. Instalar antes de usar:

$ yum install expect

Por ejemplo:

#!/usr/bin/expect

spawn ssh -o "StrictHostKeyChecking no" username@hostname
expect "*assword*"
send "password\n" expect "*$*" send "command\n" expect "*$*" send "exit\n" expect eof 

Expect no solo es compatible con ssh, sino que también es compatible con scp, ftp y otras herramientas.

Admite múltiples comandos y scripts

Ejecuta múltiples comandos

sshpass y expect son muy similares para soportar múltiples comandos, solo use && para conectar los comandos:

# ssh trust
$ ssh -o "StrictHostKeyChecking no" username@password "cmd1 && cmd2" 

Por ejemplo:

# sshpass
$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password "ls -a && mkdir test" # expect ...... expect "*$*" send "ls -a && mkdir test\n" ...... 

Ejecutar script local

Para ejecutar scripts locales, ssh y sshpass se usan de manera similar.

# ssh trust
$ ssh -o "StrictHostKeyChecking no" username@password bash -s < shell_script.sh # sshpass $ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password bash -s < shell_script.sh 

Para esperar, primero necesita copiar el script en el host remoto y luego ejecutar el script en el host remoto, los pasos son los siguientes:

...
# Copy script to remote host
spawn scp -o "StrictHostKeyChecking no" shell_script.sh username@hostname:~/
expect "*assword*"
send "password\n" expect "*100%*" expect eof # Execute the shell script at remote host spawn ssh -o "StrictHostKeyChecking no" username@hostname expect "*assword*" send "password\n" expect "*$*" send "sh shell_script.sh\n" ...... 

Soporte para ejecutar el comando sudo

Algunos comandos requieren permiso sudo para ejecutarse, pero no queremos ingresar la contraseña repetidamente, podemos modificar cada comando de la siguiente manera:

cmd ---> 'echo password | sudo -S cmd'

Por ejemplo:

$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password "echo password | sudo -S mkdir /newdir" 

Para algunos comandos como echo y dd, a veces aparecen los siguientes escenarios de falla:

$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password 'echo password | sudo -S echo hello > /newdir/newfile' bash: /newdir/newfile: 权限不够 

La solución es la siguiente:

cmd ---> 'echo password | sudo -S sh -c "cmd"'

# For example
$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password 'echo WSfdl097018= | sudo -S sh -c "echo hello > /newdir/newfile"' 

Si espera, debe copiar el script en el host remoto y luego usar sudo para ejecutar el script en el host remoto, que es más fácil y más robusto que sshpass:

...
# Copy script to remote host
spawn scp -o "StrictHostKeyChecking no" shell_script.sh username@hostname:~/
expect "*assword*"
send "password\n" expect "*100%*" expect eof # Execute the shell script at remote host spawn ssh -o "StrictHostKeyChecking no" username@hostname expect "*assword*" send "password\n" expect "*$*" send "sudo sh shell_script.sh\n" expect "*assword*" send "password\n" ......