Linux自动化交互脚本expect从安装到开发详解

 更新时间:2024年06月29日 09:04:08   作者:IT后浪  
运行shell脚本有时会提示输入密码,如何让脚本自动输入密码呢?这时使用expect,Expect是基于Tcl发展而来的,它不仅可以进行交互,还可以根据程序的提示模拟标准输入,实现自动化交互执行的功能,在排查expect脚本执行问题时,应关注脚本是如何被调用和执行的

在日常开发任务中,运行shell脚本有时候会提示输入密码的操作,如何让脚本自动输入密码呢?这时使用expect帮我们输入,Expect是基于Tcl发展而来的,它不仅可以进行交互,还可以根据程序的提示模拟标准输入,实现自动化交互执行的功能。

expect使用场景

文件传输

  • FTP/SFTP/SCP文件传输过程中,如果服务要求输入用户名、密码或接受安全警告等交互操作,expect可以帮助自动完成这些步骤。

SSH登录自动化

  • 当需要自动登录远程服务器并执行一系列命令时,expect可以模拟用户输入密码或通过密钥认证,并根据交互式提示继续执行。

sudo权限提升

  • 当需要以root或其他用户权限运行命令,而系统配置为每次使用sudo都需要输入密码时,可以通过expect预先输入密码并执行后续命令。

数据库操作

  • 在使用数据库管理系统(如MySQL, PostgreSQL等)的命令行客户端,在连接或执行敏感操作时需要输入密码验证,expect脚本能实现这一过程的自动化。

自动安装程序

  • 在安装软件包或运行配置脚本的过程中,有些可能包含有交互式的问答环节,expect可用来自动回答这些问题,使得安装或配置过程完全自动化。

系统监控任务

  • 在执行紧急维护或故障恢复时,可能涉及一系列复杂的手动交互流程,通过expect编写自动化脚本能够减少人为干预,提高效率和准确性。

网络设备管理

  • 对于路由器、交换机和其他网络设备,很多管理界面都是基于文本协议(如telnet或SSH),expect可以用于自动登录设备并执行配置更改等任务。

总之,任何需要在命令行环境中进行人工交互的任务,只要可以预测到交互的内容,都可以尝试使用expect来实现自动化处理。

安装expect

查看是否安装了expect

whereis expect

如果出现如下提示,说明未安装

expect:[root@test ~]#

安装expect

yum install -y expect

安装成功提示

再次执行whereis expect命令,如果出现如下提示,说明安装成功

expect: /usr/bin/expect /usr/share/man/man1/expect.1.gz

编写sudo提权脚本

以下是一个基本的expect脚本示例,它会自动为sudo命令提供密码。

脚本内容

#!/usr/bin/expect

# 设置超时时间(单位秒)
set timeout 10
# 设置你的密码变量
set password "your_password_here"
# 执行sudo命令,并监视其输出
spawn su root
# 当提示符出现时,发送密码
expect "*Password:"
send "$password\r"
# 交互模式,等待命令执行完成
interact

脚本解释

  • spawn su root 是启动一个新的进程来运行su命令。
  • expect "*Password:" 等待包含"Password:"的提示符出现。
  • send "$password\r" 发送密码变量值,并附带回车符以确认输入。
  • interact 可以用来继续监控和处理命令行中的其他交互。

常用命令说明

命令

说明

set timeout n

设置expect语句超时时间为n秒。-1为永不超时

set name value

设置变量名为name,其值为value

set name [lindex $argv 0]

设置变量名为name,其值为 传入 expect脚本的第一个 参数 。第一个参数的索引值为0,第二个为1,依次类推

spawn

启动新的进程,执行命令或者指定程序

expect

接收进程中返回的信息, 如果匹配成功(有大小写区分), 就执行expect后的动作

send

向进程发送字符串

send_user

用来打印信息,相当于shell中的echo

exp_continue

执行完expect后的动作后,使expect不退出,继续往下匹配

expect eof

不允许用户交互,直接退出(这个用的会比interact多)

interact

允许用户交互

常见错误

spawn: command not found

