【Linux】命令expect使用详解

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

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

目录

一、概述

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/expectspawn 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 ];thencreate_ssh_pubfiecho "复制公钥到对应的主机上"/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[*]};dotimeout 5 ssh root@${name} "echo ${name}: 'This is success!'"if [[ $? -ne 0 ]];thenecho "复制文件到: ${name}"copy_ssh root ${name} > /dev/nullfidoneecho "********** 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";  }
eofecho "******** winner_spark用户生成keytab文件 ********"/usr/bin/expect << eof# 设置捕获字符串后,期待回复的超时时间set timeout 30spawn kadmin.local ## 开始进连续捕获,生成keytab fileexpect  {"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}.keytabecho "********** 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.mzph.cn/news/209347.shtml

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

相关文章

【上海大学数字逻辑实验报告】五、记忆元件测试

一、实验目的 掌握R-S触发器、D触发器和JK触发器的工作原理及其相互转换。学会用74LS00芯片构成钟控RS触发器。学会用74LS112实现D触发器学会在Quartus II上用D触发器实现JK触发器。 二、实验原理 基本R-S触发器是直接复位-置位的触发器&#xff0c;它是构成各种功能的触发器…

AI文档助手,当下热门的AI文档助手【2024】

在当今信息爆炸的时代&#xff0c;文档创作的需求愈发庞大。为了满足用户对高效、准确、原创性文档的需求&#xff0c;人工智能技术的应用日益广泛。本文将专心分享AI文档助手领域的热门推荐。 AI文档助手的背景与应用 AI文档助手作为人工智能技术在文档创作领域的一大应用&am…

nginx配置自建SSL证书

文章目录 前言配置SSL证书SSL证书放在 Nginx 而不放在应用服务器上的好处Nginx只能转发http协议吗Nginx转发TCP协议会收到端口限制吗Nginx本身能将Websocket数据转化成TCP数据吗总结 前言 之前的一篇文章《自建CA并生成自签名SSL证书》中讲到为什么要自建CA和自签名SSL证书&am…

velocity-engine-core是什么?Velocity模板引擎的使用

velocity-engine-core是什么&#xff1f;Velocity模板引擎的使用 1. 常见的模板引擎2. Velocity 的语法3.Velocity的使用 相信在日常开发中或多或少都听过或者使用过模板引擎&#xff0c;比如熟知的freemarker, thymeleaf等。而模板引擎就是为了实现View和Data分离而产生的。 而…

C++封装、继承(单继承)、多态详细分析。

系列文章目录 文章目录 系列文章目录摘要一、基本概念二、多态的分类三、多态的实现3.1 类型兼容与函数重写3.2 动态联编与静态联编3.3 虚函数3.4 动态多态的实现过程 总结参考文献 摘要 多态性特征是 C中最为重要的一个特征&#xff0c;熟练使用多态是学好 C的关键&#xff0…

Kotlin关键字二——constructor和init

在关键字一——var和val中最后提到了构造函数&#xff0c;这里就学习下构造函数相关的关键字: constructor和init。 主要构造(primary constructor) kotlin和java一样&#xff0c;在定义类时就自动生成了无参构造 // 会生成默认的无参构造函数 class Person{ }与java不同的是…

configure脚本的常用参数

下面是一些常用的configure选项参数及其解释&#xff1a; --prefix<directory>&#xff1a;指定安装目录--with-<package>&#xff1a;指定依赖的外部库或软件包--enable-<feature>&#xff1a;启用某个特性--disable-<feature>&#xff1a;禁用某个特…

原创 | 数据的确权、流通、入表与监管研究(一):数据与确权

作者&#xff1a;张建军&#xff0c;中国电科首席专家&#xff0c;神州网信技术总监 本文约7100字&#xff0c;建议阅读10分钟 本文主要介绍数据与数据分类、数据确权规则、数据的所有权与其他权利等方面内容&#xff0c;并进行案例分析。 2022年12月发布的《关于构建数据基础制…

Linux 和 macOS 的主要区别在哪几个方面呢?

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

uniapp实战 —— 弹出层 uni-popup (含vue3子组件调父组件的方法)

效果预览 弹出的内容 src\pages\goods\components\ServicePanel.vue <script setup lang"ts"> // 子组件调父组件的方法 const emit defineEmits<{(event: close): void }>() </script><template><view class"service-panel"…

ALSA Compress-Offload API

概述 从 ALSA API 的早期开始&#xff0c;它就被定义为支持 PCM&#xff0c;或考虑到了 IEC61937 等固定比特率的载荷。参数和返回值以帧计算是常态&#xff0c;这使得扩展已有的 API 以支持压缩数据流充满挑战。 最近这些年&#xff0c;音频数字信号处理器 (DSP) 常常被集成…

git如何配置多个远程仓库,并且进行切换

一、配置多个远程仓库并进行切换&#xff0c;请按照以下步骤进行操作&#xff1a; 打开命令行终端&#xff0c;并进入您的 Git 仓库所在的目录。添加第一个远程仓库&#xff0c;使用以下命令&#xff1a;git remote add origin <第一个远程仓库的 URL>这里将远程仓库命名…

C# .NET平台提取PDF表格数据,并转换为txt、CSV和Excel表格文件

处理PDF文件中的内容是比较麻烦的事情&#xff0c;特别是以表格形式呈现的各种数据。为了充分利用这些宝贵的数据资源&#xff0c;我们可以通过程序提取PDF文件中的表格&#xff0c;并将其保存为更易于处理和分析的格式&#xff0c;如txt、csv、xlsx&#xff0c;从而更方便地对…

leetcode面试经典150题——35 螺旋矩阵

题目&#xff1a; 螺旋矩阵 描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 提示&…

Redis Geo操作地理位置

Redis Geo 使用场景API列表名词API列表Springboot使用mavenyamlTest 注意事项 Redis Geo 是Redis在3.2版本中新增的功能&#xff0c;用于存储和操作地理位置信息 使用场景 滴滴打车&#xff1a;这是一个对地理位置精度要求较高的场景。通过使用Redis的GEO功能&#xff0c;滴滴…

12月8日作业

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数&#xff1b;将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断u界面上输入的账号是否为"admin"&#xff0c;…

kafka学习笔记--安装部署、简单操作

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…

Day54力扣打卡

打卡记录 出租车的最大盈利&#xff08;动态规划&#xff09; 链接 class Solution:def maxTaxiEarnings(self, n: int, rides: List[List[int]]) -> int:d defaultdict(list)for start, end, w in rides:d[end].append((start, end - start w))f [0] * (n 1)for i in…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑源网荷效益的峰谷电价与峰谷时段双层优化模型》

这个标题涉及到电力定价和能源效益的优化模型。让我来分解一下&#xff1a; 峰谷电价&#xff1a;这是一种电力定价策略&#xff0c;即在一天内不同时间段设定不同的电价。通常&#xff0c;高峰时段&#xff08;需求高&#xff09;的电价相对较高&#xff0c;而低谷时段&#x…

人工智能学习9(LightGBM)

编译工具&#xff1a;PyCharm 文章目录 编译工具&#xff1a;PyCharm lightGBM原理lightGBM的基础使用案例1&#xff1a;鸢尾花案例2&#xff1a;绝对求生玩家排名预测一、数据处理部分1.数据获取及分析2.缺失数据处理3.数据规范化4.规范化输出部分数据5.异常数据处理5.1删除开…