Expect 主要应用于自动化交互式操作场景,可以将ssh、ftp、scp等需人工交互的操作写在一个脚本上使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。

其主要交互流程是:

spawn启动指定进程(发送命令) -> expect获取指定关键字 -> send发送回应 -> 执行完成 -> 继续或退出.

一、 下载安装

expect 是由基于Tcl( Tool Command Language )语言开发的,因此安装前需要安装tcl语言环境。可以使用yum安装或源码安装。

1. 下载

  • rpm包下载:Oracle Linux 5 (x86_64) Latest | Oracle, Software. Hardware. Complete.
  • tcl  Download Tcl/Tk 8.4.20
  • expect  Expect - Browse Files at SourceForge.net

2. yum安装

yum install -y tcl
yum install -y expect

3. rpm安装

rpm -ivh tcl-8.4.13-4.el5.x86_64.rpm
rpm -ivh expect-5.43.0-5.1.x86_64.rpm

4. 源码安装

解压安装包

tar -zxvf tcl8.4.20-src.tar.gz
tar -zxvf expect5.45.3.tar.gz

安装tcl

cd tcl8.4.20/unix/
./configure --prefix=/usr/tcl --enable-shared
make
make install
cp tclUnixPort.h ../generic

安装expect

cd /root/expect5.45.3/
./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=/root/tcl8.4.20/generic
make
make install
ln -s /usr/tcl/bin/expect /usr/bin/expect

简单测试

[root@mydb02 ~]# expect
expect1.1> send "hello world\n"
hello worldexpect1.1> expect "hi" { send "You said hi\n" } \
+> "hello" { send "Hello yourself\n" } \
+> "bye" { send "That was unexpected\n" }
#输入
hi
#输出
You said hi

二、 expect 常用命令

完整版可执行 man expect 查看

命 令 说 明
spawn 启动新的交互进程,后面跟命令或者指定程序
expect 待匹配信息(部分匹配即可)。从进程中接收信息,如果匹配成功,就执行expect后的动作
send 向进程发送字符串或命令
exp_continue 匹配多个字符串在执行动作后加此命令
send_user 打印后跟的字符串内容,相当于shell中的echo
interact 执行完命令后保持在交互状态,此时Expect会把控制权交给控制台,变回手工操作。如果只是登录过去执行一段命令就退出,可将其改为 expect eof
exit 退出expect脚本
eof expect执行结束, 退出
set 定义变量
puts 输出变量
set timeout 设置超时时间

三、 常用脚本

最简单的自动登录脚本

#!/usr/bin/expectset timeout 30
spawn ssh -l root 172.16.22.131
expect "password*"
send "123456\r"
interact
# 或者 expect eof 

#!/usr/bin/expect 必须位于第一行,说明需要使用系统的哪个脚本解析引擎来执行,具体路径根据实际expect 命令实际路径而定。

1. 使用变量

#!/usr/bin/expect
set ip 172.20.110.199
set user root
set password 123456wht
set timeout 10
spawn ssh $user@$ip
expect "password:"
send "$password\n"
interact
#expect eof

运行结果如下

[root@localhost ~]#./sshbl.exp
spawn ssh 172.20.110.199
root@172.20.110.199's password:
Last login: Sat May 12 11:26:45 2018 from 172.20.110.169
[root@localhost ~]# 

2. 位置参数

#!/usr/bin/expect
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh $user@$ip
expect { "yes/no" { send "yes\n";exp_continue } "password" { send "$password\n" }
}
interact
#运行  ./ssh3.exp 192.168.8.100 root magedu

3. shell脚本调用expect

批量ssh-copy-id

#!/bin/bash
#用于批量ssh-copy-id 免密码登陆服务器
which expect || yum -y install expect
TXT_PATH=/home/wht/ssh-login/list.txtssdzd(){
expect <<-EOF
set timeout 10
spawn ssh-copy-id  $user@$ip
expect { "yes/no" { send "yes\n";exp_continue } "password" { send "$password\n" }
}
expect "]#" { send "exit\n" }
expect eof
EOF
}
a=`cat ${TXT_PATH}|wc -l`
echo $a
for i in `seq $a` ; doecho $iip=`cat ${TXT_PATH}|head -n $i|tail -n 1|awk '{print $1}'`user=`cat ${TXT_PATH}|head -n $i|tail -n 1|awk '{print $2}'`password=`cat ${TXT_PATH}|head -n $i|tail -n 1|awk '{print $3}'` ssdzd
done

list.txt

  • 192.168.8.27 root zmoam#11232134
  • 192.168.8.31 root zmoam#11231234

