这里写目录标题

  • Expect概述
    • 基本命令
  • 应用案例
    • 磁盘自动分区脚本
    • 远程ssh另一台主机
    • 自动连接ftp下载文件
    • 综合案例

Expect概述

  • Expect是建立在tcl基础上的一个工具,Expect 是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。对于大规模的linux 运维很有帮助
  • 在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入yes/no password等信息。为了模拟这种输入,可以使用Expect脚本

使用expect之前需要先安装
yum –y intall expect

基本命令

  • send:向进程发送字符串,用于模拟用户的输入
    该命令不能自动回车换行,一般要加 \r(回车)

  • expect:expect的一个内部命令,判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回。只能捕捉由spawn启动的进程的输出

  • spawn:启动进程,并跟踪后续交互信息

  • interact:执行完成后保持交互状态,把控制权交给控制台

  • Timeout:指定超时时间,过期则继续执行后续指令

  • exp_continue:允许expect继续向下执行指令

  • send_user:回显命令,相当于echo

  • $argv 参数数组:Expect脚本可以接受从bash传递的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个…参数

Expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了

应用案例

磁盘自动分区脚本

#!/bin/bash#安装expect
rpm -q expect &>/dev/null
if [ $? -ne 0 ];thenyum install -y expect >/dev/nullecho "expect安装成功"
fi#设置挂载硬盘的参数
fdisk -l |egrep '^Disk /dev/sd.*'
read -p "请输入需要挂载得硬盘路径: " disk_new
partitions="${disk_new}1"#expect交互脚本
/usr/bin/expect << EOF
set timeout 30
spawn bash -c "fdisk $disk_new"expect "Command*" {send "n\r"}
expect "*p*" {send "p\r"}
expect "*1*" {send "\r"}
expect "First*" {send "\r"}
expect "Last*" {send "\r"}
expect "*help*" {send "wq\r"} expect eof
interact
EOF#格式化磁盘
mkfs -t xfs $partitions#挂载
read -p "输入需要挂载得路径:" target_dir
if [ ! -d $target_dir ]
thenmkdir -p $target_dir
fi
echo "$partitions            $target_dir                xfs       defaults              0 0" >> /etc/fstab#重载fstab配置
mount -a
df -Th

远程ssh另一台主机

需求1:A远程登录到server上什么都不做

#!/usr/bin/expect
# 开启一个程序
spawn ssh root@10.1.1.1
# 捕获相关内容
expect {"(yes/no)?" { send "yes\r";exp_continue }"password:" { send "123456\r" }
}
interact  # interact 这个写在最后代表交互,如果不写执行完动作就会退出脚本执行方式:
# ./expect.sh
# /shell/expect.sh
# expect -f expect.sh1)定义变量
#!/usr/bin/expect
set ip 192.168.188.188
set pass 123
set timeout 5
spawn ssh root@$ip
expect {"yes/no" { send "yes\r";exp_continue }"password:" { send "$pass\r" }
}
interact2)使用位置参数
#!/usr/bin/expect
set ip [ lindex $argv 0 ]
set pass [ lindex $argv 1 ]
set timeout 5
spawn ssh root@$ip
expect {"yes/no" { send "yes\r";exp_continue }"password:" { send "$pass\r" }
}
interact

需求2:A远程登录到server上操作

#!/usr/bin/expect
set ip 192.168.188.188
set pass 123
set timeout 5
spawn ssh root@$ip
expect {"yes/no" { send "yes\r";exp_continue }"password:" { send "$pass\r" }
}expect "#"
send "rm -rf /tmp/*\r"        # 删除临时文件
send "touch /tmp/file{1..3}\r"    # 创建临时文件
send "date\r"
send "exit\r"
expect eof

需求3:shell脚本和expect结合使用,在多台服务器上创建1个用户

[root@server shell04]# cat ip.txt
192.168.188.188 123
192.168.188.186 1231. 循环  useradd username
2. 登录远程主机——>ssh——>从ip.txt文件里获取IP和密码分别赋值给两个变量
3. 使用expect程序来解决交互问题#!/bin/bash
# 循环在指定的服务器上创建用户和文件
while read ip pass
do/usr/bin/expect <<-EOF &>/dev/nullspawn ssh root@$ipexpect {"yes/no" { send "yes\r";exp_continue }"password:" { send "$pass\r" }}expect "#" { send "useradd maomao;rm -rf /tmp/*;exit\r" }expect eofEOF
echo "$ip服务器用户创建完毕"
done < ip.txt