执行编写好的expect脚本时,报以下错误信息,提示spawn: command not found,但通过rpm -qa | grep expect命令查看到expect软件包的确安装了,但是为什么仍然提示spawn命令找不到呢?

问题排查

重新排查了报错的脚本,发现脚本的首行是#!/bin/sh ,把他改成#!/usr/bin/expect就可以了。

错误的脚本如下:

#!/bin/sh

# 设置超时时间(单位秒)
set timeout 10
# 设置你的密码变量
set password "your_password_here"
# 执行sudo命令,并监视其输出
spawn su root
# 当提示符出现时,发送密码
expect "*Password:"
send "$password\r"
# 交互模式,等待命令执行完成
interact

问题分析

在编写expect脚本时,在文件的首行需要以#!/usr/bin/expect作为shebang(即解释器指示符),目的是告诉操作系统应当使用expect解释器来执行该脚本内容。

然而,如果在执行该脚本时,误用了shell(如sh、bash等)命令进行解析和执行,由于shell并不具备解析和执行expect语句的能力,因此会导致脚本无法正确运行或出现错误。

所以,在排查expect脚本执行问题时,若确认脚本内部逻辑无误,但依然无法正常工作,应关注脚本是如何被调用和执行的。如果发现脚本是通过非预期的方式执行,那么这就可能是问题的根源所在。

总结

到此这篇关于Linux自动化交互脚本expect从安装到开发详解的文章就介绍到这了,更多相关Linux自动化交互脚本expect内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux中vi编辑器的练习心得

    linux中vi编辑器的练习心得

    给大家分享一下在linux中练习vi编辑器的心得以及需要避免的一些坑。
    2017-11-11
  • centos7使用supervisor的详细教程

    centos7使用supervisor的详细教程

    这篇文章主要为大家介绍了centos7使用supervisor的详细教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 在Linux系统上创建软连接和硬连接的方法

    在Linux系统上创建软连接和硬连接的方法

    这篇文章主要介绍了在Linux系统上创建软连接和硬连接的方法,通过执行 man ln 命令,可以看到这是在文件之间建立链接,而没有提及是软链接或硬链接,文中通过代码和图文介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Linux中配置DNS正向解析

    Linux中配置DNS正向解析

    本文介绍了如何配置DNS正向解析,包括编辑named.conf文件、abc.zone文件和启动服务,配置中需注意文件格式和权限设置,实验通过配置DNS服务器实现域名到IP的解析,这对网络管理和维护非常重要,关闭防火墙和设置SELinux为disabled是实验的基础环境配置,通过实验
    2024-09-09
  • Centos Linux7设置静态IP的实例

    Centos Linux7设置静态IP的实例

    这篇文章主要介绍了Centos Linux7设置静态IP的实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • VMnet8模式虚拟机配置全过程

    VMnet8模式虚拟机配置全过程

    文章介绍了如何配置虚拟网关以实现不同网络之间的互连,包括前置知识网关的基本概念、虚拟机配置虚拟网关的步骤以及主机配置虚拟网关的方法
    2024-11-11
  • linux下通过rsync+inotify 实现数据实时备份(远程容灾备份系统)

    linux下通过rsync+inotify 实现数据实时备份(远程容灾备份系统)

    linux下为了数据安全或者网站同步镜像,不得不考虑一些实时备份的问题,这篇linux下通过rsync+inotify 实现数据实时备份配置过程记录下来,防止遗忘
    2013-09-09
  • centos8使用Apache httpd2.4.37安装web服务器的步骤详解

    centos8使用Apache httpd2.4.37安装web服务器的步骤详解

    这篇文章主要介绍了centos8使用Apache httpd2.4.37安装web服务器的步骤详解,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 在centos 7中安装配置k8s集群的步骤详解

    在centos 7中安装配置k8s集群的步骤详解

    这篇文章主要给大家介绍了关于在centos 7中安装配置k8s集群的步骤,文中通过示例代码将步骤介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习下吧。
    2017-09-09
  • Linux文件操作新手指南之关于install命令的用法

    Linux文件操作新手指南之关于install命令的用法

    这篇文章主要介绍了Linux文件操作新手指南之关于install命令的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02

最新评论