【Linux】命令expect使用详解

news2025/1/19 20:21:39

🦄 个人主页——🎐个人主页 🎐✨🍁

🪁🍁🪁🍁🪁🍁🪁🍁 感谢点赞和关注 ,每天进步一点点!加油!🪁🍁🪁🍁🪁🍁🪁🍁

目录

一、概述

1.1 命令简介

1.2 使用场景

1.3 expect命令安装

二、expect使用原理

2.1 命令原理介绍

三、expect使用语法

3.1 expect 启用选项

3.2 .expect命令参数

四、实战案例

4.1 登录远程服务器并在远程服务器上执行命令

4.2 本机免密实现

4.3 自动生成kerberos用户的keytab认证文件


一、概述


1.1 命令简介

expect 是由Don Libes基于Tcl(Tool Command Language )语言开发的,是一种脚本语言,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。

1.2 使用场景


(1)根据预定标准回答其问题,回答“是”、“否”或将控制权交还给您

(2)远程连接设备并执行自动化操作

(3)需要人机交互的地方,如果提前知道应该输入什么指令都可以使用expect 工具

1.3 expect命令安装

yum install expect  -y

二、expect使用原理


2.1 命令原理介绍


spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出

  • spawn命令

spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的、

  • send命令

send命令接收一个字符串参数,并将该参数发送到进程,这个过程类似模拟人类输入密码

  • interact命令

结合spawn、expect、send自动化的完成很多任务,interact命令可以在适当的时候进行任务的干预,比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令


三、expect使用语法


3.1 expect 启用选项


  • -c 执行脚本前先执行的命令,可多次使用
  • -d debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。
  • -D 启用交换调式器,可设一整数参数。
  • -f 从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。
  • -i 交互式输入命令,使用"exit"或"EOF"退出输入状态
  • -- 标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --
  • -v 显示expect版本信息

3.2 expect命令参数


  • spawn: 交互程序开始,执行后面的命令或程序。需要进入到expect环境才可以执行,不能直接在shell环境下直接执行
  • set timeout n : 设置超时时间,表示该脚本代码需在n秒钟内完成,如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住。如果设置为-1表示不会超时
  • set: 定义变量
  • $argv expect脚本可以接受bash的外部传参,可以使用[ lindex $argv n ]n为0表示第一个传参,为1表示第二个传参,以此类推
  • expect 从交互程序进程中指定接收信息, 如果匹配成功, 就执行send的指令交互;否则等待timeout秒后自动退出expect语句
  • send 如果匹配到expect接受到的信息,就将send中的指令交互传递,执行交互动作。结尾处加上\r表示如果出现异常等待的状态可以进行核查
  • exp_continue 表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。
  • exit 退出expect脚本
  • expect eof: spawn进程结束后会向expect发送eof,接收到eof代表该进程结束
  • interact 执行完代码后保持交互状态,将控制权交给用户。没有该命令执行完后自动退出而不是留在远程终端上
  • puts 输出变量

四、实战案例


4.1 登录远程服务器并在远程服务器上执行命令


#!/usr/bin/expect

spawn ssh root@192.168.2.161 df -h
expect "*password:"
send "winner@001\n"
expect eof

执行结果如下图: 

4.2 本机免密实现


#! /bin/bash
#
# Author: kangll
# CreateTime: 2023-11-10
# Desc: 基础环境配置,包括服务器设置,JDK,免密,kerberos配置
# 可扩展到批量操作 
#

#set -x
BASEDIR=$(cd "$(dirname "$0")"; pwd)
# 加载配置
source  $BASEDIR/config/global.sh
ssh_networkname=(windp-aio)
ssh_passwd=winner@#2023

########################
# 生成本地ssh公钥
########################
create_ssh_pub(){
	echo "生成本地ssh公钥"
	/usr/bin/expect << eof
	# 设置捕获字符串后,期待回复的超时时间
	set timeout 30
	# 执行命令开启一个新的进程
	spawn ssh-keygen -t rsa -b 1024
	 
	## 开始进连续捕获
	expect	{
		".ssh/id_rsa)"      { send "\n";  exp_continue }
		"Overwrite (y/n)?"  { send "y\n"; exp_continue }
		"no passphrase):"   { send "\n";  exp_continue }
		"passphrase again:" { send "\n";  exp_continue }
	}
eof
}


########################
# 定义复制ssh公钥方法
########################
copy_ssh(){
       
  if [ ! -f /root/.ssh/id_rsa.pub ];then
       create_ssh_pub
  fi
	echo "复制公钥到对应的主机上"
	/usr/bin/expect << eof
	# 设置捕获字符串后,期待回复的超时时间
	set timeout 30
	# 命令执行
	spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $1@$2
	 
	## 开始进连续捕获
	expect	{
		"connecting (yes/no)?" { send "yes\n";  exp_continue }
		"s password:"          { send "${ssh_passwd}\n"; exp_continue }
	}
eof
}

########################
# 配置免密
########################
config_ssh() {
    # 主机遍历
	for name in ${ssh_networkname[*]};do
		timeout 5 ssh root@${name} "echo ${name}: 'This is success!'"
		if [[ $? -ne 0 ]];then
			echo "复制文件到: ${name}"
			copy_ssh root ${name} > /dev/null
		fi
	done
         
        echo "********** ssh installation completed **********"
}

