Shell编程--expect

Expect

  • 用法
  • expect的安装
  • 实战——非交互式ssh连接
    • 案例1:普通操作
    • 案例2:设置变量与进行传参的方式
    • 案例3:进行批量推送公钥实现免密连接,ping通一个ip地址连接一个ip

  • 实现批量修改密码,批量推送ssh的公钥,进行远程ssh连接,任何批量操作的基本都能处理。

  • 通过expect可以实现将交互式的命令变为非交互式执行,不需要人为干预(手动输入)

  • 是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预

  • 在实际工作中我们运行命令、脚本或程序时,都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行,而利用 expect 则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行,这就是 expect

  • 如果能够在工作中熟练的使用Shell脚本就可以很大程度的提高工作效率,那么再搭配上expect这个时候很多工作都可以实现自动化进行。

说白了 expect 就是一套用来实现自动交互功能的软件

用法

1)定义expect脚本执行的shell:#!/usr/bin/expect --类似于#!/bin/bash
2)set timeout 30:设置超时时间30s
3)spawn:执行expect之后后执行的内部命令开启一个会话,用来执行shell的交互命令
4)expect相当于捕捉,判断输出结果是否包含某项字符串(相当于捕捉返回的结果),没有则会断开,否则等待一段时间后返回,等待通过timeout设置
5)send:执行交互动作,将交互要执行的命令进行发送给交互指令,命令字符串结尾要加上“\r”,相当于回车
6)interact:执行完后保持交互状态,需要等待手动退出交互状态,如果不加这一项,交互完成会自动退出
7)exp_continue:继续执行接下来的操作

expect的安装

[root@localhost ~] yum -y install expect

实战——非交互式ssh连接

案例1:普通操作

[root@localhost ~]# vim ex.sh
#!/usr/bin/expect
spawn ssh root@192.168.17.137
​
expect {"yes/no" {  send "yes\r"; exp_continue }"password:" { send "1\r" };
}
interact
[root@localhost ~]# expect ex.sh
spawn ssh root@192.168.17.137
root@192.168.17.137's password:
Last login: Mon Jul 17 10:25:24 2023 from 192.168.17.128
[root@localhost ~]# ip a|grep inetinet 127.0.0.1/8 scope host loinet6 ::1/128 scope hostinet 192.168.17.137/24 brd 192.168.17.255 scope global noprefixroute ens33inet6 fe80::2022:2258:5fcc:dd1f/64 scope link noprefixroute
​
//如果添加interact参数将会等待我们手动交互进行退出。如果不加interact参数在登录成功之后会立刻退出。

案例2:设置变量与进行传参的方式

注意:expect环境中设置变量要用set!它识别不了bash方式定义的变量

[root@localhost ~]# vim expect01.sh
#!/usr/bin/expect
set user root
set pass 1
set ip [ lindex $argv 0 ]  
//expect固定写法,从0开始,第一个位置参数,相当于shell中的$1
​
set timeout 10
​
spawn ssh $user@$ip
expect {"yes/no" {  send "yes\r"; exp_continue }"password:" { send "$pass\r" };
}
interact
​
[root@localhost ~]# expect ex01.sh 192.168.17.137
spawn ssh root@192.168.17.137
root@192.168.17.137's password:
Last login: Mon Jul 17 10:37:55 2023 from 192.168.17.128
[root@localhost ~]# exit
登出
Connection to 192.168.17.137 closed.

如果想登录成功后,自动结束交互模式(也就是expect),可以采用下面方式:

#!/usr/bin/expect
set user root
set pass 1
set ip [ lindex $argv 0 ]
//expect固定写法,从0开始,第一个位置参数,相当于shell中的$1
set timeout 10
​
spawn ssh $user@$ip
expect {"yes/no" {  send "yes\r"; exp_continue }"password:" { send "$pass\r" };send "exit\r"
}
​
expect eof  //直接退出expect模式[root@localhost ~]# expect ex01.sh 192.168.17.137
spawn ssh root@192.168.17.137
root@192.168.17.137's password:
Last login: Mon Jul 17 10:46:07 2023 from 192.168.17.128[root@localhost ~]# ip a|grep inetinet 127.0.0.1/8 scope host loinet6 ::1/128 scope hostinet 192.168.17.128/24 brd 192.168.17.255 scope global ens33

案例3:进行批量推送公钥实现免密连接,ping通一个ip地址连接一个ip

