Título del catálogo
Aquí documenta la interacción libre
- Visión de conjunto
- Utilice la redirección de E / S para proporcionar la lista de comandos al programa interactivo
- Una alternativa a la entrada estándar
- Formato gramatical
命令 <<标记 #一般使用EOF
...
内容 #标记之间是传入内容
...
标记
Precauciones para el uso de este documento
- La marca puede utilizar cualquier carácter legal (normalmente EOF)
- La marca final debe escribirse en la cuadrícula superior sin ningún carácter al frente.
- No puede haber caracteres (incluidos los espacios) después de la etiqueta final
- Se omitirán los espacios antes y después de la etiqueta de apertura.
Aquí Documente el uso regular
- Manera sin interacción de realizar las estadísticas del número de filas
EOF
, poner el contenido awc -l
contar entre las etiquetas y pasar directamente el contenido a las estadísticas
wc -l <<EOF
>Line1
>Line2
>EOF
- Recibir una entrada de comando a través de leer e imprimir el valor de entrada son las dos
EOF
partes entre las marcas, como uni
valor variable
read i <<EOF
>hello #hello后面有自带的换行符有回车的功能所以$i只会获取第一行变量
>EOF
echo $i
- Establecer una contraseña para el usuario a través de passwd
passwd zhangsan <<EOF
>123456 #这两行是输入的密码和确认密码
>123456
>EOF
- Reemplazo de variables de soporte
Al escribir el archivo, la variable se reemplazará con el valor real y luego se combinará con el comando cat para completar la escritura
#!/bin/bash
file="EOF.txt"
i="substitution"
cat > $file <<EOF
Support variable $i
EOF
cat EOF.txt
- Copie todo a la variable y luego imprima el valor de la variable a través del comando echo
#!/bin/bash
var="Great! I am going to school!"
myvar=$(cat <<EOF
This is Line 1
Todey is Monday
$var
EOF
)
echo $myvar
- Desactive la función de reemplazo de variables y genere los caracteres como están, sin ninguna modificación o reemplazo
#!/bin/bash
var="Great! I am going to school!"
myvar=$(cat <<'EOF' #对标记加单引号或双引号,即可关闭变量替换
This is Line 1
Todey is Monday
$var
EOF
)
echo $myvar
- Eliminar el carácter TAB antes de cada línea
#!/bin/bash
var="Great! I am going to school!"
myvar=$(cat <<-EOF
This is Line 1 #在标记前加"-",即可压制各种行首TAB
Todey is Monday
$var
EOF
)
echo "$myvar"
- Comentarios de varias líneas El comentario
predeterminado de Bash es#
que este método de comentario solo admite comentarios de una sola línea: la introducción de Here Document resuelve el problema de los comentarios de varias líneas, que
:
representa un comando vacío que no hace nada. El contenido del área de la marca media no se ejecutará y bash lo ignorará, por lo que se puede lograr el efecto de los comentarios por lotes
#!/bin/bash
var="Great! I am going to school!"
: <<-EOF
This is Line 1 .
Today is Monday .
$var
EOF
echo "abcd"
Espere comandos básicos
Una herramienta construida sobre la base del lenguaje tcl, que a menudo se usa para control y pruebas automatizados, para resolver problemas interactivos en scripts de shell
rpm -q esperan
rpm -q tcl
yum install -y esperan
Intérprete de guiones
- El archivo se introduce por primera vez en la secuencia de comandos de espera para indicar qué shell se utiliza
#! / Usr / bin / espera
Aparecer
- Spawn suele ir seguido de un comando de ejecución de Linux, lo que significa abrir una sesión, iniciar un proceso y realizar un seguimiento de la información de interacción posterior.
Ejemplo: spawn passwd root
suponer
- Determine si el último resultado de salida contiene la cadena especificada, si la hay, regrese inmediatamente; de lo contrario, espere a que regrese el tiempo de espera; Solo puede capturar la salida del proceso iniciado por spawn;
Se usa para recibir la salida después de que se ejecuta el comando, y luego cumplir con las expectativas Correspondencia de cadenas
enviar
- Envíe una cadena de caracteres al proceso para simular la entrada del usuario; este comando no puede ingresar y avanzar de línea automáticamente . Generalmente, debe agregar \ r (retorno de carro) o \ n. Ejemplo:
方式一:
expect "密码" {send "abc123\r"} #同一行send部分要有{}
方式二:
expect "密码"
send "abc123\r" #换行send部分不需要有{}
方式三:
expect支持多个分支
expect #只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
{
"密码1" {send "abc123\r"}
"密码2" {send "123456\r"}
"密码3" {send "123123\r"}
}
Dos tipos de terminador
esperar eof
- Indica el final de la interacción, esperando a que finalice la ejecución y volviendo al usuario original, correspondiente al spawn. Por
ejemplo, cuando se cambia al usuario root, el script esperado espera 10 segundos de forma predeterminada. Cuando se ejecuta el comando, volverá automáticamente al usuario original después de que permanezca durante 10 segundos de forma predeterminada.
interactuar
- Una vez que se completa la ejecución, se mantiene el estado interactivo y el control se transfiere a la consola. Permanecerá en el terminal de destino en lugar de regresar al terminal original. En este momento, puede operarlo manualmente. El comando después de interactuar no funciona, como agregar la salida después de interactuar. No saldrá del usuario raíz. Si no hay interacción, se cerrará la sesión después de que se complete el inicio de sesión, en lugar de permanecer en el terminal remoto
- Si usa interact, permanecerá en la terminal en lugar de regresar a la terminal original. Por ejemplo, cuando cambia al usuario raíz, siempre estará en el estado de usuario raíz; por ejemplo, cuando ingresa a otro servidor, siempre estará en la terminal del servidor de destino en lugar de volver al servidor original.
Nota: expect eof
con interact
solo una segunda elección.
establecer el tiempo de espera establecer el tiempo de espera
- El período de tiempo de espera predeterminado es de 10 segundos. El período de tiempo de espera de la sesión se puede establecer mediante el comando set. Si el período de tiempo de espera no está limitado, debe establecerse en -1
例 :establecer tiempo de espera 30
exp_continue sigue coincidiendo
- exp_continue se agrega a un determinado elemento de juicio de expectativa, de modo que después de que el elemento se empareja, puede continuar coincidiendo con
otros elementos en la sentencia de juicio de espera . exp_continue es similar a la instrucción continue en la instrucción de control. Indica que se permite esperar para continuar ejecutando instrucciones hacia abajo - Por ejemplo: el siguiente ejemplo determinará si hay sí / no o * assword en la salida interactiva. Si coincide con sí / no, envíe sí
y ejecute el juicio nuevamente; si coincide con * contraseña, envíe abc123 y finalice la declaración de espera
expect {
"(yes/no)" {send "yes\r"; exp_continue;}
"*password" {set timeout 300; send "abc123\r";}
}
Nota: Al usar exp_continue, si rastrea comandos como passwd para finalizar el proceso después de ingresar la contraseña, no agregue esperar eof fuera de espera {}
porque después de que finalice el proceso de generación, enviará eof a esperar por defecto, lo que causará la posterior espera que se ejecute eof. Informar un error
send_user
- send_user significa comando echo, equivalente a echo
Recibir conjunto de parámetros
- El script de espera puede aceptar parámetros pasados desde la línea de comandos de bash y obtenerlos usando [lindex $ argv
n]. Entre ellos, n comienza en 0 y representa el primer, segundo, tercer ... parámetros respectivamente.
Ejemplo:
set hostname [lindex $argv 0] 相当于 hostname=$1
set password [lindex $argv 1] 相当于 password=$2
esperar ejecutar directamente
Necesita usar el comando de espera para ejecutar el script
su para cambiar de usuario
#!/usr/bin/expect
#设置超时时间
set timeout 5
- Los parámetros se pasan para
set username [lindex $argv 0]
obtener el primer parámetro posicional para
set password [lindex $argv 1]
obtener el segundo parámetro posicional - Iniciar el seguimiento del
spawn su $username
valor de la variable de llamada al comando - Sin ejecución interactiva. Después de capturar información y hacer coincidir
expect "密码"
su, habrá una cadena de contraseñas, y la cadena esperada será capturada
send "$password\r"
porque no hay función de retorno de carro, por lo que debe agregarla\r
o\n
expect "*]#"
aparecerá un símbolo del sistema después de iniciar sesión. así que complete las comillas *] #
send user "ok"
coincidencia El éxito es equivalente a hacer eco de una pantalla OK - Dale el control a la consola si
interact
#expect eof
quieres salir, usa espera eof para salir a través del temporizador establecido
Modo de ejecución integrado
Integre el proceso de espera en el Shell para facilitar la ejecución y el procesamiento
- Crear usuario y establecer contraseña
#!/bin/bash
user=$1
password=$2
- Los comandos no interactivos se colocan fuera de lo esperado
useradd $user
- Iniciar la ejecución de
/usr/bin/expect <<-EOF
esperar sin intercambio. La bandera de inicio inicia
spawn passwd $user
un comando passwd de seguimiento del proceso. Expect solo puede capturar la información del proceso.
expect "新的*"
send "$ {password}\r" .
expect "重新*"
send "$ {password} \r"
expect eof
EOF
Realice el inicio de sesión automático ssh
#! /usr/bin/ expect
set timeout 5
set hostname [l index $argv 0 ]
set password [l index $argv 1]
spawn ssh $hostname
expect {
Hay muchas posibilidades de
"Connection refused" exit
falla en la conexión. El servicio ssh de la otra parte puede estar cerrado (el contenido solicitado por diferentes versiones puede ser diferente, esto es centos7),
"Name or service not known" exit
no se puede encontrar el servidor y la dirección IP puede ingresarse incorrectamente (el contenido de el indicador puede ser diferente para diferentes versiones, esto es centos7)
" (yes/no)" {send "yes\r" ;exp_ continue}
Si coincide con el resultado de sí / no, elegirá sí para continuar la operación posterior. El
"password:" {send "$password\r"}
resto solo coincidirá con este resultado, luego ejecutará este contenido directamente. Llamar
interact
al comando después de $ contraseña interactuar no funciona.
exit
Crea particiones de disco sin interacción
- Prepare un nuevo disco
- Contenido de la secuencia de comandos
#!/bin/bash
read -p "输入需要创建的磁盘分区" a
/usr/bin/expect <<-EOF
spawn fdisk $a
expect "命令" {send "n\r"}
expect "Select" {send "\r"}
expect "分区" {send "\r"}
expect "起始" {send "\r"}
expect "Last" {send "\r"}
expect "命令(输入 m 获取帮助):" {send "w\r"}
expect eof
EOF
partprobe
mkfs.xfs $a -f &> /dev/null
if [ $? -eq 0 ]
then
echo -e "\033[31m 磁盘格式化完成 \033[0m"
mkdir $a.1
mount $a $a.1
df -h
else
echo "格式化失败,脚本有问题"
fi
- Instalar esperar
- Ejecutar script
sh
ochmod +x提权再./