# 配置root用户免密 
config_ssh

4.3 自动生成kerberos用户的keytab认证文件


#! /bin/bash
#
# Author: kangll
# CreateTime: 2023-11-10
# Desc: 基础环境配置,包括服务器设置,JDK,免密,kerberos配置
# 可扩展到批量操作 
#
# public 主机名和root密码 
ip=$(ip addr show | grep -E 'inet [0-9]' | awk '{print $2}' | awk -F '/' '{print $1}' | sed -n '$p')
ssh_hosts=${ip}
ssh_networkname=(windp-aio)
# global.sh 配置文件中获取
ssh_passwd=$root_passwd
ssh_passwd=winner@#2023
kerberos_user=winner_spark

##################################
# 配置kerberos用户: winner_spark 
# 生成keytab 文件
##################################
config_kerberos_user() {
        echo "******** 创建winner_spark用户实例 ********"
        /usr/bin/expect << eof
        # 设置捕获字符串后,期待回复的超时时间
        set timeout 30
        # 登录
        spawn kadmin.local 
         
        ## 开始进连续捕获,添加用户
        expect  {
                "kadmin.local:"    { send "addprinc ${kerberos_user}\n"; exp_continue }
                "Enter password for principal"    { send "${ssh_passwd}\n"; exp_continue }
                "Re-enter password for principal" { send "${ssh_passwd}\n"; }
        }
       expect "kadmin.local:"    { send "quit\r";  }
eof

       echo "******** winner_spark用户生成keytab文件 ********"
        /usr/bin/expect << eof
        # 设置捕获字符串后,期待回复的超时时间
        set timeout 30
         
        spawn kadmin.local 
         
        ## 开始进连续捕获,生成keytab file
        expect  {
                "kadmin.local:" { send "xst -k /etc/security/keytabs/${kerberos_user}.keytab ${kerberos_user}@WINNER.COM\n";  }
        }
       expect "kadmin.local:"    { send "quit\r";  }
eof
       # modify keytab file privilege    
       chown ${kerberos_user}:hadoop /etc/security/keytabs/${kerberos_user}.keytab
       echo "********** kerberos user winner_spark add completed **********"
}

# 配置kerberos,并启动
#config_krb5

# 配置kerberos用户: winner_spark, 生成keytab 文件
config_kerberos_user

————————————————

原文链接:Linux学习之expect操作详解_expect linux-CSDN博客

linux expect 详解-CSDN博客

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

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

相关文章

继电器测试负载箱的价格和性价比如何?

继电器测试负载箱是一种专门用于测试继电器性能的设备&#xff0c;它可以模拟各种负载条件&#xff0c;对继电器进行全方位的性能测试。这种设备在电力系统、自动化设备、通信设备等领域有着广泛的应用。 价格方面&#xff0c;继电器测试负载箱的价格因品牌、型号、性能等因素而…

Lobatto Quadrature-数值积分

See https://mathworld.wolfram.com/LobattoQuadrature.html

达梦数据库常用参数查询

字符集 字符是各种文字和符号的统称&#xff0c;包括各个国家文字、标点符号、表情、数字等等。 字符集 就是一系列字符的集合。字符集的种类较多&#xff0c;每个字符集可以表示的字符范围通常不同&#xff0c;就比如说有些字符集是无法表示汉字的。 常见的字符集有 ASCII、G…

系列四、本地接口(Native Interface)

一、概述 本地接口的作用是融合不同的编程语言为Java所用&#xff0c;它的初衷是融合C/C程序&#xff0c;Java诞生的时候正是C/C横行的时候&#xff0c;要想立足&#xff0c;必须要调用C/C的程序&#xff0c;于是Java就在内存中开辟了一块区域专门用于处理标记为native的代码&a…

如何使用ArcGIS Pro制作粉饰效果

在地图上&#xff0c;如果某个部分比较重要&#xff0c;直接的制图不能将其凸显出来&#xff0c;如果想要突出显示重要部分&#xff0c;可以通过粉饰效果来实现&#xff0c;这里为大家介绍一下方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图…

印染污水处理设备有哪些分类

印染污水处理设备有多种分类方法。根据处理方法&#xff0c;可以分为物理法、化学法、生物法等。 物理法处理设备主要包括格栅、沉淀池、过滤器等&#xff0c;利用物理分离、去除的原理&#xff0c;将污水中的悬浮物和沉淀物去除。化学法处理设备主要包括混凝和氧化等&#xf…

kaggle项目部署

目录 流程详细步骤注意事项 流程 修改模块地址打包项目上传到kaggle Datasets创建code文件&#xff0c;导入数据与项目粘贴train.py文件&#xff0c;调整超参数&#xff0c;选择GPUsave version&#xff0c;后台训练查看训练结果 详细步骤 打开kaggle网站&#xff0c;点击da…

中移链共识机制介绍

