shell脚本——expect的综合使用(包含应用案例)
这里写目录标题
- 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的综合使用(包含应用案例)相关推荐
- shell脚本——sed详细介绍(包含应用案例)
三剑客sed详解 Sed概述 Sed处理模式 Sed基本用法 Sed返回值 Sed和正则表达式 汇总示例 举例说明 实战案例 Sed概述 Sed是文本处理工具,依赖于正则表达式,可以读取文本内容,根据 ...
- shell脚本——awk详细介绍(包含应用案例)
三剑客awk详解 awk概述 awk处理文本方式 awk工作原理 awk语法 汇总示例 内部变量 格式化输出 模式(正则表达)和动作 概念 字符串比较 数值比较 目的 关系运算符 算术运算 多条件运算 ...
- shell脚本——for循环语句(包含应用案例)
for循环语句 for循环语法结构 列表循环 不带列表循环 实例 类C风格的for循环 循环控制语句 应用案例 九九乘法表 直角三角形 等腰三角形 倒等腰三角形 菱形 空心三角形 空心菱形 脚本计算1 ...
- shell脚本——expect命令
一.对expect的基本了解 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互 ...
- Shell脚本——Expect
Expect基本概述 Expect是通用的,因此它可以作为用户级别的命令运行,而无需考虑任何程序和任务.Expect实际上可以同时与多个程序对话.Expect对于需要程序与用户交互的程序来说非常有用. ...
- Linux下shell自动输入密码,shell脚本通过expect脚本实现自动输入密码
背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现 一.在shell脚本中嵌入expect来实现密码输入 expect是一个自动交互功能的工具.ex ...
- Linux Shell 脚本知识点
正则表达式在线生成工具: http://tools.jb51.net/regex/create_reg 0. shell 调试 复制代码 代码如下: sh -x somefile.sh 在somefi ...
- 这100个shell脚本案例,你都知道吗?一篇教会你写90%的shell脚本
shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效.安全.低成本地使用 Linux 内核,这就是 Shell 的本质. shell脚本就是由Shell命令组成的执行文件, ...
- shell for循环命令行_精心汇总的24道shell脚本面试题
虽然现在Python在运维工作中已经使用很普遍,但是很多企业在找Linux云计算工程师的时候还是会问到 shell 脚本的问题,它有助于你在工作环境中自动完成很多任务. 如下是一些面试过程中,经常会遇 ...
最新文章
- 廖雪峰python2.7教程_Python 2.7教程
- 如何搭建一个数据库服务器平台 .
- 连接fiddler后手机无法显示无网络
- jQuery操作DOM节点的相关方法
- LeetCode-11-Container With Most Water
- DataStudio 编辑器快捷键列表
- 7款让你时刻涨知识越变越强的在线网站分享,相见恨晚!
- 企业级代码静态测试工具Helix QAC——Helix QAC Dashboard基于团队的工程质量管理系统/Helix QAC资质认证
- 怎样从微博下载视频?
- 全新型App开放框架—Clouda
- Python爬取De下载站相关代码
- 如何把动态硬盘转换为基本硬盘
- 回车enter键的js
- 文本挖掘 包含中英文数据预处理以及分析
- 腾讯万亿级 Elasticsearch
- 办公技巧:常用的100个Word快捷键
- 智能汽车进入HPC时代,这家本土芯片厂商如何领跑市场
- 利用TF_IDF算法计算两英文文章的文本相似度 C++实现
- C/C++的灵魂—指针实现冒泡排序、选择排序和插入排序
- 如何将DWG另存为kml文件?
热门文章
- (四)本地镜像发布到阿里云将阿里云上的镜像下载到本地
- 让外拍更出色 美图秀秀打造紫色LOMO风
- 因为在计算机中丢失PGFltMg,PG9171E燃气轮发电机组事故处理
- 大数相乘(C语言,分治算法)
- MySql进阶索引篇01——深度讲解索引的数据结构:B+树
- gitmodel学习笔记(一):利用sympy分析高等数学
- LinuxC/C++服务器开发学习路线(已签腾讯sp,附学习资料)
- java除法(java除法运算保留整数)
- Java实战—POI操作Excel文档、读取、写入、合并单元格
- 爆款论文提出简单循环单元SRU:像CNN一样快速训练RNN(附开源代码)