1.expect简介

expect是一种脚本语言,它能够代替人工实现与终端的交互,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

安装命令: yum install expect ;

2.expect使用场景

(1)并根据预定标准回答其问题,回答“是”、“否”或将控制权交还给您

(2)远程连接设备并执行自动化操作

(3)主要是一些需要人机交互的地方,如果提前知道应该输入什么指令都可以使用expect 工具

3.expect使用原理

(1).原理介绍:

spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出

(2).spawn命令:

spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的、

(3).send命令:

send命令接收一个字符串参数,并将该参数发送到进程,这个过程类似模拟人类输入密码

(4).interact命令:

结合spawn、expect、send自动化的完成很多任务,interact命令可以在适当的时候进行任务的干预,比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令。

4.expect使用语法

(1)expect 启用选项:

1) -c 执行脚本前先执行的命令,可多次使用

2) -d debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。

3) -D 启用交换调式器,可设一整数参数。

4) -f 从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。

5) -i 交互式输入命令,使用"exit"或"EOF"退出输入状态

6) -- 标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --

7) -v 显示expect版本信息

(2)expect命令参数:

1) spawn 交互程序开始,执行后面的命令或程序。需要进入到expect环境才可以执行,不能直接在shell环境下直接执行

2) set timeout n 设置超时时间,表示该脚本代码需在n秒钟内完成,如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住。如果设置为-1表示不会超时

3) set 定义变量

4) $argv expect脚本可以接受bash的外部传参,可以使用[ lindex $argv n ]n为0表示第一个传参,为1表示第二个传参,以此类推

5) expect 从交互程序进程中指定接收信息, 如果匹配成功, 就执行send的指令交互;否则等待timeout秒后自动退出expect语句

6) send 如果匹配到expect接受到的信息,就将send中的指令交互传递,执行交互动作。结尾处加上\r表示如果出现异常等待的状态可以进行核查

7) exp_continue 表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。

8) exit 退出expect脚本

9) expect eof spawn进程结束后会向expect发送eof,接收到eof代表该进程结束

10) interact 执行完代码后保持交互状态,将控制权交给用户。没有该命令执行完后自动退出而不是留在远程终端上

11) puts 输出变量

5.expect常用命令总结

spawn                  交互程序开始后面跟命令或者指定程序

expect                  获取匹配信息匹配成功则执行expect后面的程序动作

send exp_send       用于发送指定的字符串信息

exp_continue          在expect中多次匹配就需要用到

send_user            用来打印输出 相当于shell中的echo

exit                       退出expect脚本

eof                        expect执行结束 退出

set                        定义变量

puts                      输出变量

set timeout           设置超时时间
interact      允许用户交互

6.expect示例:

(1)ssh登录远程主机执行命令,执行方法 expect 1.sh 或者 ./1.sh

# vim 1.sh

#!/usr/bin/expect

spawn ssh saneri@192.168.56.103 df -Th

expect "*password"

send "123456\n"

expect eof

(2)ssh远程登录主机执行命令,在shell脚本中执行expect命令,执行方法sh 2.sh、bash 2.sh 或./2.sh都可以执行.

#!/bin/bash

passwd='123456'

/usr/bin/expect <<-EOF

set time 30

spawn ssh saneri@192.168.56.103 df -Th

expect {

"*yes/no" { send "yes\r"; exp_continue }

"*password:" { send "$passwd\r" }

}

expect eof

EOF

(3)expect执行多条命令

#!/usr/bin/expect -f

set timeout 10

spawn sudo su - root

expect "*password*"

send "123456\r"

expect "#*"

send "ls\r"

expect "#*"

send "df -Th\r"

send "exit\r"

expect eof

(4)创建ssh key,将id_rsa和id_rsa.pub文件分发到各台主机上面。

1).创建主机配置文件

[root@localhost script]# cat host

192.168.1.10 root 123456

192.168.1.20 root 123456

192.168.1.30 root 123456

[root@localhost script]# ls

copykey.sh  hosts

2).编写copykey.sh脚本,自动生成密钥并分发key.

[root@localhost script]# vim copykey.sh

#!/bin/bash

# 判断id_rsa密钥文件是否存在

if [ ! -f ~/.ssh/id_rsa ];then

ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa

else

echo "id_rsa has created ..."

fi

#分发到各个节点,这里分发到host文件中的主机中.

while read line

do

user=`echo $line | cut -d " " -f 2`

ip=`echo $line | cut -d " " -f 1`

passwd=`echo $line | cut -d " " -f 3`

expect <<EOF

set timeout 10

spawn ssh-copy-id $user@$ip

expect {

"yes/no" { send "yes\n";exp_continue }

"password" { send "$passwd\n" }

}

expect "password" { send "$passwd\n" }

EOF

done <  hosts

(5)shell调用expect执行多行命令.

#!/bin/bash

ip=$1

user=$2

password=$3

expect <<EOF

set timeout 10

spawn ssh $user@$ip

expect {

"yes/no" { send "yes\n";exp_continue }

"password" { send "$password\n" }

}

