Necesito escribir un script que se ejecute en una PC con Centos 7 y se conecte a otra PC con Centos 7 usando ssh, ejecute un comando de consola, por ejemplo «ls -la» y guarde el resultado del mismo en un archivo para poder analizarlo más tarde.
He escrito el siguiente script EXPECT:
ssh_connection.exp:
#!/usr/bin/expect -f set timeout 120 spawn ssh [email protected] expect "assword:" send "PASSWORD\r" expect "prompt#" sleep 5 puts "Executing ls -la" send "ls -la\r" sleep 10 puts "Executing ps -af" puts "ps -af\r" sleep 10 puts "Closing the ssh session\r" send "exit\r"
Este script se conecta correctamente a través de ssh a la máquina con IP = 129.0.0.10 y muestra en pantalla los mensajes que aparece en «put»: Ejecutando ls -la Ejecutando ps -af Cerrando la sesión ssh
Sin embargo, no muestra el resultado de ejecutar los comandos que envío con send:
ls -la ps -af
¿Qué le pasa a este script?
¿Cómo puedo hacer que la salida de los comandos anteriores se guarde en un archivo para poder analizarla luego con un bash script o un programa en C?
Comentarios
Responder
No es necesario utilizar expect
para hacer esto. El ssh
puede tomar argumentos adicionales de los comandos que desea ejecutar a través de la conexión SSH.
Paso # 1
Configure un par de claves SSH (busque en Google) y luego copie SSH al servidor remoto. Para hacer esto, recomiendo usar ssh-copy-id
. Vea mi respuesta a este U & LQ & A titulado: Cómo copiar correctamente claves privadas de servidores remotos a mi máquina local para poder conectarme usando ssh .
Paso # 2
Ahora con la capacidad de SSH a un servidor en su lugar usando una clave , su problema anterior se convierte en esto:
$ ssh [email protected] "ls -la; ps -af"
Puede ponerse elegante y usar aquí documentos (heredocs . here-docs) para mejorar aún más esta técnica.
$ ssh [email protected] <<EOF > ls -la > ps -af > EOF
o poner los comandos en un archivo y pasarlos a ssh
:
$ ssh [email protected] < my.cmds
Comentarios
- Por qué mi pregunta aquí unix.stackexchange.com/questions/458801/… ¿se marcó como duplicado? Creo que ' es diferente ya que quiero que me asciendan para ingresar el nombre de usuario, no solo la contraseña.
Responder
Gracias,
He modificado mi script reemplazando la línea:
spawn ssh [email protected]
con este otro, como me dices:
spawn ssh [email protected] «ls -la; ps -af»
Ahora veo la salida de comandos en la pantalla y puedo redirigir a un archivo.
A continuación, intenté adaptar este script para ejecutar un comando en otra máquina que es un conmutador tipo Cisco (no es Cisco, pero es compatible).
El script con el que me conecto al switch usando ssh es:
** #! / usr / bin / esperan -f
set timeout 120
spawn ssh [email protected] «mostrar vlan 500»
esperar «assword:»
enviar «PASSWORD \ r»
esperar «prompt # «
sleep 5
pone» Cerrando la sesión ssh \ r «
enviar» exit \ r «**
Esto no funciona en el conmutador y aparece este error:
spawn ssh [email protected] show vlan 501
[email protected] «s contraseña:
imish: opción inválida -» c «
Pruebe` imish –help «para obtener más información.
send: spawn id exp6 not open
while executing
«send» exit \ r «»
(file "./ssh_script_v3.exp" line 7)
Así que debo usar el script de espera que envía el comando usando «enviar»:
! / usr / bin / esperan
generar ssh [email protected]
esperar «assword:»
enviar «usuario \ r»
esperar «>»
dormir 5
enviar «sh vlan 500 \ r»
dormir 5
enviar «salir \ r»
Ahora no obtengo ningún error, pero no se muestra nada en la pantalla.
He leído que esto sucede porque los sistemas Linux y UNIX almacenan automáticamente su salida cuando se ejecutan de forma no interactiva. Creo que Expect puede hacer que los programas piensen que se están ejecutando de forma interactiva mediante «unbuffer», pero no sé cómo usar «unbuffer» con «send». Mis intentos de hacer esto, no funcionan.
spawn ssh [email protected] ls -la>Ls
?expect -d ssh_connection.exp
y vea dónde están los problemas. Lo primero que recomiendo ' d es reemplazar todos los durmientes conexpect "prompt#"