Shell脚本:expect脚本免交互

news2024/11/8 4:53:42

Shell脚本:expect脚本免交互

expect脚本免交互

  • 一、免交互基本概述:
    • 1.交互与免交互的区别:
    • 2.格式:
    • 3.通过read实现免交互:
    • 4.通过cat实现查看和重定向:
    • 5.变量替换:
  • 二、expect安装:
    • 1.概述:
    • 2.作用:
    • 3.expect基本命令:
    • 4.实例:
    • 5.扩展:

一、免交互基本概述:

1.交互与免交互的区别:

(1)交互:人工发出指令控制程序的运行,程序收到人工相应指令后,做出相应的反应。

(2)免交互:程序按编写好的运行方式,进行指定指令操作,在这个过程中,不需要人工操作,自动化完成。

2.格式:

(1)基本格式:

命令 <<标记 例:  wc -l<<wang
>               >1
>               >2
>               >wang
标记             2

(2)总结:

1.标记可以使用任意字符,但必须是合法字符(EOF)

2.结尾的标记一定要顶格写,前面不能有任何字符

3.结尾后也不能有任何字符,包括空格

4.开头标记前后空格会被忽略

5.开头和结尾标记必须一致

3.通过read实现免交互:

[root@test1 opt]# read i <<EOF
> wang,bkpp
> EOF
[root@test1 opt]# echo $i
wang,bkpp

4.通过cat实现查看和重定向:

1.[root@test1 opt]# cat <<EOF #查看
> billkin
> ppkritt
> EOF
billkin
ppkritt
2.[root@test1 opt]# cat <<EOF>wen.txt #重定向
> chanyeol
> baekhyun
> EOF
[root@test1 opt]# cat wen.txt 
chanyeol
baekhyun

5.变量替换:

(1)变量替换:

[root@test1 opt]# vim chen.sh
file="chen.sh"
i="the best luck"
cat > $file <<EOF
i like $i
EOF
[root@test1 opt]# sh chen.sh 
[root@test1 opt]# cat chen.sh 
i like the best luck

(2)整体替换:

[root@test1 opt]# vim chen.sh
var="bkpp is real"
myvar=$(cat <<EOF
the summer in pruket
$var
EOF
)
echo $myvar
[root@test1 opt]# sh chen.sh 
the summer in pruket bkpp is real

(3)关闭免交互:

[root@test1 opt]# vim wang.sh
var="GREAT!i am going to school!"
myvar=$(cat <<'EOF'
today is monday
$var
EOF
)
echo $myvar
[root@test1 opt]# sh wang.sh 
today is monday $var

在这里插入图片描述

(4)补充:

1.[root@test1 opt]# vim kai.sh #去除行首的tab字符,但是不能去除空格
cat <<-'EOF'
        kokopop
 power
EOF
[root@test1 opt]# sh kai.sh 
kokopop
 power
2.[root@test1 opt]# vim kai.sh #多行注释
:<<EOF
        kokopop
 power
EOF
[root@test1 opt]# sh kai.sh 

二、expect安装:

1.概述:

(1)建立在tcl之上的一个工具

(2)用于进行自动化控制和测试

(3)解决shell脚本中交互相关的问题

2.作用:

(1)判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回。

(2)只能捕捉由spawn启动的进程的输出。

(3)用于接收命令执行后的输出,然后和期望的字符串匹配。

3.expect基本命令:

(1)send(设置超时时间,指定变量):向进程发送字符串,用于模拟用户的输入:该命令不能自动回车换行,一般要加\r(回车) 或者\n

(2)spawn:用于捕捉关键词,后面常跟一个linux执行命令。

(3)expect:用于判断上层捕捉输出的结果是否有指定字符,有则立即返回,没有则默认等待10s。

(4)exp_continue命令:expect多分支判断时使用。

(5)set命令:可用于设置变量、设置expect超时时间,默认是10s。

(6)结束符: expect eof 结束并返回原来环境,原来主机。interact 结束但是不会返回原来的地方,保持当前状态,当前主机。

