Ejecución remota de comandos SSH dos o tres cosas
http: // wsfdl.com/linux/2017/07/24/SSH ejecución remota de comandos dos o tres cosas.html
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" ......