[root@localhost script]# vim getip_push.sh
#!/usr/bin/bash
pass=1
//判断expect命令是否安装
rpm -qa expect &> /dev/null
if [ $? -ne 0 ];thenyum install -y expect
fi
​
//判断主机下面是否生成秘钥,如果没有生成秘钥
if [ ! -f ~/.ssh/id_rsa ];thenssh-keygen -P "" -f ~/.ssh/id_rsa
fi
​
//循环执行获取up状态的ip地址。
for i in {2..254}
do{ip=192.168.17.$iping -c1 -w1 $ip &> /dev/nullif [ $? -eq 0 ];thenecho "$ip" >> up_ip.txtset timeout 10/usr/bin/expect <<-EOF   //shell脚本中调用expect命令spawn ssh-copy-id $ipexpect {"yes/no" { send "yes\r"; exp_continue }"password:" { send "$pass\r" };}expect eof
EOFfi      } &
wait
done
echo "finish..."[root@localhost script]# chmod +x getip_push.sh 
[root@localhost script]# expect getip_push.sh
​
//测试....

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝宝洗衣机买几公斤?婴儿专用洗衣机测评

由于幼龄时期的宝宝的皮肤比较娇嫩&#xff0c;很容易受到伤害。所以小宝宝的衣服一般都是棉质的&#xff0c;很柔软&#xff0c;很亲肤的&#xff0c;为的就是保护宝贝们娇嫩的肌肤。而宝宝们在日常中更换衣物会相对频繁&#xff0c;换的衣物也必须及时清洗晾晒&#xff0c;以…

ConcurrentHashMap源码解析

1.介绍一下ConcurrentHashMap? concurrentHashMap是一个线程安全的集合&#xff0c;在HashMap基础上进行了优化&#xff0c;在JDK1.7中&#xff0c;ConcurrentHashMap由一个个的Segment组成&#xff0c;每个Segment就是一个类似于HashMap的结构&#xff0c;每个Segement可以单…

网络文件共享服务 FTP

一、存储类型 存储类型分为三种 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#xff0c;管理也是你来管理&#xff09; 网络附加存储&#xff1a;Network…

model introduction

文章目录 前言一、传统机器学习方法1、基于规则的模型2、基于概率的模型3、基于几何学的模型4、基于统计的模型 二、深度学习方法1、Feed-Forward Neural Networks&#xff08;前馈神经网络&#xff09;2. RNN-Based Models&#xff08;基于循环神经网络的模型&#xff09;3. C…

日志配置(OpenFeign)

日志级别 NONE&#xff1a; 不记录任何日志&#xff08;默认值&#xff09;BASIC&#xff1a;仅记录请求方法、URL、应答状态码、执行时间HEADERS: 在BASIC的基础上&#xff0c;记录请求和应答的headerFULL: 记录请求和应答的header、body、元数据 修改级别 配置类配置文件 …

精心挑选免费好用的api,推荐给大家

企业基本信息&#xff1a;通过公司名称/公司ID/注册号或社会统一信用代码获取企业基本信息&#xff0c;企业基本信息包括公司名称或ID、类型、成立日期、经营状态、注册资本、法人、工商注册号、统一社会信用代码、组织机构代码、纳税人识别号等字段信息。 AI绘画-Stable Diff…

当代大学生是怎么被废掉的?

中式教育以应试为核心&#xff0c;强调知识的灌输和学生被动接受。随着社会的发展&#xff0c;中式教育的短板逐渐显现&#xff0c;创新能力的缺乏、对记忆的过度依赖、忽视个体差异等问题日益突出。 建议所有大学生都能去看看《上海交通大学生存手册》&#xff0c;它道出了中…

Flutter首页框架搭建

1.下载flutter 2. 安装android 3.配置环境变量 关于环境搭建部分&#xff0c;哪天写一下&#xff0c;日志杂乱无章。 打开android studio 新建项目&#xff0c;选择flutter 新建文件夹创建 navigator和pages 文件夹下分别创建文件&#xff0c;tab_navigator.dart&#xff…

【Android Gradle 插件】Android 依赖管理 ① ( 依赖库匹配 | 依赖库查找顺序及路径 | Gradle 资源库 )

一、依赖库匹配 依赖库匹配 : 依赖库由三部分组成 依赖库分组依赖库名称依赖库版本号 只有三者都对上 , 依赖库才能匹配上 , 如 dependencies {implementation androidx.appcompat:appcompat:1.3.1 }依赖库分组为 androidx.appcompat , 依赖库名称为 appcompat , 依赖库版本…

