Linux Shell 自动交互功能
需求背景:
近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录操作,就会产生大量重复性操作,既不能带来有效学习能力提升,同时也会极大产生不确定性,引发工作效率下降,那么如何自动化完成某些操作呢,尤其是带有交互功能的步骤呢,例如需要输入账号密码?
如有兴趣转载,请标注来源:https://www.cnblogs.com/xiong97/p/16557437.html 谢谢!
1. EOF 多文本输入
需求案例 1
新交付了一批机器,每台机器只分配了一块落盘 ,现在根据需求对该盘进行分区并实现挂载,如何实现?
需求分析:
对于一个盘,实现分区挂载到不同目录,通常思路有两条:
方法一: 将整块盘作为一个PV ,整合成VG卷,再根据划分不同LV卷大小分给不同目录
方法二: 通过fdisk 将盘直接分割成对应需求的大小,再对磁盘初始化,完成挂载
方案解决
这里我们为了演示交互功能,选择方法二,实现脚本如下:
#!/bin/bash
fdisk /dev/sdb <<EOF
n
p
1
wq
EOF
mkfs.xfs /dev/sdb1 && mkdir -p /data && mount /dev/sdb1 /data
echo '/dev/sdb1 /data xfs defaults 0 2' >> /etc/fstab
分析上述脚本,我们发现使用了 一个关键字 EOF
EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF.EOF一般会配合cat能够多行文本输出.
其用法如下:
<<EOF //开始
.... //需要输入的内容
EOF //结束
例如使用 cat、<<、EOF和>以交互方式编写bash脚本,如下所示。
cat << EOF > script.sh
#!/bin/bash
printf "Hello\n"
printf "Wordl!\n"
EOF


合理 利用这三个,即可以完成对应多文本交互输入,例如修改用户密码,正常情况下,需要连续输入两次密码,两次密码一致才能修改成功,如下:

上面我们学会了EOF 这个关键字,那么我们试试通过它来修改密码。脚本如下:
#!/bin/bash
cat << EOF| passwd
新密码
新密码,与上述需一致
EOF
# or 不使用管道符
passwd << EOF
新密码
新密码,与上述需一致
EOF
实战结果,成功修改密码:

2. Expect 自动交互
需求案例 2
新交付了一批机器,需要给每台机器分发文件,如何实现?
需求分析:
远程拷贝文件常用密令是scp 或者 rsync ,但是在给每台机器传输时需要若输入密码,有的机器可能还需要输入YES,录入机器指纹信息,如下:

Expect 是在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信. 其交互流程主要有以下5步:
0 定义变量
1 spawn启动指定脚本或命令
2 expect匹配结果关键词
3 send针对指定关键词发送指定指令
4 执行完成, 退出
但可惜的是os默认没有安装,因此需要先安装才能使用
Expect is a tcl application for automating and testing interactive applications such as telnet, ftp, passwd, fsck, rlogin, tip, etc. Expect makes it easy for a script to control another program and interact with it.
方案解决:
1. 先检查本机是否安装了expect ,如果没有安装,需要手动安装
# 检查是否安装了tcl:
[root@localhost ~]# rpm -qi expect
Name : expect
Version : 5.45
Release : 14.el7_1
Architecture: x86_64
Install Date: Fri 05 Aug 2022 07:26:04 AM CST
Group : Development/Languages
....
# 如果没有安装, 使用yum安装expect ,通常会顺带把依赖包tcl 也安装了:
[root@localhost ~]# yum install -y expect # -y 其实也是安装过程中一个交互,发现没,只是作为参数传入了
[root@localhost ~]# yum install -y tcl # 如果上述命令提示已安装tcl了,此步可以忽略
# 查看expect的安装路径:
[root@localhost ~]# which expect
/usr/bin/expect
2 .对应功能脚本开发,本案例脚本参考如下:
[root@test01 ~]# cat scp.exp
#! /usr/bin/expect
set file [lindex $argv 0]
set file2 [lindex $argv 1]
spawn scp -rp $file $file2 root@192.168.31.89:/tmp
expect {
"(yes/no)" {send "yes\r";exp_continue}
"*password:*" {send "Password\r"}
}
expect eof
exit -onexit {
send_user "bye \n"
}
3. 分析上述脚本,有几个点需要说明
#!/usr/bin/expect
脚本文件的第一行指明expect 安装位置,具体可以参考2 中命令查看,指明脚本解析器,和Shell类似,表示程序使用Expect解析,这里与一般bash 脚本不同,因此需要注意,通常我们会将expect脚本后缀修改成exp来和bash 脚本 sh区别
set 设置变量值
set file [lindex $argv 0] 将传入的第一个参数赋给file ,类似第二、三个参数[lindex $argv 1] [lindex $argv 2] 等,后续调用时使用 $file ,和shell 一样。特殊参数:
$argc表示传参的个数,$argv0表示脚本的名字
spawn 表名要执行的脚本或程序命令,如ssh、scp等
格式: spawn [选项] [需要自动交互的命令或程序]
例如:spawn scp -rp $file $file2 root@192.168.31.89:/tmp #<==执行scp命令(注意开头必须要有spawn, 否则无法实现交互)
expect
需和spawn 配合使用 ,表示匹配spawn指定的脚本或命令的输出结果,如果与expect后面的字符串匹配,就执行下面的send命令,表示对结果响应反馈
有时命令的输出提示信息有可能会变化,所以可以在expect中使用模糊匹配,比如*。
注意:匹配的动作也可以放在下一行,这样就不需要使用{}(大括号)了
send
在expect命令匹配指定的字符串后,发送指定的字符串给系统,这些命令可以支持一些特殊转义符号,例如:\r表示回车、\n表示换行、\t表示制表符等
exp_continue
从命令的拼写就可以看出命令的作用,即让Expect程序继续匹配的意思,如果需要一次匹配多个字符串,那么不同的匹配之间就要加上exp_continue,否则expect将不会自动输入指定的字符串。最后一个的结尾就不需要加上exp_continue了,因为前面都已完成了,它是最后一个啦
exit
功能类似于Shell中的exit,即直接退出脚本,还可以利用这个命令对脚本做一些关闭前提示等工作
send_user
打印Expect脚本信息,类似Shell里的echo. 例如打印变量信息,验证数据传入是否正常
在掌握expect 基本使用方式后,我们写一个批量查看机器负载信息的小脚本,加强记忆
#! /usr/bin/expect
set time 30
set ip [lindex $argv 0]
spawn ssh root@$ip uptime
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$password\r" }
}
expect eof
实战结果:

