Programación de shell: interacción libre de documentos aquí y espere interacción

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 a wc -lcontar 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 EOFpartes entre las marcas, como un ivalor variable
read i <<EOF
>hello         #hello后面有自带的换行符有回车的功能所以$i只会获取第一行变量
>EOF
echo $i

Inserte la descripción de la imagen aquí

  • Establecer una contraseña para el usuario a través de passwd
passwd zhangsan <<EOF
>123456                    #这两行是输入的密码和确认密码
>123456
>EOF

Inserte la descripción de la imagen aquí

  • 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

Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí

  • 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

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

  • 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

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

  • 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"

Inserte la descripción de la imagen aquí

  • 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"

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

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 eofcon interactsolo 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 $usernamevalor 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 \ro \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 eofquieres 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 <<-EOFesperar sin intercambio. La bandera de inicio inicia
    spawn passwd $userun 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" exitfalla 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" exitno 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
    interactal 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
    shochmod +x提权再./

Supongo que te gusta

Origin blog.csdn.net/weixin_53496398/article/details/114885303
Recomendado
Clasificación