云厂商不能花钱当老六

1. 愤怒的国产“三大废物” 12月份的时候&#xff0c;某中立市场分析公司发表了它们的行业分析“刀乐象现”。透过各种浮躁的“领导、远见”之后&#xff0c;大致意思就是&#xff1a; A是老大&#xff1b;我没意见&#xff1b;A是老二&#xff1b;我也没意见。咕咕咕咯咯咯哒是…

深入理解 PyTorch 激活函数:从基础到高效实用技巧(3)

目录 torch.nn.functional激活层详解 logsigmoid 1. 函数用途 2. 参数详解 3. LogSigmoid函数的定义及数学解释 4. 使用示例 hardshrink 1. 函数用途 2. 参数详解 3. Hardshrink函数的定义及数学解释 4. 使用示例 tanhshrink 1. 函数用途 2. 参数详解 3. Tanhsh…

Spring Boot 中实现定时任务(quartz)功能实战

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

电脑锁屏时间怎么设置?跟着这篇教程轻松搞定

在现代社会&#xff0c;我们使用电脑的时间越来越长&#xff0c;为了保护个人隐私和确保信息安全&#xff0c;设置电脑锁屏时间成为一项重要的操作。可是电脑锁屏时间怎么设置呢&#xff1f;本文将介绍三种常见的方法&#xff0c;详细解释如何设置电脑的锁屏时间&#xff0c;以…

Framework定制-在JAVA核心库中移植Android Log

在java核心库中&#xff0c;由于无法导入android的包&#xff0c;要想使用Log&#xff0c;最粗暴的方式就是用反射调用&#xff0c;还有一种方式就是移植Android的Log到java核心库中。 具体实现如下&#xff1a; 创建JLog.java aosp/libcore/ojluni/src/main/java/java/lang…

openssl3.2 - EVP_MD_fetch算法名称字符串(参数2)的有效值列表

文章目录 openssl3.2 - EVP_MD_fetch算法名称字符串(参数2)的有效值列表概述笔记注释版的摘要算法名称列表END openssl3.2 - EVP_MD_fetch算法名称字符串(参数2)的有效值列表 概述 使用摘要算法时, 官方demo都是使用EVP_MD_fetch(), API参数2要指定算法名称字符串. 如下: in…

MySQL 常用字符串函数 SUBSTRING_INDEX、SUBSTRING、LOCATE 和 LENGTH

在 MySQL 中&#xff0c;SUBSTRING_INDEX、SUBSTRING、LOCATE 和 LENGTH 是字符串处理的一些常用函数。下面是它们的基本用法&#xff1a; SUBSTRING_INDEX SUBSTRING_INDEX(str, delim, count) 用于返回字符串 str 中由分隔符 delim 分隔的子字符串。count 参数指定要返回的…

TDengine 如何进行数据建模

小 T 导读&#xff1a;在使用 TDengine 的时候&#xff0c;通过官网的技术文档可以学习到建库&#xff08;database&#xff09;、建表&#xff08;table&#xff09;的各种 SQL 语句&#xff0c;但是一旦要跟自己的具体业务场景结合&#xff0c;经验不足的朋友可能会不知道到底…

指针及其应用

1.定义 指针&#xff1a;也是一个变量&#xff0c;存放所指变量的地址&#xff0c;根据变量定义的不同&#xff0c;指针指向的类型也不同 注意&#xff1a;*是与前面类型一体的 int main(void) {int* p; //等价于int *p;//为了区分变量&#xff0c;C语言中一般将*放置于变量…

国产开源数据库进入生态发展期

作为基础软件“三驾马车”之一&#xff0c;数据库是支撑信息系统安全稳定运行的重要保障。记者从日前在京举行的openGauss Summit 2023获悉&#xff0c;2023年国产数据库openGauss系新增市场份额达21.9%&#xff0c;标志着openGauss已跨越生态拐点&#xff0c;这对于保障数据安…

.NET 8.0 发布到 IIS

如何在IIS&#xff08;Internet信息服务&#xff09;上发布ASP.NET Core 8&#xff1f; 在本文中&#xff0c;我假设您的 Windows Server IIS 上已经有一个应用程序池。 按照步骤了解在 IIS 环境下发布 ASP.NET Core 8 应用程序的技巧。 您需要设置代码以支持 IIS 并将项目配…