返回顶部
首页 > 资讯 > 操作系统 >Linux Shell 自动交互功能实现
  • 379
分享到

Linux Shell 自动交互功能实现

LinuxShell自动交互 2022-08-08 12:08:34 379人浏览 八月长安
摘要

需求背景: 近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录操作,就会产生大量重复性操作,既不能带来

需求背景:

近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录操作,就会产生大量重复性操作,既不能带来有效学习能力提升,同时也会极大产生不确定性,引发工作效率下降,那么如何自动化完成某些操作呢,尤其是带有交互功能的步骤呢,例如需要输入账号密码?

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

Linux Shell 自动交互功能实现

Linux Shell 自动交互功能实现

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

Linux Shell 自动交互功能实现

上面我们学会了EOF 这个关键字,那么我们试试通过它来修改密码。脚本如下:

#!/bin/bash
 
cat << EOF| passwd 
新密码
新密码,与上述需一致
EOF
 
# or 不使用管道符
 
passwd << EOF
新密码
新密码,与上述需一致
EOF

实战结果,成功修改密码:

Linux Shell 自动交互功能实现

2. Expect 自动交互

需求案例 2

  新交付了一批机器,需要给每台机器分发文件,如何实现?

需求分析:

远程拷贝文件常用密令是scp 或者 rsync ,但是在给每台机器传输时需要若输入密码,有的机器可能还需要输入YES,录入机器指纹信息,如下:

Linux Shell 自动交互功能实现

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 ,如果没有安装,需要手动安装