4. 自动mv文件

vi  exe.expect

#!/usr/bin/expect
set host [lindex $argv 0]
set passwd "xxxx"
spawn ssh myuser@$host
expect { "yes/no" { send "yes\n";exp_continue } "password" { send "$passwd\n" }
}
expect "$ "
send "sudo -i\r"
expect "myuser:"
send "$passwd\r"
expect "]# "
send "cd /etc/zabbix/zabbix_agentd.d/zabora/sql\r"
expect "]# "
send "mv test.txt test.txt.bak\r"
expect "]# "
send "exit\r"
#expect eof
expect "~]$ "
send "exit\r"
expect eof

vi  test.sh

#!/bin/bash
for ip in `cat ip.txt`
do./exe.expect $ip
done

ip.txt

  • 192.168.3.225
  • 192.168.3.247

执行效果

[root@mydb02 ~]# ./test.sh ip.txt
spawn ssh myuser@192.168.3.225
myuser@192.168.3.225's password:
Last login: Wed Dec  2 19:07:49 2020 from 10.13.3.224
[myuser@mydb03 ~]$ sudo -i
[sudo] password for myuser:
[root@mydb03 ~]# cd /etc/zabbix/zabbix_agentd.d/zabora/sql
[root@mydb03 sql]# mv test.txt test.txt.bak
[root@mydb03 sql]# exit
logout
[myuser@mydb03 ~]$ exit
logout
Connection to 192.168.3.225 closed.
spawn ssh myuser@192.168.3.247
myuser@192.168.3.247's password:
Last login: Wed Dec  2 19:07:50 2020 from 10.13.3.224
[myuser@mydb04 ~]$ sudo -i
[sudo] password for myuser:
[root@mydb04 ~]# cd /etc/zabbix/zabbix_agentd.d/zabora/sql
[root@mydb04 sql]# mv test.txt test.txt.bak
[root@mydb04 sql]# exit
logout
[myuser@mydb04 ~]$ exit
logout
Connection to 192.168.3.247 closed.
[root@mydb02 ~]#

5. 执行需要多次应答的脚本

执行 perl adcfgclone.pl dbTechStack  脚本,并输入各种各样的应答

#!/bin/bash#**********************************************************************************
# Author: Hehuyi_In
# Date: 2022年05月
# FileName: erp_adcfgclone_db_tier.sh
# Dependence: yum install expect -y
# Description: Run adcfgclone.pl script on db tier
# CopyRight (C): 2022 All rights reserved
# example: bash -x erp_adcfgclone_db_tier.sh or ./erp_adcfgclone_db_tier.sh
#**********************************************************************************ORACLE_SID_UPPER=`echo "$ORACLE_SID" | tr '[:lower:]' '[:upper:]'`# execute adcfgclone.pl script by expect
erp_adcfgclone_db_tier(){
lsnrctl stop $ORACLE_SID
cd /u01/$ORACLE_SID/db/tech_st/11.2.0/appsutil/clone/binexpect <<EOF
set timeout -1
spawn perl adcfgclone.pl dbTechStack
expect "APPS password :"
send "xxxxx\r"
expect "Target System Hostname"
send "\r"
expect "RAC (y/n)"
send "\r"
expect "Database SID :"
send "$ORACLE_SID\r"
expect "Base Directory :"
send "/u01/$ORACLE_SID\r"
expect "Directory List :"
send "/tmp\r"
expect "Target System"
send "2\r"
expect "DATA_TOP Directory 1 :"
send "/u01/$ORACLE_SID/db/apps_st/data/${ORACLE_SID_UPPER}/onlinelog\r"
expect "DATA_TOP Directory 2 :"
send "/u01/$ORACLE_SID/db/apps_st/data/${ORACLE_SID_UPPER}/datafile\r"
expect "/u01/$ORACLE_SID/db/tech_st/11.1.0"
send "/u01/$ORACLE_SID/db/tech_st/11.2.0\r"
expect "preserve the Display"
send "n\r"
expect "Target System Display"
send "\r"
expect "source system (y/n)"
send "n\r"
expect "Port Pool"
send "80\r"
EOF
}# execute the function
erp_adcfgclone_db_tier

参考

shell编程之expect用法

教你如何在Linux中通过expect工具实现脚本的自动交互 | 《Linux就该这么学》

expect简单教程 - zbk.gyl - 博客园

expect脚本同步文件、批量远程执行命令_rain_yunlx的博客-CSDN博客

