首页 > 系统相关 >【Linux】命令expect使用详解

【Linux】命令expect使用详解

时间:2024-08-31 14:53:16浏览次数:12  
标签:spawn send 命令 详解 expect Linux 交互 ssh

一、概述
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 [email protected] 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

 

标签:spawn,send,命令,详解,expect,Linux,交互,ssh
From: https://www.cnblogs.com/LiuYanYGZ/p/18390290

相关文章

  • linux基础网络设置
    查看网络接口信息ifconfig查看所有活动网络接口的信息执行ifconfig命令查看指定网络接口信息ifconfig网络接口名查看主机名称hostnamehostname命令查看或设置当前主机名hostname查看路由表条目routeroute命令查看或设置主机中路由表信息route-n查看网络连接情......
  • linux操作系统
    Linux操作系统安装及服务控制开源软件没有商业化软件版权约束,源代码开发,可无约束自由传播---自由并不意味着免费FSF自由软件基金会,由1984年创办;主要的项目包含了GNU项目为什么选择Linux?开源免费稳定服务器不但降低企业运行成本,而且还提升了更高的稳定性和可靠性,且无需考......
  • Linux基础
    ctrl+alt+t打开终端windows的绝对路径中,目录使用"\"分隔;在Linux的绝对路径中,目录使用"/"分隔。Linux的目录是树状结构。学习shell什么是shell引言当我们谈起命令行时,其实指的是Shell。Shell是一个程序,它接收由键盘输入的命令并将其传递给操作系统(简称系统)来执行。几乎所有......
  • linux操作系统2-初始化
    操作系统初始化:1.配置CRT远程连接vi/etc/sysconfig/network-scripts/ifcfg-ens32BOOTPROTO=static静态获取IP地址ONBOOT=yes启用该网卡新增以下内容:IPADDR=192.168.1.100IP地址NETMASK=255.255.255.0子网掩码systemctlrestartnetwork2.SElinux操作系统安全机制关......
  • linux常用命令
    Linux下要获取命令的使用帮助,可有以下几种方法:一、通过help命令二、man命令查询手册(manual)三、info命令获取在下文档帮助ls显示目录中内容,包括子目录和文件相关属性信息ls-l:显示详细信息ls-a:显示子目录和文件,包括"."开头的隐藏目录和隐藏文件ls-A:不显示包括"."开......
  • 数据结构-单链表-详解-2
    数据结构-单链表-详解-21.前言2.创建新结点3.头插与尾插3.1头插3.2尾插空链表找尾4.头删与尾删4.1头删4.2尾删1.前言在数据结构-单链表-详解-1中,我们不仅了解了单链表的基本概念,还掌握了如何创建和打印单链表。今天,我将详细讲解如何对单链表进行头尾部的插入、......
  • 【Linux】Linux64位环境下编译32位报错的解决办法
    问题如题,当我尝试在wsl2的ubuntu中使用-m32选项编译32位程序的时候,出现了下面的两种报错❯g++-m32test.cpp-otest1&&./test1Infileincludedfromtest.cpp:1:/usr/include/stdio.h:27:10:fatalerror:bits/libc-header-start.h:Nosuchfileordirectory27|#i......
  • 【Linux】如何用一条命令终止某个后台进程?
    在面试的时候被问道了这个问题,之前还从来没有了解过1.怎么终止某个进程?如果你学过Linux下的信号处理,这个问题应该不难答。在Linux下,使用kill命令发送信号给进程,其中9号信号SIGKILL就可以将进程终止。还有很多其他信号也能终止进程,比如前台进程使用CTRL+C会发送2号信号,也能终止进程......
  • MySQL字符集详解
    一、内容概述在MySQL的使用过程中,了解字符集、字符序的概念,以及不同设置对数据存储、比较的影响非常重要。不少同学在日常工作中遇到的“乱码”问题,很有可能就是因为对字符集与字符序的理解不到位、设置错误造成的。本文由浅入深,分别介绍了如下内容:字符集、字符序的基本概念......
  • NumPy 随机数据分布与 Seaborn 可视化详解
    随机数据分布什么是数据分布?数据分布是指数据集中所有可能值出现的频率,并用概率来表示。它描述了数据取值的可能性。在统计学和数据科学中,数据分布是分析数据的重要基础。NumPy中的随机分布NumPy的random模块提供了多种方法来生成服从不同分布的随机数。生成离散分布随机......