# 检查是否安装了expect:
[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 自动交互功能实现

小试牛刀

在学习完以上两个方法,我们试着写一个脚本,结合上述两种方式,批量查看各机器目录挂载情况,并列举出来,参考脚本如下:

#!/bin/bash
 
ip="192.168.31.89"
username="root"
password="123456"
cmd=" df -PTh|grep ^/dev"
# 指定执行引擎
expect <<EOF
    set time 30
    spawn ssh $username@$ip  $cmd
    expect {
        "*yes/no" { send "yes\r"; exp_continue }
        "*password:" { send "$password\r" }
    }
    expect eof
EOF

以上两种方式就是日常在linux shell 脚本常用来做自动化部署,解决脚本执行过程参数交互问题,尤其expect 配合一些shell脚本执行,十分便捷。除了以上使用方式,在企业生产中,我们还会用到ansible 脚本,ansible是新出现的自动化运维工具,基于python开发,通过调用其模块,实现批量系统配置、批量程序部署、批量运行命令等功能,有兴趣的小伙伴可以试试学习下。

到此这篇关于Linux Shell 自动交互功能实现的文章就介绍到这了,更多相关Linux Shell 自动交互内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

--结束END--

本文标题: Linux Shell 自动交互功能实现

本文链接: https://lsjlt.com/news/33508.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linux Shell 自动交互功能实现
    需求背景: 近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录操作,就会产生大量重复性操作,既不能带来...
    99+
    2022-08-08
    LinuxShell自动交互
  • LinuxShell自动交互功能实现
    需求背景: 近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录操...
    99+
    2022-11-13
    Linux Shell 自动交互
  • Linux Shell交互式自动化运维程序
    Expect是Linux操作系统下的一个用来处理交互操作,系统默认是没有安装expect库,所以执行expect会提示找不到命令,需要手动安装,其它安装也比较简单,可以通过二进制源码包编译配置进行安装,也可以通过网络借助yum源来安装,yu...
    99+
    2023-06-05
  • javascript能实现交互功能吗
    随着互联网的发展,越来越多的网站和应用都需要实现交互功能,这些交互功能往往需要使用到JavaScript语言。虽然在Web开发领域中,JavaScript早已成为一个非常流行的编程语言,但是对于一些新手开发者或者没有接触过JavaScrip...
    99+
    2023-05-21
  • 怎么使用expect命令实现Shell自动化交互
    这篇文章将为大家详细讲解有关怎么使用expect命令实现Shell自动化交互,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。背景linux脚本中有很多场景是进行远程操作的,例如远程登录ssh、远程复制scp...
    99+
    2023-06-09
  • python之pexpect实现自动交互
    Pexpect 是 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广,可以用来实现与 ssh、ftp ...
    99+
    2023-01-31
    python pexpect
  • Shell之免交互的实现
    目录前言一、Here Document1.Here Document概述2.基本语法格式3.Here Documen免交互4.变量设定(支持变量替换)5.格式控制6.多行注释二、Expect1.Expect概述2.exp...
    99+
    2022-07-19
    Shell 免交互
  • Linux中怎么使用expect实现脚本自动交互
    这篇文章主要介绍“Linux中怎么使用expect实现脚本自动交互”,在日常操作中,相信很多人在Linux中怎么使用expect实现脚本自动交互问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux中怎么使...
    99+
    2023-06-27
  • linux自动化交互脚本expect详解
    一、介绍 expect脚本是Tcl脚本语言的拓展。用来实现自动的交互式任务,无需人为干预。在实际开发中,运行shell脚本有时候会输入linux密码或者是mysql密码等,而expect可以帮我们输入。 二、安装 e...
    99+
    2022-06-03
    linux expect自动化交互脚本 linux自动化交互脚本
  • linux如何自动化交互脚本expect
    这篇文章给大家分享的是有关linux如何自动化交互脚本expect的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、介绍expect脚本是Tcl脚本语言的拓展。用来实现自动的交互式任务,无需人为干预。在实际开发中...
    99+
    2023-06-07
  • shell脚本实现ssh自动登录功能分享
    文件名:ssh_auto_login #!/usr/bin/expect### ssh模拟登陆器## @author zhiyuan <hzyhouzhiyuan艾特gmail.com>##i...
    99+
    2022-06-04
    脚本 自动登录 功能
  • shell脚本怎么实现ssh自动登录功能
    本篇内容介绍了“shell脚本怎么实现ssh自动登录功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!文件名:ssh_auto_login代...
    99+
    2023-06-09
  • node.js中怎么实现前后台交互功能
    node.js中怎么实现前后台交互功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。执行过程为:(1)在浏览器地址栏输入网址,向node服务器...
    99+
    2024-04-02
  • Shell脚本之Expect免交互的实现
    Expext概述 Expect是建立在tcl基础上的一个工具,Expect是用来自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。有助于大规模的系统运维工作。在日常的运维与开发中,常常需要运城登录到服务器...
    99+
    2022-06-04
    Shell脚本 Expect免交互 Shell Expect免交互
  • 在Linux中如何通过expect工具实现脚本的自动交互
    这篇文章给大家介绍在Linux中如何通过expect工具实现脚本的自动交互,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。expect是一个自动化交互套件,是建立在tcl基础上的,能过通过脚本设置自动进行交互通信。1 安...
    99+
    2023-06-28
  • django如何实现ajax提交评论并自动刷新功能
    这篇文章将为大家详细讲解有关django如何实现ajax提交评论并自动刷新功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。js代码:<script> &nb...
    99+
    2024-04-02
  • SAP怎么实现自动触发内向交货单的功能
    本篇内容主要讲解“SAP怎么实现自动触发内向交货单的功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SAP怎么实现自动触发内向交货单的功能”吧!如下STO,是从公司代码SZSP转入CSAS,如...
    99+
    2023-06-05
  • js实现自动锁屏功能
    1.使用场景 有这么一个需求,开发了一套系统,当用户离开桌面或者一段时间不操作的话,需要把该系统所有打开页面锁定起来,就跟桌面锁屏一样,只能输入密码验证成功后,或者重新登录,才可以...
    99+
    2024-04-02
  • JavaWeb实现自动登录功能
    本文实例为大家分享了JavaWeb实现自动登录功能的具体代码,供大家参考,具体内容如下 自动登录是通过存储cookie值来实现的。 工程目录如下: login.jsp: <...
    99+
    2024-04-02
  • webpack自动打包功能实现
    目录一、了解webpack二、在项目中安装和配置webpack三、webpack的打包四、webpack的自动打包一、了解webpack 当前web开发面临的困境1.文件依赖关系错综...
    99+
    2023-02-09
    webpack自动打包 webpack打包
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作