Linux expect —— 安装、常用语法及案例相关推荐

  1. linux命令:awk常用语法

    awk 的工作原理是将文件内容逐行读入,然后以每一行中的空格为分隔符将每行数据切分成几列,再对每列的元素进行各种分析处理.  下面结合实例简单介绍 awk 命令常用的几种格式: 假设文件 form.t ...

  2. [亲测,Success]Linux,VMware 安装+常用 命 令+网 络+进 程 管 理以及软件安装

    安装Linux 1.环 境 安 装 1 安装VMware,课程中使用的是VMware10的版本 2 检测系统是否支持虚拟化 如果是win10系统,直接打开任务管理器查看 3 如果支持,查看虚拟化是否开 ...

  3. linux命令:grep常用语法

    grep 的工作原理是将文件内容逐行读入,然后在每一行数据中搜索符合条件的内容并打印出来  grep 命令的使用格式如下: grep   "pattern"   file_name ...

  4. 8. Linux mint 安装Tim、网盘、wps等常用软件

    Linux mint 安装 常用软件 1. 安装网易云音乐(官网直接有安装包) 可以听歌享受一下的旅程 2.安装tim 上面直接引入原文的开头了, 教程其实原文已经非常详细,还有一些问题的注意,都已经 ...

  5. Linux 最最最常用的命令

    关注.星标公众号,直达精彩内容 作者:南独酌酒nvn https://blog.csdn.net/qq_43647359/article/details/104792569 操作系统概述 操作系统 O ...

  6. Linux编译安装qt5.9,Linux CentOS7 安装 Qt 5.9.2

    Linux CentOS7 安装 Qt 5.9.2 参考链接 http://doc.qt.io/qt-5/linux.html sudo yum groupinstall "C Develo ...

  7. Linux下载安装、常用命令、shell

    Linux 1. 概述 操作系统 操作系统(Operation System, OS),是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石.操作系统需要处理如管理与配置内存.决定系 ...

  8. [Linux] Linux相关系统常用命令command使用及案例

    Linux常用命令及案例分析 基本使用类 打开pdf, 表格,word 文档 基本使用类 Linux常用命令包括: 查看硬件信息命令:ifconfig free fdisk ethtool mii-t ...

  9. Linux 操作系统(常用命令、软件安装,项目手动部署、shell 自动化部署)

    Linux 操作系统 不同领域的主流操作系统 桌面操作系统:windows(用户数量最多).Mac OS(操作体验好,办公人士首选).Linux(用户数量少)服务器操作系统:UNIX(安全.稳定.收费 ...

最新文章

  1. Atitit。DD dragdrop拖拽功能c#.net java swing的对比与实现总结
  2. SharePoint 2013 Farm 安装指南——Least Privilege
  3. zabbix4.2学习笔记系列
  4. HDU 3397 Sequence operation(线段树)
  5. 【linux指令】dialog实现终端下的GUI-1
  6. 小学在班里排第几名家长才比较放心?
  7. c++连接云服务器_如何简单搭建Minecraft服务器
  8. [已解决] org.hibernate.HibernateException:没有活动事务,get无效
  9. 实例6 函数的返回值
  10. list删除数据的唯一正确写法
  11. arm平台下的反汇编pdf_stm32逆向与安全科普,bin文件逆向反汇编
  12. 电芯容量在前期循环中容量增加_锂电池随着使用次数增加而最大容量下降,为什么...
  13. SpringCloud_03_Feign入门示例
  14. 万能的json格式化
  15. 手机影音第十七天,实现歌词同步
  16. python生成exe文件
  17. 360度反馈调查表中的问题示范
  18. 编码器输出:HTL、TTL
  19. 运营笔记:一个新公众号怎么吸粉?看看这位大神怎么做的!
  20. 银行项目外包专题系列之二:公司没提升打杂,裸辞后收到银行外包,到底去还是不去

热门文章

  1. 周杰伦《青花瓷》歌词欣赏-----方文山作词,周杰伦谱曲
  2. 群收收 - 专业微信支付宝付费进群/收费群系统
  3. risc-v与SBI与ABI
  4. C++ char类型转string类型的两种方法
  5. 多位粮食局长宣布禁食一天体验饥饿被疑作秀-粮食局在-饥饿-禁食
  6. C++对vector排序
  7. jira linux 一键安装包下载地址,JIRA使用教程:使用文件包安装JIRA
  8. 房屋检测和房屋鉴定的区别
  9. pycharm安装Translation翻译插件(中文翻译)
  10. doc转pdf怎么转换?这个软件帮你轻松搞定