English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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
El script de expect debe terminar con interact o expect eof, para tareas automatizadas generalmente suficiente es expect eof.
Otras configuraciones
Sintaxis de expect
Expect utiliza la sintaxis de tcl
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.