Programación de shell sin interacción (EOF, uso esperado)

Programación de shell sin interacción

Uno, aquí documento concepto de interacción libre

Utilice la redirección de E / S para proporcionar la lista de comandos a programas o comandos interactivos. Por ejemplo, los comandos ftp, cat o read
son un sustituto de la entrada estándar, lo que ayuda a los desarrolladores de scripts a no usar archivos temporales para construir información de entrada, sino a generar directamente un "archivo" y usarlo como entrada estándar para "comandos". Aquí Document también se puede utilizar con programas y comandos no interactivos.

1. Estructura

语法格式:
命令 <<标记  #标记这里不能有空格
...
内容    #标记直接是传入内容
...
标记         #标记这里不能有空格

Asuntos que necesitan atención :

La marca puede utilizar cualquier carácter legal (normalmente EOF). La
marca final debe escribirse en el
cuadro superior y no puede haber caracteres
antes de la marca final. No puede haber caracteres después de la marca final (incluidos los espacios) . Los espacios antes y después de la marca inicial se omitirá.

El EOF aquí es solo una marca que la primera indica el comienzo y la última indica el final. EOF se usa generalmente para indicar la marca

Pasa el contenido de la marca al archivo dd.txt, puedes ver que cuando lo vuelves a escribir, se sobrescribe todo el contenido original.
Inserte la descripción de la imagen aquí

2. Ejemplo de EOF:

1. Manera sin interacción de realizar las estadísticas del número de filas, poner el contenido a contar entre las etiquetas "EOF" y pasar directamente el contenido a wc -l para las estadísticas

wc -l <<EOF
>Line1
>Line2
>EOF

Inserte la descripción de la imagen aquí

2. Reciba la entrada e imprímala a través del comando de lectura. El valor de entrada es la parte entre las dos etiquetas EOF como el valor de la variable i

read i <<EOF
> good night     #将good night 赋值给i
> rain drop      #再赋值一个发现输出时只能显示一个
> EOF

Inserte la descripción de la imagen aquí

3. Establezca una contraseña para el usuario a través de passwd.

passwd list <<EOF
>123           
>123
EOF

Inserte la descripción de la imagen aquí

4. Apoyar la sustitución de variables

Al escribir el archivo, primero reemplazará la variable con el valor real y luego completará la escritura con el comando cat.


#!/bin/bash
file="ss.txt"
i="play"
cat > $file <<EOF
I want to $i
EOF

Inserte la descripción de la imagen aquí
Puede ver que el archivo ss.txt se crea y escribe automáticamente
Inserte la descripción de la imagen aquí

5. Asigne el valor a la variable como un todo, y luego imprima el valor de la variable a través del comando echo


#!/bin/bash
var="hello! I want to sleep"
myvar=$(cat <<EOF
6666
Today is a good day.
$var
EOF
)
echo $myvar

Resultado de la ejecución Puede
Inserte la descripción de la imagen aquí
ver que aquí no hay una línea en blanco, el
Inserte la descripción de la imagen aquí
resultado de la ejecución
Inserte la descripción de la imagen aquí

6. Desactive la función de reemplazo de variables y genere los caracteres como están, sin ninguna modificación o reemplazo.


#!/bin/bash
var="hello! I want to sleep"
myvar=$(cat <<'EOF'
6666
Today is a good day.
$var
EOF
)
echo "$myvar"

Inserte la descripción de la imagen aquí

7. Elimina el carácter TAB antes de cada línea.

Inserte la descripción de la imagen aquí


#!/bin/bash
var="hello! I want to sleep"
myvar=$(cat <<-'EOF'
	6666
	Today is a good day.
	$var
EOF
)
echo "$myvar"

Inserte la descripción de la imagen aquí

8. Comentarios de varias líneas

El comentario predeterminado de Bash es "#". 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.
":" 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="hello! I want to sleep"
: <<-'EOF'
        6666
        Today is a good day.
        $var
EOF

echo "$myvar"
echo "666"

Inserte la descripción de la imagen aquí

Dos, no esperes interacción

Suponer

  • Es una herramienta basada en el lenguaje tcl, a menudo se utiliza para el control y las pruebas automatizadas para resolver problemas interactivos en scripts de shell.

1. Instalación

rpm -q expect
rpm -q tcl
yum install -y expect

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

2. Comandos básicos

(1) Intérprete de guiones

  • El archivo se introduce por primera vez en el script de espera para indicar qué shell usar.

#!/usr/bin/expect

(2) engendro

  • El spawn suele ir seguido de un comando para abrir una sesión, iniciar un proceso y realizar un seguimiento de la información de interacción posterior.
例:spawn passwd root

(3) esperar

  • Juzgue si el último resultado de salida contiene la cadena especificada, si la hay, regrese inmediatamente; de ​​lo contrario, espere el período de tiempo de espera y regrese;
  • 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 hacer coincidir la cadena esperada

(4) 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 agrega \ r (retorno de carro) o \ n

