English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Detalles del método para implementar la automatización de Shell utilizando el comando expect

Fondo

En los scripts de Linux, hay muchos escenarios que involucran operaciones remotas, como el inicio de sesión remoto ssh, la copia remota scp y la transferencia de archivos sftp. Estas órdenes involucran la entrada de contraseñas de seguridad, y para usar las órdenes normalmente es necesario ingresar manualmente la contraseña y aceptar la verificación de seguridad. Para lograr operaciones remotas automatizadas, podemos aprovechar la funcionalidad de expect.

Expect es un lenguaje de programación gratuito, utilizado para realizar comunicación entre tareas automatizadas e interactivas sin intervención humana. Expect está en constante evolución, y a medida que pasa el tiempo, sus funciones se vuelven cada vez más potentes, convirtiéndose en un asistente poderoso para los administradores de sistemas. Expect requiere el soporte del lenguaje de programación Tcl, y para ejecutar expect en el sistema, primero debe instalar Tcl.

Instalación de expect

Expect se creó en base a Tcl, por lo que antes de instalar expect, debemos instalar Tcl.

(I) Instalación de Tcl

Página principal: http://www.tcl.tk

Dirección de descarga: http://www.tcl.tk/software/tcltk/downloadnow84.tml

1.descargar el paquete de código fuente

wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz 

2.descomprimir el paquete de código fuente

tar xfvz tcl8.4.11-src.tar.gz 

3.instalar configuración

cd tcl8.4.11/unix 
./configure --prefix=/usr/tcl --habilitar-shared 
make 
make install 

Atención:

1Después de que se complete la instalación, entra en el directorio raíz del código fuente de tcl, copia el archivo tclUnixPort.h en el subdirectorio unix al subdirectorio generic.

2No elimines el código fuente de tcl temporalmente, ya que el proceso de instalación de expect还需要使用。

(II) Instalación de expect (requiere biblioteca de Tcl)

Página principal: http://expect.nist.gov/

1.descargar el paquete de código fuente

wget http://sourceforge.net/proyectos/expect/archivos/Expect/5.45/expect5.45.tar.gz/download 

2.descomprimir el paquete de código fuente

tar xzvf expect5.45.tar.gz 

3.instalar configuración

cd expect5.45 
./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic 
make 
make install 
ln -s /usr/tcl/bin/expect /usr/expect/bin/expect 

expect

El núcleo de expect es spawn, expect, send, set.

spawn llama al comando que se debe ejecutar

  • expect espera la aparición de la información de提示命令,es decir, captura la提示 de entrada del usuario:
  • send envía el valor interactivo necesario, reemplazando el contenido de entrada manual del usuario
  • set establece el valor de la variable
  • Después de que interact ejecute, mantén el estado de interacción, transfórmate en controlador de consola, en este momento puedes operar manualmente. Si no hay esta frase, después de que el login se complete, se cerrará en lugar de permanecer en el terminal remoto.
  • Este expect eof debe agregarse, correspondiente a spawn para capturar la información de salida del terminal finalizada, similar a if....endif

El script de expect debe terminar con interact o expect eof, para tareas automatizadas generalmente suficiente es expect eof.

Otras configuraciones

  • Configuración de expect sin timeout infinito set timeout -1
  • Configuración de expect 300 segundos de timeout, si se excede300 No hay contenido de expect, salga set timeout 300

Sintaxis de expect

Expect utiliza la sintaxis de tcl

  • Un comando Tcl se compone de palabras separadas por espacios. La primera palabra es el nombre del comando y las restantes son parámetros del comando
    cmd arg arg arg
  • El símbolo $ representa el valor de una variable. En este caso, el nombre de la variable es foo.
    $foo
  • Los corchetes ejecutan un comando anidado. Por ejemplo, si deseas pasar el resultado de un comando como parámetro de otro comando, utiliza este símbolo
    [cmd arg]
  • Las comillas dobles marcan un grupo de palabras como un parámetro de un comando. El símbolo "$" y los corchetes se interpretan dentro de las comillas dobles
    "algunos elementos"
  • Las llaves también marcan un grupo de palabras como un parámetro de un comando. Sin embargo, otros símbolos no se interpretan dentro de las llaves
    {algunos elementos}
  • El símbolo de backslash se utiliza para referirse a símbolos especiales. Por ejemplo: n representa nueva línea. El símbolo de backslash también se utiliza para cerrar el significado especial de "$", comillas, corchetes y llaves

