Shell Here Document Comandos interactivos gratuitos y espere

One, Here Document comandos interactivos gratuitos

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

语法格式:
命令 <<标记
...
内容    #标记直接是传入内容
...
标记

Precauciones:
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á.

1.免交互方式实现对行数的统计,将要统计的内容置于标记“EOF”之间,直接将内容传给wc -l 来统计
wc -l <<EOF
>Line1
>Line2
>EOF

Inserte la descripción de la imagen aquí

通过read 命令接收输入并打印,输入值是两个EOF标记之间的部分,作为变量i的值

read i <<EOF
>Hi
>EOF
echo $i

Inserte la descripción de la imagen aquí

通过passwd给用户设置密码

passwd zhangsan <<EOF
>35123512            
>35123512
EOF

Inserte la descripción de la imagen aquí

支持变量替换
在写入文件时会先将变量替换成实际值,再结合cat 命令完成写入

#!/bin/bash
file="eof1.txt"
i="school"
cat > $file <<EOF
I am going to $i
EOF

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

整体赋值给变量,然后通过echo命令将变量值打印出来

#!/bin/bash
var="Great! I am going to school!"
myvar=$(cat <<EOF
This is Line 1.
Today is Monday.
$var
EOF
)
echo $myvar

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

关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换

#!/bin/bash
var="Great! I am going to school!"
myvar=$(cat <<'EOF'
This is Line 1.
Today is Monday.
$var
EOF
)

echo $myvar

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

去掉每行之前的TAB字符

#!/bin/bash
var="Great! I am going to school!"
myvar=$(cat <<-'EOF'        #在标记前加“-”,即可抑制各行tab字符
       This is Line 1.
       Today is Monay.
       $var
EOF
)
echo "$myvar"

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

多行注释
Bash 的默认注释是“#”,该注释方法只支持单行注释:Here Document 的引入解决了多行注释的问题。
":"代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash忽略掉,因此可达到批量注释的效果。

#!/bin/bash
var="Great! I am going to school!"
: <<-EOF      
			This is Line1.
		Today is Monday.
	$var
EOF
echo "abcd"

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

Dos, esperar

Una herramienta construida sobre la base del lenguaje tcl se usa a menudo para el control y las pruebas automatizadas para resolver problemas interactivos en scripts de shell.

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

1. Comandos básicos

1. El intérprete de
la secuencia de comandos espera que la secuencia de comandos introduzca el archivo primero, indicando qué shell se utiliza

#!/usr/bin/expect

2.
spawn 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.

例:
spawn passwd root

3.expect
juzga si el último resultado de entrada contiene la cadena especificada, si la hay, regresa inmediatamente; de ​​lo contrario, espera a que regrese el período de tiempo de espera: solo se puede capturar la salida del proceso iniciado por spawn; se
usa para recibir el salida después de que se ejecuta el comando, luego coincide con la cadena esperada

4.send
envía una cadena de caracteres al proceso para simular la entrada del usuario; este comando no puede ingresar y ajustar automáticamente. Generalmente agregue \ r (retorno de carro) o \ n

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

5. El carácter de final
espera eof
indica el final de la interacción, espera a que finalice la ejecución y regresa al usuario original. Correspondiente al spawn,
como cambiar al usuario root, el script de espera espera 10 segundos por defecto. Cuando se ejecuta el comando, el valor predeterminado permanece durante 10 segundos y vuelve a cambiar automáticamente El usuario original

Después de que interactúa se
ejecuta, el estado interactivo se mantiene y el control se transfiere a la consola. Se quedará en el terminal de destino. En este momento, se puede operar manualmente. Los comandos después de interactuar no funcionan. Por ejemplo, interactuar permanecerá en la terminal en lugar de volver al original. La terminal, como cambiar al usuario raíz, siempre estará en el estado de usuario raíz; por ejemplo, cuando se envía a otro servidor, siempre estará en la terminal del servidor de destino en lugar de volver al servidor original.

6. El
tiempo de espera predeterminado de la espera establecida es de 10 segundos. El tiempo de espera de la sesión se puede configurar mediante el comando set. Si el tiempo de espera no está limitado, debe establecerse en -1.

例:set timeout 30

7.exp_continue
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 declaración de juicio de espera. exp_continue es similar a la instrucción continue en la instrucción de control. Indica que la expectativa continúa ejecutando instrucciones hacia abajo.

El siguiente ejemplo determinará si hay sí / no o * contraseña en la salida interactiva. Si coincide con yes / no, emita yes y ejecute el juicio nuevamente; si coincide con * assword, genere abc123 y finalice la declaración de espera.

expect
"(yes/no)" {
    
    send "yes\r"; exp_ continue; }
"*password" {
    
    set timeout 300; send "abc123\r";}

Nota: Cuando use exp_ continue, si sigue un comando como passwd que finaliza 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, eof se enviará a esperar de manera predeterminada. lo que dará lugar al error de ejecución esperado más tarde

8. send_ user
send_ user representa el comando echo, que es equivalente a echo

9. Recibir parámetros El
script de espera puede aceptar parámetros pasados ​​desde la línea de comandos de bash y usar [lindex $ argv n] para obtenerlos. 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

2. Ejemplo

expect直接执行,需要使用expect 命令去执行脚本
su切换用户
#! /usr/bin/expect
#设置超时时间
set timeout 5
#参数传入
set username [lindex $argv 0]
set password
[lindex $argv 1]
#开始追踪命令
spawn su $username
#免交互执行,捕捉信息并匹配
expect "密码"
send "password\r"
expect "*]#"
send user "ok" .
#把控制权交给控制台
interact
#expect eof

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

3. Modo de ejecución integrado

Crear usuario y establecer contraseña

#! /bin/bash
user=$1
password=$2
#非交互命令放在expect外面
useradd $user
#开始免交换执行
/usr/bin/expect <<-EOF
#expect开始标志
spawn passwd $user
#开启-一个进程跟踪passwd命令,expect只能捕捉该进程信息
expect "新的*"
send "$ {password}\r" .
expect "重新*"
send "$ {password} \r"
expect eof
EOF

4. Realice el inicio de sesión automático ssh

#! /usr/bin/expect
set timeout 5
set hostname [lindex $argv 0 ]
set password [lindex $argv 1]

spawn ssh $hostname
expect {
    
    
	"Connection refused" exit           #连接失败情况,比如对方ssh服务关闭
	"Name or service not known" exit    #找不到服务器,比如输入的IP地址不正确
	" (yes/no)" {
    
    send "yes\r" ;exp_continue}
	"password:" {
    
    send "$password\r"}
interact
exit            #interact后的命令不起作用

Incrustado:

#!/bin/bash
hostname=$1
password=$2


/usr/bin/expect <<EOF
spawn ssh root@${
    
    hostname}

expect {
    
    
       "Connection refused" exit
       "No route to host" exit
       "(yes/no)" {
    
    send "yes\r";exp_continue}
       "password" {
    
    send "$password\r"}
}
expect "*]#"
send "ifconfig\r"
expect eof
EOF

5. Crea un disco sin interacción

#!/bin/bash
disk=$1
/usr/bin/expect <<EOF
spawn fdisk $disk
expect "命令" {
    
    send "n\r"}
expect "Select" {
    
    send "p\r"}
expect "分区" {
    
    send "\r"}
expect "起始" {
    
    send "\r"}
expect "Last" {
    
    send "\r"}
expect "命令" {
    
    send "w\r"}
expect  eof
EOF

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

Supongo que te gusta

Origin blog.csdn.net/IHBOS/article/details/114973763
Recomendado
Clasificación