“Linux免除系统交互操作方法、expect自动化交互工具” 及 “SSH批量修改主机密码脚本”
一、Linux系统免除交互操作方法
1、EOF多文本输入
案例:为机器磁盘进行分区并实现挂载,免交互式操作,如何实现?
#!/bin/bash
fdisk /dev/sdb <<EOF
n
p
1
wq
EOFmkfs.xfs /dev/sdb1 && mkdir -p /data && mount /dev/sdb1 /data
echo '/dev/sdb1 /data xfs defaults 0 2' >> /etc/fstab# 与 echo -e "n\np" | fdisk /dev/sdb 方式一样
2、标准输出和错误输出重定向 “> file 2>&1”
注意:有些命令的交互操作提示是不算在标准输出和错误输出中的,此时该方法不适用
ssh root@10.11.20.xxx -o StrictHostKeyChecking=no > logfile 2>&1
status_info=$( cat logfile )case ${status_info} in
*Connection refused*)echo "正在执行ssh连接主机${host}:ssh连接拒绝,请检查ssh服务是否开启!";;*)echo "ssh连接中"
附:在脚本中如何替代Ctrl + C等关闭命令的终端窗口?
注意:命令的交互操作提示是不算终端窗口的,此时该方法不适用
例如可以通过以下方式将telnet命令关闭sleep 1 | telnet 127.0.0.1 10050echo -e "\n" | telnet 10.127.0.0.1 10050echo "" | telnet 127.0.0.1 10050telnet 127.0.0.1 10050 < /dev/null 代表标准输入为空
3、Expect工具
一. expect 简介
-
expect 工具是一个根据脚本与其他交互式程序进行交互。通过在脚本中设定期望值和响应值进行交互操作。主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
-
解释型语言提供分支和高级控制结构引导对话。此外,用户可以在需要时直接进行控制和交互,然后将控制权返回给脚本。
-
简单来说,expect工具可以控制、处理输入,输出流,然后提供自动填写数据等需要用户交互式输入的数据的地方实现自动化处理。Expect就是为了处理“自动交互”的工具。
二. expect工作原理
spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出。
三. 基本语法
expect 启动选项:
-c 执行脚本前先执行的命令,可多次使用
-d debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。
-D 启用交换调式器,可设一整数参数。
-f 从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。
-i 交互式输入命令,使用"exit"或"EOF"退出输入状态
-- 标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --
-v 显示expect版本信息
expect 命令参数:
spawn 交互程序开始,执行后面的命令或程序。set timeout n 设置超时时间,表示该脚本代码需在n秒钟内完成,如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住。如果设置为-1表示不会超时set 定义变量,也可以使用"set var [xxx]"方式; 命令置换[],[ ]内是独立的TCL指令,使用不同的TCL指令可实现各种获取变量的效果。例如:set CommandList [lindex $argv 3]#获取命令列表,分号分隔set cmds [split $CommandList ";"]#获取命令列表长度set cmds_num [llength $cmds]$argv expect脚本可以接受bash的外部传参,可以使用[ lindex $argv n ]n为0表示第一个传参,为1表示第二个传参,以此类推expect 从交互程序进程中指定接收信息, 如果匹配成功, 就执行send的指令交互;否则等待timeout秒后自动退出expect语句send 如果匹配到expect接受到的信息,就将send中的指令交互传递,执行交互动作。结尾处加上\r表示如果出现异常等待的状态可以进行核查exp_continue 表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以继续执行下面的匹配。例如:ssh需要先匹配yes/no,再匹配passoword。yes/no" { send "yes\r"; exp_continue}"password:" { send "$passwd\r" }exit 退出expect脚本expect eof spawn进程结束后会向expect发送eof,接收到eof代表该进程结束interact 执行完代码后保持交互状态,将控制权交给用户。没有该命令执行完后自动退出而不是留在远程终端上send_user 用来打印expect脚本中的信息,类似shell里的echo命令puts 输出变量(打印字符串,类似于echo)
注释:puts
在输出字符串的尾部自动添加换行符而send_user
不会自动添加,除了换行符外,如果在Expect
脚本中使用日志文件,则通过发送的语句send_user
会将其放入日志文件,而通过发送的语句puts
则不会。
四、案例介绍
[root@localhost ~]# vim test.sh => 一般将expect脚本的后缀命名为".sh"#!/usr/bin/expect => expect的解析器,与shell中的#!/bin/bash类似
set timeout n => 设置超时时间n秒,表示下面的代码需在n秒钟内完成(-1代表永不超时),如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住
set name "12345" => set设置变量,name的值为123456spawn command1 command2.. => 执行命令,也可以将变量作为命令输入
expect{ => 接受执行命令返回的信息"accept1" {send "instruction1\r"; exp_continue} => 匹配到accest1,发送instruction1 指令并且\r 回车执行"accept2" {send "instruction2\r"; exp_continue} => 匹配到accest2,发送instruction2 指令并且\r 回车执行,exp_continue表示循环匹配"accept3" {send "\r"; exp_continue} => 匹配到accept3表示直接回车执行"accept4" {send "$name\r"} => 匹配到accept4,将变量值作为指令,并且回车执行
}expect eof =>结束这个进程
二、SSH批量修改主机密码脚本实现
shell脚本使用expect自动化交互工具完成密码修改:
cat change_password.sh
#!/bin/bash
host_list=(127.0.0.1 127.0.0.2)
logfile=/tmp/change_password.log
old_pawd="password1"
new_pawd="password2"function change_password(){ #case函数匹配条件中可以使用某些简单的正则匹配字符(需测试),特殊字符使用\转义case ${status_info} in*"Connection refused"*)echo "ssh端口不通,请检查ssh服务是否开启!";;*)echo "ssh端口访问正常,开始执行expect自动化交互操作!"/usr/bin/expect ./use_ssh.sh ${host} ${old_pawd} ${new_pawd}esac}for host in ${host_list[@]}
do# "< /dev/null"代表标准输入为空,作用关闭终端窗口$( telnet ${host} 22 < /dev/null > ${logfile} 2>&1 )status_info=$( cat ${logfile} )change_password
done
expect自动化交互脚本
#!/usr/bin/expect
#set timeout 30#定义变量
set HostIP [lindex $argv 0]
set old_pawd [lindex $argv 1]
set new_pawd [lindex $argv 2]
set Command "passwd root"# puts "旧密码为:${old_pawd},新的为:${new_pawd}";#执行ssh命令,-o参数忽略第一次的yes/no选择
spawn ssh -l root ${HostIP} -o StrictHostKeyChecking=no expect {# 第一次连接输入密码"Password:" { send "${old_pawd}\r";exp_continue }# 输入密码错误,会再次提示"*Password:*" { send_user " 主机${HostIP}:登录密码错误,请检查登录密码!";expect eofexit 2}# 登陆成功,命令行界面,修改密码"#" {send "${Command}\r";}"Enter new password:" {send_user "输入的新密码为:${new_pawd}"send "${new_pawd}\r";}"Re-type new password:" {send_user "再次输入新密码:${new_pawd}"send "${new_pawd}\r";}"passwd: password updated successfully" {send_user " 主机${HostIP}:修改密码成功!";send "exit\r"}
}sleep 1
send "exit\r"expect eofexit
相关文章:
“Linux免除系统交互操作方法、expect自动化交互工具” 及 “SSH批量修改主机密码脚本”
一、Linux系统免除交互操作方法 1、EOF多文本输入 案例:为机器磁盘进行分区并实现挂载,免交互式操作,如何实现? #!/bin/bash fdisk /dev/sdb <<EOF n p 1 wq EOFmkfs.xfs /dev/sdb1 && mkdir -p /data &&am…...

三相异步电机动态数学模型及矢量控制仿真
三相异步电机动态数学模型及矢量控制仿真 本文带你一步步推倒三相异步电机动态数学模型,按基于转子磁链定向的矢量控制进行 matlab 仿真,实现较好的控制效果。 1、异步电机三相方程 2、坐标变换 3、磁链3/2变换推导 4、两相静止坐标系下的方程 5、…...
HTML5 新增表单标签
HTML5为表单添加了一些新的语义化标签,可以更好地描述表单内容和功能。下面是新增的表单标签及其功能: <datalist>标签:用于定义一个选项列表,供用户选择或输入。 <output>标签:用于显示表单提交后的结果…...

【版本控制】Git(学习笔记)
一、Git工作流程图 clone(克隆): 从远程仓库中克隆代码到本地仓库checkout (检出):从本地仓库中检出一个仓库分支然后进行修订add(添加): 在提交前先将代码提交到暂存区commit(提交&…...
C语言,求一个整数的全部素数因子
#include <stdio.h> int prime(int x)//一旦x被2到x-1的数整除,就返回0,一直不被整除,才返回1。 {int j 0;for (j 2; j < x; j){if (x % j 0){return 0;}}return 1; } int main() {int n 0;scanf("%d", &n);int i…...

Jenkins更换主目录
Jenkins储存所有的数据文件在这个目录下. 你可以通过以下几种方式更改: 使用你Web容器的管理工具设置JENKINS_HOME环境参数.在启动Web容器之前设置JENKINS_HOME环境变量.(不推荐)更改Jenkins.war(或者在展开的Web容器)内的web.xml配置文件. 这个值在Jenkins运行时…...

迅为RK3588开发板使用RKNN-Toolkit-lite2运行测试程序
1 首先也需要部署运行环境,将库文件放入 RK3588 开发板上,我们将网盘资料“iTOP-3588 开发 板 \02_ 【 iTOP-RK3588 开 发 板 】 开 发 资 料 \12_NPU 使 用 配 套 资 料 \05_Linux_librknn_api\librknn_api\aarch64”路径下的文件通过U盘拷贝到开发板的…...
1990-2023:RPA的变革之路
01 第一阶段:初级助手与UI测试 阶段简介: RPA开始于简单的数据导入和用户界面测试 在最早期的阶段中,RPA又可比作虚拟化助手,能够助力人力实施的基本数据导入,然而辅助作业时尚需人为操作。RPA 的故事始于用户界面 (U…...
SQL 语法
SQL 语法规则 SQL语句总是以关键字开始,如SELECT、INSERT、UPDATE、DELETE、DROP、CREATE。SQL语句以分号结尾。SQL不区分大小写,意味着update与UPDATE相同。 数据库表 数据库通常包含一个或多个表。每个表都用一个名称标识(例如,…...

吃鸡达人必备神器,提升战斗力享受顶级游戏干货!
大家好!今天我为大家介绍一款专为吃鸡玩家打造的神器——吃鸡盒子。无论您是新手还是老玩家,吃鸡盒子都能帮助您提升游戏的战斗力,分享顶级游戏作战干货,并且还能方便吃鸡作图、查询库存和保护账号安全。 让我们先来说说提升战斗力…...

PyTorch 深度学习之循环神经网络(基础篇)Basic RNN(十一)
0.Revision: DNN dense 重义层 全连接 RNN处理带有序列的数据 1. What is RNNs? linear layer 1.1 What is RNN? tanh (-1, 1) 1.2 RNN Cell in PyTorch 1.3 How to use RNNCell *先把维度搞清楚 多了一个序列的维度 2. How to use RNN 2.1 How to use RNN - numLayers…...

存在已打开的MicrosoftEdge浏览器,无法执行安装
存在问题:UiBot Creator 安装Chrome扩展时,存在已打开的MicrosoftEdge浏览器,无法执行安装。 解决办法: 打开MicrosoftEdge浏览器,然后在浏览器页面右上角打开“…”图标 第二步,打开“…”图标之后&…...

Unity第一人称移动和观察
创建一个可以自由移动的第一人称视角 人物通过WSAD进行前后左右移动,通过鼠标右键进行旋转 Step1:创建一个Player玩家,在节点下加两个子物体,一个摄像头和一个Capsule充当身体 Step2:创建一个脚本挂载在Player节点下,再在这个Pl…...

【UBOOT】1-使用与烧写
一、uboot简介 1)uboot是一个裸机程序,比较复杂 2)最主要的作用是引导Linux内核启动; 初始化DDR; 因为Linux是运行在DDR里面的;而Linux镜像(zImage或uImagedtb)一般存放在SD EMM…...

竞赛 深度学习OCR中文识别 - opencv python
文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习OCR中文识别系统 ** 该项目较为新颖,适合作为竞赛课题方向,…...
XTU-OJ 1331-密码
题目描述 Eric喜欢使用数字1,2,3,4作为密码,而且他有个怪癖,相邻数字不能相同,且相差不能超过2。当然只用数字做密码,会比较弱,Eric想知道当长度为n时,这样的密码有多少种? 输入 第一行是一个整…...
【docker】ubuntu下安装
ubuntu下安装docker 卸载原生docker更新软件包安装依赖Docker官方GPG密钥添加软件来源仓库安装docker添加用户组运行docker安装工具重启dockerhelloworld 卸载原生docker $ apt-get remove docker docker-engine docker.io containerd runc更新软件包 apt-get update apt-get…...
Linux- 命名信号量和无名信号量的区别
命名信号量和无名信号量之间的区别主要在于它们的可见性、生命周期以及如何在进程或线程之间共享。根据这些特点,它们各自更适合不同的应用场景: 命名信号量: 可见性:命名信号量由一个与其关联的名称标识,通常在某种文…...

【C/C++】STL——深度剖析list容器
👻内容专栏: C/C编程 🐨本文概括:list的介绍与使用、深度剖析及模拟实现。 🐼本文作者: 阿四啊 🐸发布时间:2023.10.12 一、list的介绍与使用 1.1 list的介绍 cpluplus网站中有关…...
#力扣:136. 只出现一次的数字@FDDLC
136. 只出现一次的数字 - 力扣(LeetCode) 一、Java class Solution {public int singleNumber(int[] nums) {int ans 0;for(int num: nums) ans ^ num;return ans;} } 二、C class Solution { public:int singleNumber(vector<int>& nums…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...