【shell】expect命令详解:用expect实现自动化交互式操作

文章目录

    • 一. 运用场景
    • 二. 语法说明
    • 三. 例子
      • 1. scp文件传输自动化
      • 2. ssh远程登录
      • 3. 切到root用户
      • 4. 创建ssh key
      • 5. ssh到一个节点创建用户

一. 运用场景

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

 

二. 语法说明

注意:该脚本能够执行的前提是安装了expect

yum install -y expect

在使用expect时,有以下几个常见的命令:
在这里插入图片描述

说明:
spawn

用来启动新的进程,spawn后的expect和send命令都是和使用spawn启动的新进程进行交互。
spawn是expect的初始命令,用于启动一个进程,之后所有操作都在这个进程中进行,如果没有spawn,这个expect都无法进行。

 
expect

用来等待一个进程的反馈,我们根据进程的反馈,再使用send命令发送对应的交互命令。

 
send

接收一个字符串参数,并将该参数发送到进程。

 
interact

用的其实不是很多,interact命令主要用于退出自动化,进入人工交互。
比如我们使用spawn、send和expect命令完成了ftp登陆主机,执行下载文件任务,但是我们希望在文件下载结束以后,仍然可以停留在ftp命令行状态,以便手动的执行后续命令,此时使用interact命令就可以很好的完成这个任务。

 

三. 例子

1. scp文件传输自动化

使用scp 命令的时候如果是第一次通讯需要通过交互的方式手工按yes之后才能进入第二步,然后手工输入密码才能进行文件传输。

#!/usr/bin/expect -dset timeout 10
spawn -noecho ssh -o StrictHostKeyChecking=no -l test 192.168.2.151 -p 22
#spawn命令是expect的初始命令,他用于启动一个进程,之后所有操作都在这个进程中进行,
#如果没有spawn,这个expect都无法进行
#StrictHostKeyChecking=no参数让ssh默认添加新主机的公钥指纹,也就不会出现出现是否继续yes/no的提示了expect "password:" {send "123456\r"}
expect "Last login" {send "echo test1\r"}
expect "*\$*" {send "echo test2\r"}
expect eof# EOF(End Of File),表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),
# 也可以是标准输入(stdin),EOF是不可输出字符,因此不能在屏幕上显示。
# 由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。
#即当读入的字符值等于EOF时,表示读入的已不是正常的字符而是文件结束符。

 

2. ssh远程登录

#!/bin/bashpasswd='123456'/usr/bin/expect <<-EOF# exp_continue 用于多次匹配
set time 30
spawn ssh saneri@192.168.56.103 df -Th
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$passwd\r" }
}
expect eof
EOF

 

3. 切到root用户

#!/usr/bin/expect -fset timeout 10spawn sudo su - root
expect "*password*"
send "123456\r"
expect "#*"
send "ls\r"
expect "#*"
send "df -Th\r"
send "exit\r"
expect eof

 

4. 创建ssh key

1.创建主机配置文件[root@localhost script]# cat host 
192.168.1.10 root 123456
192.168.1.20 root 123456
192.168.1.30 root 1234562.编写copykey.sh脚本,自动生成密钥并分发key.#!/bin/bash
# 判断id_rsa密钥文件是否存在
if [ ! -f ~/.ssh/id_rsa ];thenssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
elseecho "id_rsa has created ..."
fi#分发到各个节点,这里分发到host文件中的主机中.
while read linedouser=`echo $line | cut -d " " -f 2`ip=`echo $line | cut -d " " -f 1`passwd=`echo $line | cut -d " " -f 3`expect <<EOFset timeout 10spawn ssh-copy-id $user@$ipexpect {"yes/no" { send "yes\n";exp_continue }"password" { send "$passwd\n" }}expect "password" { send "$passwd\n" }
EOFdone <  hosts

 

5. ssh到一个节点创建用户

#!/bin/bash 
ip=$1  
user=$2 
password=$3 expect <<EOF  set timeout 10 spawn ssh $user@$ip expect { "yes/no" { send "yes\n";exp_continue } "password" { send "$password\n" }} expect "]#" { send "useradd hehe\n" } expect "]#" { send "touch /tmp/test.txt\n" } expect "]#" { send "exit\n" } expect eof EOF  #./ssh5.sh 192.168.1.10 root 123456

 
 
参考:
https://www.cnblogs.com/saneri/p/10819348.html
https://blog.csdn.net/givenchy_yzl/article/details/118079170
https://sites.google.com/site/chinainventor/language/2009-04-03-02

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

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

