Linux:expect spawn简介与用法

news2025/1/21 7:47:02

一、背景

        大家在使用linux系统的很多时候,都用linux指令来实现一些操作,执行特定的job,有时一些场景中需要执行交互指令来完成任务,比如ssh登录这个命令大家一定很熟悉:

ssh-keygen -t rsa
# 以及
ssh-copy-id -i /home/test/.ssh/id_rsa.pub $username@$host_name

        以上两条指令执行任务需要按三次回车键,或输入yes/no以及密码才可以。当然,如果是单点操作的话,还是相对简单。

        但是比如我们要在一个集群规模的每个节点都进行上面的操作,那么会非常繁琐。所以此时我们就应该用脚本来管理它,让重复劳动交给机器,自动化执行以上命令。

        下面我们的主角来了,expect。

二、expect

       expect是一款免费的强大的工具,适用于人机交互场景,是处理交互的常用命令,可以将交互的过程写成一个脚本,通过调用脚本完成自动化过程,可无需人工干预。

        ​Expect是一个基于Tcl语言的脚本工具。

        其有以下关键命令:

1、安装        

        安装该命令非常简单。

yum install -y expect

2、基本语法

  • 首行/usr/bin/expect,声明使用except组件,类似/bin/sh用法。
  • spawn: spawn + 需要执行的shell命令
  • expect: 只有spawn执行的命令结果才会被expect捕捉到,因为spawn会启动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提示信息,eof和timeout。
  • send和send_user:send会将expect脚本中需要的信息发送给spawn启动的那个进程,而send_user只是回显用户发出的信息,类似于shell中的echo而已。

#!/usr/bin/expect
#    2025/01/19    hhd
spawn ssh test
expect {
    "yes/no" {send "yes\r";exp_continue}
    "password*" {send "test\r"}
}
expect eof
# or
# interact

        注意:expect脚本文件的头信息与bash不同

三、使用示例

1、基于key的expect自动化运行脚本

1、使用dsa算法:
ssh-keygen -t dsa # 使用dsa算法生成密钥,默认id_rsa

2、ssh指定密钥地址,并进行加密:(防止私钥被偷走场景)
ssh-keygen -p -f id_dsa
验证加密场景:
ssh ip地址

3、可以使用启用代理的方式,避免重复输入口令:
ssh-agent bash # 启用代理
ssh-add # 将加密口令添加到代理,窗口关闭后需要重新启动

4、通过脚本执行基于key验证,管理多台机器的expect脚本:
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa

#!/bin/bash

PASS=真实密码
ssh-keygen -t rsa -P ""  -f /root/.ssh/id_rsa &> /dev/null && echo "ssh key is created"
rpm -q expect &> /dev/null || yum -y install expect &> /dev/null

while read IP;do
expect << EOF
set timeout 20
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$IP
expect {
"yes/no" { send "yes\n" }
"password" { send "$PASS\n" }
}
expect eof
EOF
echo $IP is read
done < hosts.txt

或者使用另一种方式:

#! /usr/bin/expect

# 1.make sure expect exist!
rpm -q expect &> /dev/null
if [ $? -ne 0 ];then
        yum -y install expect
fi

# 2.make sure public key exist!
password='xxx'
if [ ! -f ~/.ssh/id_rsa ];then
        ssh-keygen -P "" -f ~/.ssh/id_rsa
fi

# 3.interactive process
for i in {178..180}
do
   {
   ip=192.168.8.$i
   ping -c1 -W1 $ip &> /dev/null
   if [ $? -eq 0 ];then
           echo "$ip" >> hosts.txt
           /usr/bin/expect <<- EOF
           set timeout 10
           spawn ssh-copy-id $ip
           expect {
                   "yes/no" { send "yes\r"; exp_continue }
                   "password:" { send "$password\r" }
           }
           expect eof
           EOF
   fi
   }&
done
wait
echo "ssh-key is finished"

        集群环境内的所有的主机共用一套公钥和私钥:实现所有主机之间可以互连