自动连接ftp下载文件

#!/bin/bash
#自动连接ftp服务器然后下载pub下面的test.txt
#by stanZ 2021-1-27
if [ $# -eq 0 ];thenecho "用法:`basename $0` ftp服务器ip地址"exit 1
fi
pgrep firewalld &>/dev/null
if [ $? -eq 0 ];thensystemctl stop firewalld &>/dev/null
fiif [[ $(getenforce) == Enforcing ]];thensetenforce 0sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config &>/dev/null
firpm -q expect &>/dev/null
if [ $? -ne 0 ];then[ $UID -eq 0 ] && yum install -y expect &>/dev/null || echo "你没有权限安装expect"
fi{/usr/bin/expect <<-EOF set timeout 5   spawn ftp $1expect  {"):" { send "ftp\r";exp_continue }"Password:" { send "\r" }}expect "ftp>" send "cd pub\r" send "get test.txt\r" send "bye\r" expect eofEOF
}&>/dev/null
wait
echo "test.txt文件下载完毕"

综合案例

写一个脚本,将跳板机上yunwei用户的公钥推送到局域网内可以ping通的所有机器上
说明:主机和密码文件已经提供

192.168.188.188:123

192.168.188.186:123

步骤分析

  • 跳板机上的yunwei用户生成秘钥对
    判断账号是否存在 (id yunwei)
    判断该用户是否有密钥对文件 [ -f xxx ]
  • 判断expect程序是否安装
  • 判断局域网内主机是否ping通
    循环判断 for while
    循环体do…done ping 主机 如果ping通 调用expect程序自动应答推送公钥
  • 测试验证是否免密登录成功
  • 检查服务器上ssh服务端口号
  • 把公钥推送成功的主机的信息保存到文件
  • 关闭防火墙和selinux
  • 日志记录
  • 推送公钥需要自动应答expect

这里要实现功能 要切换成yunwei账户 必须写两个脚本文件
第一个脚本由root执行
第二个脚本由运维执行

#!/bin/bash
#ssh自动上传公钥,并且能远程控制
#by stanZ      2021-1-11
# 判断防火墙是否关闭
pgrep firewalld &>/dev/null
if [ $? -eq 0 ];thensystemctl stop firewalld &>/dev/null # 关闭防火墙
fi# 关闭selinux安全中心
if [[ $(getenforce) = Enforcing ]];thensetenforce 0sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config &>/dev/null
fi{id yunwei &>/dev/null    # 判断yunwei账户是否存在 不存在则创建
[ $? -ne 0 ] && useradd yunwei && echo 123|passwd --stdin yunwei
# 给yunwei账户sudo授权 取消注释
sed -ri 's/^#(.*required.*)/\1/' /etc/pam.d/su
sed -ri 's/^#(.*NOPASSWD)/\1/' /etc/sudoers
# 加入wheel组拥有权限
gpasswd -a yunwei wheel
} >/dev/null# 判断expect是否安装
rpm -q expect &>/dev/null
if [ $? -ne 0 ];thenyum install -y expect >/dev/nullecho "expect安装成功"
fisu - yunwei

补充:

[ ! -f /root/.ssh/id_rsa.pub ] && ssh-keygen -P '' -f /root/.ssh/id_rsassh-keygen -P''   设定密码为空-f /root/.ssh/id_rsa 指定密钥位置这样就不需要交互操作
#!/bin/bash
#ssh自动上传公钥,并且能远程控制
#by  stanZ     2021-1-11
# 判断私钥是否创建 如果没创建则使用免交互的命令
if [ ! -f /home/yunwei/.ssh/id_rsa ];thenssh-keygen -P '' -f ~/.ssh/id_rsa &>/dev/null
fiwhile read ip pass
do
{ping -c1 $ip if [ $? -eq 0 ];thenecho $ip >> /home/yunwei/ip_up.txt/usr/bin/expect <<-EOFset timeout 10spawn ssh-copy-id root@$ipexpect  "(yes/no)" { send "yes\r";exp_continue }expect  "password:" { send "$pass\r" }expect eofEOFelseecho $ip >> /home/yunwei/ip_down.txtfi
}&>/dev/null
done < /home/ip.txt
wait
echo "公钥推送完毕,准备测试"
remote_ip=`head -1 /home/yunwei/ip_up.txt`
ssh root@$remote_ip hostname &>/dev/null
test $? -eq 0 && echo "公钥成功推送,并且能远程连接"

shell脚本——expect的综合使用(包含应用案例)相关推荐

  1. shell脚本——sed详细介绍(包含应用案例)

    三剑客sed详解 Sed概述 Sed处理模式 Sed基本用法 Sed返回值 Sed和正则表达式 汇总示例 举例说明 实战案例 Sed概述 Sed是文本处理工具,依赖于正则表达式,可以读取文本内容,根据 ...

  2. shell脚本——awk详细介绍(包含应用案例)

    三剑客awk详解 awk概述 awk处理文本方式 awk工作原理 awk语法 汇总示例 内部变量 格式化输出 模式(正则表达)和动作 概念 字符串比较 数值比较 目的 关系运算符 算术运算 多条件运算 ...

  3. shell脚本——for循环语句(包含应用案例)

    for循环语句 for循环语法结构 列表循环 不带列表循环 实例 类C风格的for循环 循环控制语句 应用案例 九九乘法表 直角三角形 等腰三角形 倒等腰三角形 菱形 空心三角形 空心菱形 脚本计算1 ...

  4. shell脚本——expect命令

    一.对expect的基本了解 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互 ...

  5. Shell脚本——Expect

    Expect基本概述 Expect是通用的,因此它可以作为用户级别的命令运行,而无需考虑任何程序和任务.Expect实际上可以同时与多个程序对话.Expect对于需要程序与用户交互的程序来说非常有用. ...

  6. Linux下shell自动输入密码,shell脚本通过expect脚本实现自动输入密码

    背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现 一.在shell脚本中嵌入expect来实现密码输入 expect是一个自动交互功能的工具.ex ...

  7. Linux Shell 脚本知识点

    正则表达式在线生成工具: http://tools.jb51.net/regex/create_reg 0. shell 调试 复制代码 代码如下: sh -x somefile.sh 在somefi ...

  8. 这100个shell脚本案例,你都知道吗?一篇教会你写90%的shell脚本

    shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效.安全.低成本地使用 Linux 内核,这就是 Shell 的本质. shell脚本就是由Shell命令组成的执行文件, ...

  9. shell for循环命令行_精心汇总的24道shell脚本面试题

    虽然现在Python在运维工作中已经使用很普遍,但是很多企业在找Linux云计算工程师的时候还是会问到 shell 脚本的问题,它有助于你在工作环境中自动完成很多任务. 如下是一些面试过程中,经常会遇 ...

最新文章

  1. 廖雪峰python2.7教程_Python 2.7教程
  2. 如何搭建一个数据库服务器平台 .
  3. 连接fiddler后手机无法显示无网络
  4. jQuery操作DOM节点的相关方法
  5. LeetCode-11-Container With Most Water
  6. DataStudio 编辑器快捷键列表
  7. 7款让你时刻涨知识越变越强的在线网站分享,相见恨晚!
  8. 企业级代码静态测试工具Helix QAC——Helix QAC Dashboard基于团队的工程质量管理系统/Helix QAC资质认证
  9. 怎样从微博下载视频?
  10. 全新型App开放框架—Clouda
  11. Python爬取De下载站相关代码
  12. 如何把动态硬盘转换为基本硬盘
  13. 回车enter键的js
  14. 文本挖掘 包含中英文数据预处理以及分析
  15. 腾讯万亿级 Elasticsearch
  16. 办公技巧:常用的100个Word快捷键
  17. 智能汽车进入HPC时代,这家本土芯片厂商如何领跑市场
  18. 利用TF_IDF算法计算两英文文章的文本相似度 C++实现
  19. C/C++的灵魂—指针实现冒泡排序、选择排序和插入排序
  20. 如何将DWG另存为kml文件?

热门文章

  1. (四)本地镜像发布到阿里云将阿里云上的镜像下载到本地
  2. 让外拍更出色 美图秀秀打造紫色LOMO风
  3. 因为在计算机中丢失PGFltMg,PG9171E燃气轮发电机组事故处理
  4. 大数相乘(C语言,分治算法)
  5. MySql进阶索引篇01——深度讲解索引的数据结构:B+树
  6. gitmodel学习笔记(一):利用sympy分析高等数学
  7. LinuxC/C++服务器开发学习路线(已签腾讯sp,附学习资料)
  8. java除法(java除法运算保留整数)
  9. Java实战—POI操作Excel文档、读取、写入、合并单元格
  10. 爆款论文提出简单循环单元SRU:像CNN一样快速训练RNN(附开源代码)