相关文章

037:mapboxGL输入经纬度,地址坐标转换,弹出位置点地址信息

第037个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中输入经纬度,地址坐标转换,弹出位置点地址信息. 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共158行)相关API参考:专栏目标示例效果 配置方式…

LeetCode 2. 两数相加

文章目录 1. 题目描述2. 解题代码 1. 题目描述 链接&#xff1a;https://leetcode.cn/problems/add-two-numbers/ 2. 解题代码 public ListNode AddTwoNumber(ListNode l1, ListNode l2) {ListNode head new ListNode();ListNode cur head;int carry 0;while (l1 ! null…

Node.js HTTP 模块的内存泄露问题

很久没有逛社区了&#xff0c;晚上回来看了一下最近的情况&#xff0c;突然看到一个内存泄露问题&#xff0c;作为一个 APM 开发者&#xff0c;自然想分析其中的原因。 问题 下面介绍一下具体的问题。看一下 demo。 const http require(http)async function main () {let i…

企业级微服务架构实战项目--xx优选-用户登录

一 用户登录的触发页面 1.登录常量 2.登录地址 3.配置域名 4.启动程序 触发连接小程序后端的登录接口 小程序controller的登录方法

网络空间安全数学基础考试要点

网络空间安全数学基础 阶的计算不要求那个公式&#xff0c;但是Order几次方要求 考试会考原根 Legendre必考 多项式计算必考 扩域多项式计算 同态不考 域元素表示 本元多项式不考 1.整除 3 ≡ \equiv ≡ 4 mod 7不对吧3 ≡ \equiv ≡ 3 mod 74 ≡ \equiv ≡ 4 &#xff08;m…

vscode环境部署

目录 编译cpp 编译qt 借用插件 手撸&#xff08;建议&#xff0c;避免很多未知错误&#xff09; 踩过的坑 编译cpp vscode安装2个插件&#xff0c;extension pack自动包了下面3个通过命令窗口code .打开代码目录&#xff0c;或者添加cl.exe路径到path&#xff0c;以及c需…

津津乐道设计模式 - 桥接模式详解

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

clop勒索软件攻击活动频发,西门子能源中招

自6月初被通报利用MOVEit Transfer服务器中的零日漏洞窃取加密组织数据后&#xff0c;clop勒索软件攻击活动频繁&#xff0c;全球陆续发生了多起clop软件攻击事件。本周&#xff0c;Clop团伙在其数据泄露网站上列出了西门子能源公司的信息&#xff0c;表示该公司的数据被泄露。…

【数据结构】队列——顺序实现+链式实现(带头结点+不带头结点)入队 出队 初始化 判空 双端队列 完整代码

文章目录 四 队列1.基本概念2.队列的顺序存储3.队列的链式实现3.1 定义3.2 带头结点3.2.1 初始化3.2.2 判空3.2.3 入队3.2.4 出队3.2.5 完整代码 3.3 不带头结点3.3.1 初始化3.3.2 入队3.3.3 出队3.3.4 完整代码 4.双端队列 四 队列 1.基本概念 定义 只允许在一端进行插入&…

基于人工智能与边缘计算Aidlux的鸟类检测驱赶系统(可修改为coco 80类目标检测)

●项目名称 基于人工智能与边缘计算Aidlux的鸟类检测驱赶系统&#xff08;可修改为coco 80类目标检测&#xff09; ●项目简介 本项目在Aidlux上部署鸟类检测驱赶系统&#xff0c;通过视觉技术检测到有鸟类时&#xff0c;会进行提示。并可在源码上修改coco 80类目标检测索引直…

Kotlin Jetpack Compose - 实现Tab布局

Tab布局是一种常见的UI设计&#xff0c;它允许用户在不同的视图或数据集之间切换。我们将使用Jetpack Compose的 TabRow 和 ScrollableTabRow 组件来实现这个布局。 一、基本的Tab布局——TabRow 二、滚动的Tab布局——ScrollableTabRow 组件 三、自定义Tab组件 一、基本的T…

appium如何连接多台设备

目录 前言&#xff1a; 1.我们拿两台设备来模拟操作下&#xff0c;使用&#xff1a;adb devices查看连接状况&#xff0c;获取到设备名称。 2.获取需要操作app的包名和页面名称&#xff08;前提该设备已经打开了app&#xff09; 3.设置初始配置信息 4.打开页面后操作元素&am…