expect "]#" { send "useradd hehe\n" }

expect "]#" { send "touch /tmp/test.txt\n" }

expect "]#" { send "exit\n" } expect eof

EOF

#./ssh5.sh 192.168.1.10 root 123456

Linux-expect(以交互形式输入命令,实现交互通信)的更多相关文章

  1. Linux 下 expect 脚本语言中交互处理常用命令

    Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...

  2. 使用expect实现自动交互,shell命令行自动输入,脚本自动化,变量引用,expect spawn执行带引号命令,expect 变量为空,不生效,不能匹配通配符*,函数,数组

    背景 有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互. expect是一个自动交互功能的工具,可以满足代替我们实际工作 ...

  3. 使用expect实现自动交互,shell命令行自动输入

    背景 有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互. expect是一个自动交互功能的工具,可以满足代替我们实际工作 ...

  4. Linux中输入命令按tab提示后会自动转义解决方案(xjl456852原创)

    linux在命令行输入命令时,如果有$字符,按tab键时会自动在前面加入转义字符,反而达不到自己需要的效果. 例如: 在Centos7下,我要进入一个环境变量,并编辑一个文件: 比如我要进入$JAVA ...

  5. linux expect 即exp脚本交互功能【原】

    场景 expect命令用于任何自动化互动的过程. send – 发送字符串到进程 expect – 等待来自进程的特定的字符串 spawn – 启动命令 安装 expect一开始100%不存在, 手动 ...

  6. 在Linux中输入命令时打错并按了enter

    今天在Linux中输入命令时,打错一个单词了,之后出现一串串的~,按ESC也没用, 并在底部出现:quit<enter> to exit vim 解决办法: 按几下 esc 确保 vim ...

  7. Linux:关于设置PS1提示符输入长命令格式出现的问题及解决

    关于设置PS1提示符命令输出格式出现的问题解决 正确的格式 \[\e[;;32m\]xxxx #如果只是改变提示符而不改变命令,在后面加一个结束符. \[\e[;;32m\]xxxx \[\e[0m ...

  8. linux脚本实现自己主动输入password

    使用Linux的程序猿对输入password这个举动一定不陌生,在Linux下对用户有严格的权限限制,干非常多事情越过了权限就得输入password.比方使用超级用户运行命令,又比方ftp.ssh连接 ...

  9. Linux必学的60个命令

    inux必学的60个命令Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想 ...

  10. 【转】linux 必须掌握的60个命令

    Linux必学的60个命令Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要 ...

随机推荐

  1. KVM 核心功能:CPU 虚拟化

    1 vCPU 简介 CPU 负责计算机程序指令的执行.QEMU-KVM 提供对虚拟机 CPU 的模拟,对于虚拟机来说,其拥有的 CPU 是真实的, 和物理 CPU 没有区别. 实际上,虚拟机在 hos ...

  2. 【Linux API 揭秘】module_init与module_exit

    [Linux API 揭秘]module_init与module_exit Linux Version:6.6 Author:Donge Github:linux-api-insides 1.函数作用 ...

  3. 2023-SWPU NSS秋季招新赛(校外赛道)Misc—我要成为原神高手WP

    1.题目信息 我是神里绫华的狗!!! 2.解题方法 有个genshin.h文件夹,打开看看发现里面是一堆文件夹0 1A 1A0等等,而且每个文件夹里面都有文件,0 1A 1A0...看着很眼熟,我们用 ...

  4. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.21)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  5. Oracle 不同字符集复合索引长度验证

    Oracle 不同字符集复合索引长度验证 背景 前段时间同事找到一个参数, 可以解决Oracle的char和byte 模式存储超长的问题. 很大程度上解决了研发修改SQL的工作量. 但是发现在某些字符 ...

  6. [转帖]10.2 Data Collector与MDW

    10.2 Data Collector与MDW Data Collection功能是SQL SERVER 2005版本提供的数据库监控报表的功能,通过定时地对数据库的语句运行情况,服务器各种资源的监控 ...

  7. [转帖]tidb Modify Configuration Dynamically

    https://docs.pingcap.com/tidb/v6.5/dynamic-config This document describes how to dynamically modify ...

  8. 【转帖】32.MinorGC、MajorGC和FullGC的对比

    目录 1.MinorGC.MajorGC和FullGC的对比 2.GC触发机制 1.MinorGC.MajorGC和FullGC的对比 1.JVM在进行GC的时候,并不是每次都是对新生代.老年代.永久 ...

  9. [转帖]Linux文件夹对比并提取的差分文件技巧-rsync的妙用

    https://www.xitongjiaocheng.com/linux/2017/45720.html   需求 最近团队正在开发一个版本对比工具,要求是把A1文件夹与A2对比,将A2中的增量部分 ...

  10. 简单进行Springboot Beans归属模块单元的统计分析方法

    简单进行Springboot Beans归属模块单元的统计分析方法 背景 基于Springboot的产品变的复杂之后 启动速度会越来越慢. 公司同事得出一个结论. beans 数量过多会导致启动速度逐 ...