Linux:expect spawn简介与用法

一、背景

        大家在使用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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务器硬盘RAID速度分析

​ 在现代数据中心和企业环境中&#xff0c;服务器的存储性能至关重要&#xff0c;RAID&#xff08;独立磁盘冗余阵列&#xff09;技术通过将多块硬盘组合成一个逻辑单元&#xff0c;提供了数据冗余和性能优化&#xff0c;本文将详细探讨不同RAID级别对服务器硬盘速度的影响&am…

Android开发与网络请求

目标:快速开发一个安卓页面(用户登录&跳转) 抓包就是在后端逻辑与API之间截取信息。 1.安卓UI和后台逻辑 1.1 安卓UI 将activity_main.xml文件中的代码替换后,将会得到上面的UI界面 <?xml version="1.0" encoding="utf-8"?> <Linear…

【Linux】利用‘shell脚本’快速查看linux服务器的基本信息

一、脚本目的 为了方便&#xff0c;当拿到一台linux服务器的时候&#xff0c;我们应首先了解服务器的硬件、操作系统信息。俗话说“工欲善其事必先利其器” 只有熟悉了自己的武器&#xff0c;才能更好的发挥武器的威力。所以写了一个shell脚本&#xff0c;方便快速获取服务器C…

Solana 套利机器人原理

引言 加密货币的交易世界中&#xff0c;套利是利用市场价格差异进行无风险获利的一种策略。随着 DeFi&#xff08;去中心化金融&#xff09;的快速发展&#xff0c;套利机会屡见不鲜&#xff0c;尤其是在高速、高效能的区块链上&#xff0c;如 Solana。这些区块链通过提供低交易…

麦田物语学习笔记:制作[SceneName]Attribute特性

基本流程 因为在现有的项目中,像开始场景的切换或者Telepot组件都需要手动输入场景名,有时还可能键入出错,而该特性能用选择的方式去解决这一问题 1.代码实现 SceneNameDrawer.cs //参数绘制 using UnityEditor; using UnityEngine; #if UNITY_EDITOR [CustomPropertyDrawer(…

OCP使用中的常见问题与解决方法

OCP的常见问题 页面卡顿&#xff1a; 遇到页面卡顿的问题时&#xff0c;首先需要区分是全局性的卡顿&#xff0c;即所有页面都出现延迟或响应缓慢&#xff0c;还是仅限于特定的监控页面。 监控数据看不到: 需要明确是全部数据都无法查看&#xff0c;还是仅限于特定集群的数…

大模型LLM-微调 RAG

RAG小结 这篇文章是一篇关于大型语言模型&#xff08;LLMs&#xff09;增强技术的综述论文&#xff0c;特别聚焦于检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;这一领域。详细考察了RAG的发展、技术基础、关键技术、评估框架以及未来的研究方向。…

51c~缺陷检测~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12386431 一、缺陷检测~使用深度学习1 这里研究工业ai, 在制造业中任何公司的主要目标都是为客户生产无缺陷产品。如果在产品开发过程中出现任何内部孔、凹坑、磨损或划痕&#xff08;由于多种原因&#xff0c;从生产设备…

25春秋杯wp

春秋杯 图片不显示的去我blog找&#x1f447; 25春秋杯 | DDLS BLOG 文章所有内容部分来自自己写的&#xff0c;部分来自各路非公开wp&#xff0c;部分来自公开wp(附上链接&#xff0c;在文章末尾) easy_flask {{().__class__.__mro__.__getitem__(1).__subclasses__()[13…

C# 事件(Event)详解

C# 事件详解 事件&#xff08;Event&#xff09;是 C# 中的一种特殊类型的委托&#xff0c;它是基于委托的基础上构建的&#xff0c;用来实现事件驱动编程。在 C# 中&#xff0c;事件常用于处理用户输入、系统通知、数据更新等场景&#xff0c;允许一个对象通知其他对象某些行…

三维扫描赋能文化:蔡司3D扫描仪让木质文化遗产焕发新生-沪敖3D