4.实例:

(1)用免交互的方式给用户设置密码。

[root@test1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5

spawn passwd lisi

expect "New passwd:"
send "123456\r"
expect "Retype new passwd:"
send "123456\r"

expect eof
[root@test1 opt]# chmod 777 passwd.sh 
[root@test1 opt]# ./passwd.sh

在这里插入图片描述

(2)用传参方式实现免交互登录:

![10](C:\Users\yuyong\Desktop\笔记\图\10.png)[root@test1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5

set username [lindex $argv 0]
set password [lindex $argv 1]

spawn su - $username

expect "Password:"
send "$password\r"
expect "*]$"
send_user "ok"
expect eof

在这里插入图片描述

(3)用嵌入模式实现免交互:

[root@test1 opt]# vim passwd.sh 
#!/bin/bash
user=$1
password=$2
useradd $1
/usr/bin/expect <<-EOF
            
spawn passwd $user
            
expect "新的 密码:"
send "${password}\r"
expect "重新输入新的 密码:"
send "${password}\r"
expect eof
EOF
[root@test1 opt]# chmod 777 passwd.sh 
[root@test1 opt]# ./passwd.sh wang 1233456 
useradd:用户“wang”已存在
spawn passwd wang
更改用户 wang 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

(4)用ssh实现免交互:

[root@test1 opt]# vim ssh.sh 
#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh $hostname
expect {

     "Connection refused" {send_user "ssh访问被拒绝\n"}
     "No route to host" {send_user "主机名/IP地址有误\n"}
     "yes/no" {send "yes\n";exp_continue}
     "password" {send "$password\n"}
}
interact

在这里插入图片描述

5.扩展:

(1)监控脚本写一个函数库,用定时任务调用,每月1号执行:

[root@test1 opt]# vim hanshu.sh #创建函数库
fx () {
df -h | awk -F "[ ,%]+" 'NR>1 {if($5>20){print $1"警告!"}}'
}
[root@test1 opt]# vim wang.sh #调用函数
. /opt/hanshu.sh
a=`fx`
echo $a
[root@test1 opt]# crontab -e#创建定时任务
0 0 1 * * /opt/wang.sh

在这里插入图片描述

(2)在实现ssh免交互登录的基础上,使它在密码出错的情况下,也可以免交互自动完成:

[root@test1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set ip       [lindex $argv 1]
set password [lindex $argv 2]
            
spawn ssh $hostname@$ip
expect {    
            
     "connection refused" {send_user "ssh访问被拒绝\n"exit}
     "No route to host" {send_user "主机名/ip地址有误\n"exit}
     "yes/no" {send "yes\n";exp_continue}
     "password" {send "$password\n"}
     "Permission denied, please try again."
    
}   
    
interact
[root@test1 opt]# chmod 777 passwd.sh
[root@test1 opt]# ./passwd.sh root 192.168.174.13 123

在这里插入图片描述

(3)免交互实现fdisk的磁盘分区,格式化,挂载:

[root@test1 opt]# vim fdisk.sh

#!/bin/bash
/usr/bin/expect <<-EOF
set timeout 5
spawn fdisk /dev/sdb
expect {
 
    "命令(输入 m 获取帮助):" { send "n\n";exp_continue}
    "Select (default p): " {send "p\n";exp_continue}
    "分区号 (1-4,默认 1):" {send "\n";exp_continue}
    "起始 扇区 (2048-41943039,默认为 2048):" {send "\n";exp_continue}
    "Last 扇区*" {send "+10G\nw\n";exp_continue}    
expect eof
}
EOF

mkfs.xfs -f /dev/sdb1
mkdir /data
mount /dev/sdb1 /data
[root@test1 opt]# chmod 777 fdisk.sh 
[root@test1 opt]# ./fdisk.sh

在这里插入图片描述

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

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

相关文章

Docker Registry部署

之前执行 docker pull的命令都是从 docker hub上拉取的&#xff0c;是docker 公共仓库&#xff0c;如果在公司中使用docker&#xff0c;我们不可能把自己的镜像上传到公共仓库&#xff0c;这个时候就需要一个自己的仓库&#xff08;私有仓库&#xff09;&#xff0c;在局域网之…

usb 驱动

usb 驱动 usb 的基本概念 这个忽略&#xff0c; 基本上usb 是啥都知道 usb 的拓扑结构 usb 是一种主从结构的系统 usb主机由usb主控之器&#xff08;Host Controller)和根集线器&#xff08;Root Hub&#xff09; 构成 usb 主控制器&#xff1a; 主要负责数据处理(就是我…

微信怎么批量自动添加好友?

如何批量加客户资源到微信&#xff0c;怎么加微信好友&#xff0c;这个基本上熟悉的人都会知道。 实际上&#xff0c;你知道所有添加微信好友的方式吗&#xff1f;或者说&#xff0c;你知道如何批量加客户微信吗&#xff1f; 比如说在一定时间内&#xff0c;把你所有的客户资…

AIGC文本生成智能应用(ChatGPT)提示工程师技巧

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来看一下AIGC文本生成智能提示工程师技巧。 当你在使用类似于ChatGPT这样的AIGC文本生成智能应用时&#xff0c;有没有想过&#xff0c;你所问的问题中的每一个词语对AIGC文本生成智能应用给你的回答的好…

记忆的助记器|如何使用联想记忆法

联想记忆法&#xff0c;也被称为记忆宫殿技术&#xff0c;已经使用了数千年&#xff0c;其记录可以追溯到古罗马和希腊。虽然现代第二大脑工具抢走了它的一些人气&#xff0c;但联想记忆法仍然是最有效的记忆方法之一。下面是你为什么需要在你的知识管理系统中使用它。 什么是…

比较快捷的设置第三方app 有系统权限和签名

1. app 里面添加 android:sharedUserId"android.uid.system" 2.编译出app.apk ,拷贝到源码目录 里面有很多签名文件 build\target\product\security 3. 拷贝签名工具到这个目录 签名工具原目录 out/host/linux-x86/framework/signapk.jar 4.拷贝需要的库文件到这…

Retry重试机制(五十)

当新的世界出现&#xff0c;请立即向他奔去 上一章简单介绍了Melody 监控(四十九), 如果没有看过,请观看上一章 本章节文章参考: https://juejin.cn/post/7234107489390116925 https://blog.csdn.net/hongyuan19/article/details/118995696 一. 重试 一.一 什么是重试 重…

身份证信息查看 案例

7-14位&#xff1a;出生年、月、日 17位&#xff1a;性别&#xff08;奇数男性、偶数女性&#xff09; 人物信息为&#xff1a;出生年月日&#xff1a;XXXX年X月X日 性别为&#xff1a;男/女 /** Copyright (c) 2017, 2023, zxy.cn All rights reserved.**/ package cn.str…

做了大半年软测,上班接触不到技术性的东西,是在浪费时间吗?

最近接到粉丝私信&#xff0c;苦恼目前的工作状态&#xff1a; 来这个公司大半年&#xff0c;现在主要做的是类似于淘宝的购物商城&#xff0c;以前也做应用系统什么的&#xff0c;可是感觉公司的软件测试岗位都是不着边的&#xff0c;因为做的都是功能测试&#xff0c;来了这么…

让你的文字更出色:编辑和校对的有效策略

要让你的文字更出色&#xff0c;掌握编辑和校对的有效策略至关重要。 以下是一些建议&#xff0c;帮助你提高编辑和校对水平&#xff0c;让你的作品更具吸引力和说服力。 1.分阶段进行编辑和校对 编辑和校对最好分阶段进行。先进行大局观的编辑&#xff0c;关注文章结构、逻辑…

Wildfly配置Datasources

配置Datasources前&#xff0c;需要先配置对应的JDBC驱动&#xff0c;配置方法&#xff0c;可以参考&#xff1a; Wildfly配置mysql8.0的JDBC驱动 之后&#xff0c;配置对应的Datasources。配置方法有两种&#xff0c;一种是通过管理后台配置&#xff0c;一种是通过手工修改配…

GLaDOS加速网络套餐edu教育网邮箱免费使用

产品介绍 教育优惠分享的好处&#xff0c;就是能一对一接触到网友的真实需求和最新的教育优惠产品&#xff0c;今天的这款也是网友投稿分享。 GLaDOS用于教育&#xff1a;建立开放思想和开放社会 GLaDOS Education可帮助学生&#xff0c;教师和学校找到他们掌握网络所需的工具…

【Python爬虫+数据分析】采集电商平台数据信息,并做可视化演示

文章目录 前言一、准备工作二、分析目标网站1.商品信息 三、编写爬虫程序五、总结 前言 随着电商平台的兴起&#xff0c;越来越多的人开始在网上购物。而对于电商平台来说&#xff0c;商品信息、价格、评论等数据是非常重要的。因此&#xff0c;抓取电商平台的商品信息、价格、…

虚拟机中使用Nginx + Keepalived 实现高可用 Web 负载均衡笔记

环境介绍 物理操作系统&#xff1a;Windows10 虚拟机软件&#xff1a;VMWare Workstation 16 Pro 虚拟操作系统统&#xff1a;CentOS7 Nginx&#xff1a;1.24.0 Keepalived&#xff1a;2.2.8 资源规划 在VMWare Worksattion中安装了2台CentOS7的虚拟机&#xff0c;桥接方式下…

ROS:常用可视化工具的使用

目录 一、日志输出工具——rqt_console二、绘制数据曲线——rqt_plot三、图像渲染工具——rqt_image_view四、图形界面总接口——rqt五、Rviz六、Gazebo 一、日志输出工具——rqt_console 启动海龟键盘控制节点&#xff0c;打开日志输出工具 roscorerosrun turtlesim turtles…

项目资源利用率是什么?如何提高?

任何项目经理的主要职责之一是跟踪项目资源&#xff0c;以便在需要时随时可用。为此&#xff0c;他们必须衡量资源利用率。通过计算资源利用率&#xff0c;项目经理和企业主可以更好地了解如何安排劳动力或设备等资源&#xff0c;以尽量降低成本&#xff0c;提高生产力&#xf…

Android关于图片资源管理的思考

作者&#xff1a;流浪汉kylin 一. 前言 当我们的项目比较大时&#xff0c;迭代的时间比较长的时候&#xff0c;我们往往都会对代码进行重构&#xff0c;会对代码进行一次系统的整合和规范的讨论&#xff0c;为了之后的开发能够避免写重复的代码&#xff0c;方便代码的维护和扩…

面向对象——权限修饰符、匿名内部类

package关键字 为什么要有包&#xff1f; 将字节码&#xff08;.class&#xff09;进行分类存放 包其实就是文件夹 包的定义及注意事项 定义包的格式 package 包名 多级包用.分割&#xff0c;如package com.heima里面的.就是分隔符 定义包的注意事项 package语句必须是程序的第…

扩容系统盘【centos-root】

问题描述&#xff1a; 磁盘空间有42G&#xff0c;但是系统盘只有6G。 问题抛出&#xff1a;&#xff08;P2原本只有7G&#xff0c;其中有30G错误分配到nvmeOn1p2了&#xff09;p2的30G空间怎么合理分配给系统盘? &#xff08;执行&#xff1a; sudo growpart /dev/nvme0n1 …

[学习笔记] [机器学习] 7. 集成学习(Bagging、随机森林、Boosting、GBDT)

视频链接数据集下载地址&#xff1a;无需下载 1. 集成学习算法简介 学习目标&#xff1a; 了解什么是集成学习知道机器学习中的两个核心任务了解集成学习中的 Boosting 和 Bagging 1.1 什么是集成学习 集成学习通过建立几个模型来解决单一预测问题。它的工作原理是生成多个分…