例如:发送密码
方式一:
expect "密码" {
    
    send "123123\r"}		#同一行send部分要有{}
方式二:
expect "密码"	
send "123123\r"							#换行send部分不需要有{}
方式三:
expect					#只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
{
    
    
"密码1" {
    
    send "123123\r"}
"密码2" {
    
    send "123133\r"}
"密码3" {
    
    send "abc123\r"}
}

(5) El terminador espera e interactúa

esperar eof:

  • Indica el final de la interacción, esperando que termine la ejecución, volviendo al usuario original, correspondiente al spawn
  • Por ejemplo, si cambia al usuario root, la secuencia de comandos de espera espera 10 segundos de forma predeterminada. Después de ejecutar el comando, volverá automáticamente al usuario original después de permanecer 10 segundos de forma predeterminada.
expect eof

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, cerrará la sesión después de iniciar sesión, en lugar de permanecer en el terminal remoto.

  • El uso de interact permanecerá en la terminal y no volverá a la terminal original. Por ejemplo, si cambia al usuario raíz, siempre estará en el estado de usuario raíz; por ejemplo, cuando ingrese a otro servidor, siempre estará estar en la terminal del servidor de destino en lugar de volver al servidor original.

interact .

(6) conjunto

  • 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 configurar mediante el comando set. Si el período de tiempo de espera no está limitado, debe establecerse en -1.

(7) exp_continuar

  • 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.
  • Por ejemplo: el siguiente ejemplo determinará si hay sí / no o * contraseña 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";}
}

#注意:使用exp_continue时,如果跟踪像 passwd 这样的输入密码后就结束进程的命令,expect{}外不要再加上expect eof
#因为spawn进程结束后会向expect发送eof,会导致后面的 expect eof 执行报错

(8) enviar_usuario

  • Representa un comando echo, equivalente a echo
send_user

(9) Recibir 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.
例:
set hostname [lindex $argv 0]   	相当于 hostname=$1
set password [lindex $argv 1]		相当于 password=$2

Tres, use el ejemplo:

1.esperar

  • La ejecución no se puede ejecutar de la forma anterior, esperar se ejecuta directamente, necesita usar el comando de esperar para ejecutar el script

Ejemplo: cambiar de usuario sin su interactivo


#!/usr/bin/expect
#设置超时时间
set timeout 3
#设置输入用户和密码
set username [lindex $argv 0]
set password [lindex $argv 1]

spawn su $username
expect "密码" {
    
    send "$password\r"}
interact       #会停留在目标终端而不会退回到原终端
  #或者expect eof  当执行完命令后,默认停留10s后,自动切回了原用户

Inserte la descripción de la imagen aquí

Ejemplo: enlace interactivo gratuito ssh


#!/usr/bin/expect
set timeout 3      #超时时间为3秒,不设置得话 默认为10秒

set hostname [lindex $argv 0]
set password [lindex $argv 1]

spawn ssh $hostname

expect {
    
    

  "(yes/no)" {
    
    send "yes\r"; exp_continue }
  "*password:" {
    
    send "${password}\r"}
}

expect eof    #这里执行后跳回
#interact     这里是保持执行后得控制台位置,不跳回。

Inserte la descripción de la imagen aquí

2. Modo de ejecución integrado, integra el proceso de espera en Shell para facilitar la ejecución y el procesamiento.

Ejemplo: crear un usuario y establecer una contraseña

#!/bin/bash

usrname=$1
passwd=$2

useradd $usrname        #非交互得命令放在外面得脚本里

/usr/bin/expect <<EOF   #嵌入expect
  spawn passwd $usrname #开启spawn跟踪passwd命令
    #匹配字符,并且发送字符串
    expect "新的*" {
    
    send "${passwd}\r"}
    expect "重新*" {
    
    send "${passwd}\r"}
    expect eof  #结束符
EOF  

Inserte la descripción de la imagen aquí

! [

Después de las palabras clave de consulta awk, puede ver cuántos usuarios he creado.
Inserte la descripción de la imagen aquí

Ejemplo: inicio de sesión ssh interactivo integrado


#!/bin/bash

hostname=$1
password=$2

/usr/bin/expect<<EOF
spawn ssh $hostname 
  expect {
    
    
  "(yes/no)" {
    
    send "yes\r";exp_continue}
  "*password" {
    
    send "$password\r"}

}
expect "*]#" {
    
    send "ifconfig\r"}
expect eof

Inserte la descripción de la imagen aquí

Saltar automáticamente después de la ejecución
Inserte la descripción de la imagen aquí

Ejemplo: crear un disco sin interacción


#!/bin/bash
disk=$1

/usr/bin/expect<<EOF

spawn fdisk $disk
 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 $disk -f &> /dev/null
if [ $? -eq 0 ]
then
echo -e " 磁盘格式化完成 "
mkdir $disk.1
mount $disk $disk.1
df -h
else
echo "格式化shibai"
fi

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44324367/article/details/111714823
Recomendado
Clasificación