挪威文化历史博物馆在其修复工作中融入现代3D扫描技术&#xff0c;让数百年的历史焕发新生。 文化历史博物馆的工作 文化历史博物馆是奥斯陆大学的一个院系。凭借其在文化历史管理、研究和传播方面的丰富专业知识&#xff0c;该博物馆被誉为挪威博物馆研究领域的领先机构。馆…

Ubuntu 24.04 LTS 系统语言英文改中文

Ubuntu 24.04 LTS 修改软件源 Ubuntu 更改软件源 修改语言 无需输入命令&#xff0c;为Ubuntu 24.04系统添加中文智能拼音输入法 在 setting 的 system 中按下图操作 点击“Apply Changes”。需要管理员密码&#xff0c;安装完成后&#xff0c;退出登录&#xff0c;重新登…

Qt按钮美化教程

前言 Qt按钮美化主要有三种方式&#xff1a;QSS、属性和自绘 QSS 字体大小 font-size: 18px;文字颜色 color: white;背景颜色 background-color: rgb(10,88,163); 按钮边框 border: 2px solid rgb(114,188,51);文字对齐 text-align: left;左侧内边距 padding-left: 10…

51c自动驾驶~合集48

我自己的原文哦~ https://blog.51cto.com/whaosoft/13133866 #UDMC 考虑轨迹预测的统一决策控制框架 论文&#xff1a;https://arxiv.org/pdf/2501.02530 代码&#xff1a;​​https://github.com/henryhcliu/udmc_carla.git​​ 1. 摘要 当前的自动驾驶系统常常在确…

C# 动态创建Label和ComboBox控件并修改Text

背景&#xff1a;在做项目的时候可能需要根据一定数量创建某些控件并修改其属性&#xff0c;本文以控件label、ConboBox控件进行动态创建。 程序运行前后的的Form动态图 代码如下&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; …

【物联网】keil仿真环境设置 keilV5可以适用ARM7

文章目录 一、ARM指令模拟器环境搭建1. keil软件2. Legacy Support 二、Keil仿真环境设置1. 创建一个项目2. 编译器介绍(1)arm-none-eabi-gcc(2)arm-none-linux-gnueabi-gcc(3)arm-eabi-gcc(4)grmcc(5)aarch64-linux-gnu-gcc 3. 安装编译器(1)设置调试 一、ARM指令模拟器环境搭…

2024年度总结:从后端Java到全栈成长的蜕变

目录 前言1. 用数据与实践书写成长篇章2. 技术与生活的双重蜕变3. 技术的进阶与生活的绽放 前言 今年是我入行的第十年&#xff0c;也是记录在CSDN平台上的第五年。这五年来&#xff0c;我始终坚持记录成长的点滴&#xff0c;将个人事业与博客创作紧密相连。一路走来&#xff0…

U-Net - U型网络:用于图像分割的卷积神经网络

U-Net是一种专为图像分割任务设计的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;最初由Olaf Ronneberger等人于2015年提出。它被广泛应用于医学影像分析、遥感图像分割、自动驾驶和其他许多需要对图像进行像素级分类的任务中。U-Net具有强大的特征提取和恢复能力&…

SpringCloud基础一

前后端分离开发 前后端分离开发后&#xff0c;前后端代码不在混合在同一个maven工程中&#xff0c;而是分为前端工程和后端工程。此时前后端代码并行开发&#xff0c;可以加快项目的开发进度在前后端代码分离后&#xff0c;此时后端工程会打包部署到Tomcat上&#xff0c;前端工…

MFC中添加Richedit2.0控件导致程序无法运行的解决方法mfc richedit2 Detected memory leaks! 及控件使用

错误&#xff1a;拖Richedit2.0控件到界面&#xff0c;编译提示mfc richedit2 Detected memory leaks! 原因&#xff1a;在MFC中添加Richedit2.0控件&#xff0c;可能会导致程序出错或无法运行。这是由于RichEdit没有初始化导致的。 解决&#xff1a;在 继承自CWinApp的类中的…