ssh-copy-id -i .ssh/id_rsa.pub  127.0.0.1  # 公钥复制到自己的主机上
scp -r /root/.ssh/ 192.172.20.50:/root/   # 拷贝ssh到目标主机上

注释:ssh-keygen

ssh-keygen(选项) - - 为ssh生成、管理和转换认证密钥

-f:指定用来保存密钥的文件名;
-P:提供(旧)密语;
-t:指定要创建的密钥类型。

2、实现远程拷贝文件到本地

#/user/bin/expect
spawn scp -P 22 -r root@192.168.1.128:/etc/* /home/test/
expect{
      "(yes/no)?"{                
                  send "yes\n"
                  expect "*password:"{
                                     send "root@123\n" 
                                     }
                 }
       "*password:"{
                   send "root@123\n"
                 }
}
expect "100%"
expect eof

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

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

相关文章

Express的接口

目录 接口的跨域问题域问题 request接口代码 const express require(express) const app express() //在路由之前&#xff0c;配置cors中间件&#xff0c;解决接口跨域问题 const cors require(cors) app.use(cors())const router require(./apiRouter)app.use(/api,rout…

【PCIe 总线及设备入门学习专栏 6.2 -- PCIe VDM (Vendor Defined Messages)】

文章目录 OverviewPCIe VDM (Vendor Defined Messages) 概述PCIe VDM Header 的各个字段及作用VDM 的工作方式例子:一个简化的 VDM 示例注意事项Overview 本文将详细介绍 PCIe VDM 及 PCIe VDM Header 各个域的作用。 PCIe VDM (Vendor Defined Messages) 概述 在 PCIe 协议…

微服务学习:基础理论

一、微服务和应用现代化 1、时代的浪潮&#xff0c;企业的机遇和挑战 在互联网化数字化智能化全球化的当今社会&#xff0c;IT行业也面临新的挑战&#xff1a; 【快】业务需求如“滔滔江水连绵不绝”&#xff0c;企业需要更快的交付【变】林子大了&#xff0c;百色用户&…

实战演示:利用ChatGPT高效撰写论文

在当今学术界&#xff0c;撰写论文是一项必不可少的技能。然而&#xff0c;许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是&#xff0c;人工智能的快速发展为我们提供了新的工具&#xff0c;其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…

【PCIe 总线及设备入门学习专栏 6 -- PCIe Inbound and Outbound】

文章目录 PCIe Outbound 和 Inbound 概念详解Outbound 与 Inbound 的基础定义基于角色的详细分析关于“上游”和“下游”方向应用举例小结PCIe Outbound 和 Inbound 概念详解 PCIe(Peripheral Component Interconnect Express)是一种高速串行通信协议,用于连接主机与外部设…

24年总结 -- 共赴心中所向往的未来

一、前言 我又回来了&#xff0c;前阵子忙着期末考试的东西&#xff0c;也是快半个月没更新了&#xff0c;刚好前几天报名了博客之星的评选&#xff0c;也很幸运的入围了&#xff0c;也借此机会来回顾一下关于2024年的个人成长、创作经历等。 二、个人 本人是一个双非学校的软…

嵌入式产品级-超小尺寸热成像相机(从0到1 硬件-软件-外壳)

Thermal_Imaging_Camera This is a small thermal imaging camera that includes everything from hardware and software. 小尺寸热成像相机-Pico-LVGL-RTOS 基于RP2040 Pico主控与RTOS&#xff0c;榨干双核性能实现LVGL和成图任务并行。ST7789驱动240280屏&#xff0c;CST8…

网络协议入门:OSI模型与TCP/IP栈

在网络通信的世界中&#xff0c;数据从一台设备传输到另一台设备&#xff0c;需要遵循一系列规则&#xff0c;这些规则统称为网络协议。OSI模型和TCP/IP协议栈作为网络通信的基石&#xff0c;帮助我们理解数据传输的全流程。这篇文章将深入解析它们的结构、功能和实际应用&…

HackMyVM-Klim靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell 3、提权 CVE-2008-0166 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(192.168.159.127) 靶 机&#xff1a;debian(192.168.159.27) 注意事…

Mysql InnoDB B+Tree是什么?

“mysql中常用的数据库搜索引擎InnoDB,其索引通过BTree的方式进行构建。” 实在想不起来BTree是怎么一回事了。以点带线&#xff0c;将涉及到的数据结构一起复习一下。 文章目录 数据结构定义红黑树定义使命 BTree定义使命 BTree定义 InnoDB BTree 旋转与调整二叉排序树插入删…

docker 使用远程镜像启动一个容器

使用前提&#xff1a; 首先你得安装docker,其次你得拥有一个远程镜像 docker run --name io_11281009 --rm -it -p 2233:22 -v .:/root/py -e ed25519_rootAAAAC3NzaC1lZDI1********Oy7zR7l7aUniR2rul ghcr.lizzie.fun/fj0r/io srv对上述命令解释&#xff1a; 1.docker run:…

吴恩达深度学习——神经网络介绍

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 什么是神经网络引入神经网络神经元激活函数ReLU隐藏单元 用神经网络进行监督学习监督学习与无监督学习举例 什么是神经网络 引入 已经有六个房子的数据集&#xff0c;横轴为房子大小&#xff0c;纵轴为房子…

基于GRU实现股价多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

Linux -- HTTP 请求 与 响应 报文

目录 请求报文&#xff1a; 请求方法 响应报文&#xff1a; 状态码 与 状态码描述 共性 常见的报头 请求报文&#xff1a; 请求方法 方法说明GET获取资源POST传输实体主体PUT传输文件HEAD获得报文首部DELETE删除文件OPTIONS询问支持的方法TRACE追踪路径CONNECT要求用…

小米平板pad6工程固件界面预览 修复tee损坏 修复底层分区 开diag端口

💝💝💝小米平板pad6 机型代码pipa。采用一块分辨率为 2880*1800p,支持 120/144Hz 高刷新率的国产屏,并且屏幕支持 HDR10 + 以及杜比视界。分别搭载 SM8250AC(骁龙 870)、SM8475(骁龙 8+)处理器。也适用于以下型号的小米机型:23043RP34G, 23043RP34I, 23043RP34C等…

day03_开发前准备和匹配类标签

文章目录 day03_开发前准备和匹配类标签一、标签体系(了解)二、数据导入(操作)1、背景介绍(重要)2、创建Hive表2.1 dwm_sold_goods_sold_dtl_i2.2 dwm_sell_o2o_order_i**2.3 dwd_mem_member_union_i**2.4 dwm_mem_member_behavior_day_i**2.5 dwm_mem_first_buy_i**3、数…

STM32之FreeRTOS开发介绍(十九)

STM32F407 系列文章 - freertos&#xff08;十九&#xff09; 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理 2.功能 3.特点 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是一个免费的、开源的实时操作系统&#xff0c;专为微控制器和嵌入…

第十三章:数据库技术

文章目录&#xff1a; 一&#xff1a;基础 1.概念 2.特点 3.常见数据库品牌 4.数据库应⽤系统 4.1 C/S 4.2 B/S 5.数据模型的分类 6.名词解析 7.关系运算 二&#xff1a;Access 1.基础 2.操作 2.1 建立表 2.2 维护表 2.3 创建查询 2.4 创建窗体 2.5 创建报表…

stm32 no connect target

解决 STM32 报错 “no target connected” 的方法 前言 stm32最小系统在下载程序是一直报错&#xff1a;no target connected&#xff0c;试了很多办法成功不了&#xff0c;最后将芯片擦除了才成功。 一、问题描述 当时是写flash的时候写到ST Link 存储的地方了。 之后就不…

综述:大语言模型在机器人导航中的最新进展!

简介 机器人导航是指机器人能够在环境中自主移动和定位的能力。本文系统地回顾了基于大语言模型&#xff08;LLMs&#xff09;的机器人导航研究&#xff0c;将其分为感知、规划、控制、交互和协调等方面。具体来说&#xff0c;机器人导航通常被视为一个几何映射和规划问题&…