Linux Shell 自动交互功能的更多相关文章
- Linux Shell自动交互/人机交互的三种方法
如果你要学习linux,你可能会遇到Linux Shell自动交互问题,这里将介绍Linux Shell自动交互的解决方法,在这里拿出来和大家分享一下. 一.背景 shell脚本在处理自动循环或大的任 ...
- shell自动交互之expect脚本_转
转自:linux expect详解(ssh自动登录) shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh root@192.168.22.194 ...
- 3种shell自动交互的方法【转】
一.背景 shell脚本在处理自动循环或大的任务方面可节省大量的时间,通过创建一个处理任务的命令清单,使用变量.条件.算术和循环等方法快速创建脚本以完成相应工作,这比在命令行下一个个敲入命令要省时省力 ...
- 使用expect实现shell自动交互
expect 是一个自动交互功能的工具.expect 是开了一个子进程,通过 spawn 来执行 shell 脚本,监测到脚本的返回结果,通过 expect 判断要进行的交互输入内容. expect ...
- 【转】使用expect实现shell自动交互
原文地址:http://www.nginx.cn/1934.html shell脚本需要交互的地方可以使用here文档是实现,但是有些命令却需要用户手动去就交互如passwd.scp 对自动部署免去用 ...
- Linux shell 自动删除n天前日志
linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...
- [转载]使用expect实现shell自动交互
FROM:http://www.nginx.cn/1934.html shell脚本需要交互的地方可以使用here文档是实现,但是有些命令却需要用户手动去就交互如passwd.scp 对自动部署免去用 ...
- Linux shell自动读mongo数据、远程获取文件大小示例脚本
1.示例1 功能:对mongoDB导出数据,根据sid的不同状态进行统计 技术点:shell bash 读写文件.字符串截取.函数.用多个文件提到的map.grep查找并赋值给变量 #!/bin/b ...
- linux shell 自动判断操作系统release 然后连接FTP yum源的脚本
如何搭建本地yum源见附录① 如何搭建FTP yum源见附录② 脚本正文: #!/bin/sh# CenterOS config yumOSV=`rpm -q --qf %{version} cent ...
随机推荐
- MUI+html5+script 不同页面间转跳(九宫格)
在点击图片/标题需要跳转到详情页面的使用场景中,首先定义图片元素的id为"tyzc",是同一类下的第一个图片 <img src="img/img3.png" ...
- 最大流&最小割&费用流模版
好久都没有搞博客了.想认真写又要准备文化课期末了. ISAP 流程: 原理就是dfs找增广路. 最基础的建反向边以便反悔就不说了. 但是记录一个dep(dis)表示层数,一开始BFS(从t开始,dis ...
- .NET Core中JWT+Auth2.0实现SSO,附完整源码(.NET6)
一.简介 单点登录(SingleSignOn,SSO) 指的是在多个应用系统中,只需登录一次,就可以访问其他相互信任的应用系统. JWT Json Web Token,这里不详细描述,简单说是一种认证 ...
- CVPR2022 | 重新审视池化:你的感受野不是最理想的
前言 本文提出了一种简单而有效的动态优化池操作( Dynamically Optimized Pooling operation),称为DynOPool,它通过学习每一层感受野的最佳大小和形状来优化特 ...
- Docker容器固定ip
Docker容器固定IP 必须停止docker服务才能创建网桥 查看docker服务状态 停止docker服务 启动docker服务 [root@docker Tools]# systemctl st ...
- ”只用 1 分钟“ - 超简极速 Apk 签名 & 多渠道打包神器
众所周知,渠道包作为当下国内 Android 应用市场常见的分发方式,当 APP 和后台交互或进行数据上报时,会带上各自的 channel 渠道信息,以此方便企业 & 开发者统计 APP 在各 ...
- Python参数传递中的 args, kwargs
概念 真正的Python参数传递语法是*和**,其被称为 被称为打包和解包参数.*args和**kwargs只是大家默认的一种形式.也可以写成*keys和**kkeys等其他形式.二者都是为了在不知道 ...
- 11.Firewalld防火墙
Firewalld防火墙 目录 Firewalld防火墙 Firewalld概述 Firewalld Firewalld和iptables的关系 netfilter Firewalld/iptable ...
- python logging模块使用方法
# -*- coding: utf-8 -*- # @ModuleName: logger # @Time: 2022/6/10 11:48 # @Author : Free-A # @Descrip ...
- SpringBoot 整合文件上传 elment Ui 上传组件
SpringBoot 整合文件上传 elment Ui 上传组件 本文章记录 自己学习使用 侵权必删! 前端代码 博主最近在学 elment Ui 所以 前端使用 elmentUi 的 upload ...