01 为什么需要共识 共识是对某事达成的共同看法&#xff0c;它是区块链的灵魂&#xff0c;对确保区块链的完整性和安全性起着至关重要的作用。在传统的集中式系统中&#xff0c;单个实体或一组实体有权验证和记录交易。然而&#xff0c;区块链中的一个核心概念是去中心化&…

linux查看资源占用情况常用命令

1. 查看 CPU 使用情况&#xff1a; top这个命令会显示系统中当前活动进程的实时信息&#xff0c;包括 CPU 使用率、内存使用率等。按 q 键退出。 2. 查看内存使用情况&#xff1a; free -m这个命令显示系统内存的使用情况&#xff0c;以兆字节&#xff08;MB&#xff09;为…

VINS-MONO代码解读----配置文件,数据结构,前端feature_tracker

跑通代码之后可以深入看代码了&#xff0c;整体代码很多&#xff0c;可先从配置文件开始看。 1. VINS-MONO配置文件理解 参考启动文件launch与参数配置文件yaml介绍 启动文件launch&#xff1a;euroc.launch 参数配置文件yaml&#xff1a;euroc_config.yaml&#xff1a;包括…

【kerberos】使用 curl 访问受 Kerberos HTTP SPNEGO 保护的 URL

前言&#xff1a; 大数据集群集成 Kerberos 后&#xff0c;很多 WEBUI 打开都会提示输入用户名和密码。由于我想获取 flink 任务的详情&#xff0c;且KNOX 并不支持Flink api&#xff0c;查看KNOX 直接的列表&#xff1a;https://docs.cloudera.com/cdp-private-cloud-base/7.…

vivado产生报告阅读分析-Report Power4

在布线后会生成“ Power Report ” &#xff08; 功耗报告 &#xff09;&#xff0c; 它基于当前器件工作条件和设计的切换率来报告功耗详情。功耗分析要求网表已完成综合或设计已完成布局布线。 • set_operating_conditions 命令用于设置工作条件。 • set_switching_ac…

想转行互联网行业,是选择网络安全还是人工智能?

随着数字时代的到来&#xff0c;网络安全和人工智能成了科技创新产业的重要组成部分。也逐渐成了大多数人心中热门的行业选择。那么该如何抉择呢&#xff1f; 首先我们来了解下人工智能的发展前景&#xff1a; 如今&#xff0c;人工智能技术无论是在核心技术方面&#xff0c…

插件漏洞导致 60 万个 WordPress 网站遭受攻击

WordPress 插件 WP Fastest Cache 容易受到 SQL 注入漏洞的攻击&#xff0c;该漏洞可能允许未经身份验证的攻击者读取站点数据库的内容。 WP Fastest Cache 是一个缓存插件&#xff0c;用于加速页面加载、改善访问者体验并提高网站在 Google 搜索上的排名。 根据 WordPress.o…

photoshop插件开发入门

photoshop 学习资料和sdk 下载地址https://developer.adobe.com/console/servicesandapis/ps 脚本编程文档 官方文档&#xff1a; https://extendscript.docsforadobe.dev/ 官方文档&#xff1a; https://helpx.adobe.com/hk_en/photoshop/using/scripting.html open(new F…

如何做到百万数据半小时跑批结束

什么是跑批 跑批就是应用程序定时对数据的批量处理。 跑批有以下特性&#xff1a; 大数据量&#xff1a;批量任务一般伴随着大量的数据处理 自动化&#xff1a;要求制定时间或频率自动运行 性能&#xff1a;要求在指定时间内完成批处理任务 健壮性&#xff1a;针对于异常数…

【每周一测】Java阶段三第三周学习

目录 1、事务四个隔离级别中&#xff0c;哪一个不能防止脏读 2、关于sleep()和wait()&#xff0c;以下描述错误的一项是&#xff08;&#xff09; 3、以下关于Servlet生命周期说法错误的是&#xff08; &#xff09; 4、下列概念解释说明错误的是 5、在 JWT 中&#xff0c…

(二)什么是Vite——Vite 和 Webpack 区别(冷启动)

vite分享ppt&#xff0c;感兴趣的可以下载&#xff1a; ​​​​​​​Vite分享、原理介绍ppt 什么是vite系列目录&#xff1a; &#xff08;一&#xff09;什么是Vite——vite介绍与使用-CSDN博客 &#xff08;二&#xff09;什么是Vite——Vite 和 Webpack 区别&#xff0…

云课五分钟-05一段代码修改-AI修改C++

前篇&#xff1a; 云课五分钟-04一段代码学习-大模型分析C 在前一节&#xff0c;使用大模型工具文心一言等可以帮助分析代码&#xff0c;加快理解。 信息时代→智能时代&#xff0c;系统学习转为碎片学习。 发散思维的能力在智能时代尤为重要。 同样我们也可以借助智能化…

爬虫基础之爬虫的基本介绍

一、爬虫概述 爬虫又称网络蜘蛛、网络机器人&#xff0c;网络爬虫按照系统结构和实现技术&#xff0c;大致可以分为以下几种类型&#xff1a; 通用网络爬虫&#xff08;Scalable Web Crawler&#xff09;&#xff1a;抓取互联网上所有数据&#xff0c;爬取对象从一些种子 URL…