Ejemplo

login.exp se utiliza específicamente para el inicio de sesión remoto, modo de uso rápido: login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"

#!/usr/bin/expect -f
##########################################################
# Acceso SSH y ejecución de comandos
# Parámetros:1.Use_Type [comprobación/execute]
#  2.SSHServerIp
#  3.SSHUser
#  4.SSHPassword
#  5.CommandList [separados por ; entre varios comandos]
# Valor de retorno:
# 0 Éxito
#  1 Número incorrecto de parámetros
#  2 El servicio del servidor SSH no está abierto
#  3 Contraseña de usuario SSH incorrecta
#  4 Conexión SSH al servidor timeout
##########################################################
proc usage {} {
 regsub ".*/" $::argv0 "" nombre
 send_user "Uso:\n"
 send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n"
 exit 1
} 
## Verificar el número de argumentos
if {[llength $argv] != 5}
 usage
}
# Establecer valores de variables
set Use_Type [lindex $argv 0]
set SSHServerIp [lindex $argv 1]
set SSHUser [lindex $argv 2]
set SSHPassword [lindex $argv 3]
set CommandList [lindex $argv 4]
#spawn ping ${SSHServerIp} -w 5
#expect {
# -nocase -re "100% pérdida de paquetes" {
#  send_error "Ping ${SSHServerIp} no es accesible, Por favor verifique la dirección IP.\n"
#  exit 1
# }
#}
set timeout 360
set resssh 0
# Definir variable de marcador para confirmar si se ingresa yes durante la conexión ssh
set inputYes 0
set ok_string EXITO_DE_CONEXION
if {$Use_Type=="check"} {
 # Activar la conexión ssh, si es necesario ingresar yes para confirmar, ingrese yes, configure inputYes como1,de lo contrario ingrese la contraseña ssh
 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string"
} else {   
 spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList"
}
expect {
 -nocase -re "yes/no" {
  send -- "yes\n"
  set inputYes 1
 }
 -nocase -re "assword: " {
  send -- "${SSHPassword}\n"
  set resssh 1
 }
 #-nocase -re "Última conexión: " { 
 #  send -- "${CommandList}\n"
 #}
 $ok_string {}
 -nocase -re "Conexión denegada" {
  send_error "Los servicios SSH en ${SSHServerIp} no están activos.\n"
  exit 2
 }
 timeout {}}}
  send_error "Conexión al servidor SSH ${SSHUser}@${SSHServerIp} timeout(10s).\n"
  exit 4
 }
}
#Si se introduce yes para confirmar, introduzca la contraseña ssh
if {$inputYes==1}
 expect {
  -nocase -re "assword: " {
   send -- "${SSHPassword}\n"
   set resssh 1
  }
 }
}
#Si aparece el mensaje "try again" o "password:", significa que el usuario y la contraseña introducidos son incorrectos, salga directamente.
if {$resssh==1}
 expect {
  -nocase -re "try again" {
   send_error "SSH user:${SSHUser} passwd error.\n"
   exit 3
  }
  -nocase -re "assword:" {
   send_error "SSH user:${SSHUser} passwd error.\n"
   exit 3
  }
  eof {}
 }
}
send_error -- "$expect_out(buffer)"
#-nocase -re "No such user" {
#  send_error "No such user.\n"
#  exit 5
# }
#exit

Resumen

Este es el contenido completo del artículo. Espero que el contenido de este artículo tenga cierta valoración de referencia para su aprendizaje o trabajo. Si tienen alguna pregunta, pueden dejar comentarios para intercambiar. Gracias por su apoyo a Tutorial de Gritos.

Declaración: El contenido de este artículo se ha obtenido de la red, pertenece al propietario original, el contenido ha sido subido por usuarios de Internet de manera autónoma, este sitio web no posee los derechos de propiedad, no ha sido editado por humanos y no asume responsabilidad alguna por las responsabilidades legales. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w.3Aviso: El contenido de este artículo se ha obtenido de la red, pertenece al propietario original, el contenido ha sido subido por usuarios de Internet de manera autónoma, este sitio web no posee los derechos de propiedad, no ha sido editado por humanos y no asume responsabilidad alguna por las responsabilidades legales. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w proporcionando evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará