• 【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 登录远程服务器并在远程服务器上执行命令


    1. #!/usr/bin/expect
    2. spawn ssh root@192.168.2.161 df -h
    3. expect "*password:"
    4. send "winner@001\n"
    5. expect eof

    执行结果如下图: 

    4.2 本机免密实现


    1. #! /bin/bash
    2. #
    3. # Author: kangll
    4. # CreateTime: 2023-11-10
    5. # Desc: 基础环境配置,包括服务器设置,JDK,免密,kerberos配置
    6. # 可扩展到批量操作
    7. #
    8. #set -x
    9. BASEDIR=$(cd "$(dirname "$0")"; pwd)
    10. # 加载配置
    11. source $BASEDIR/config/global.sh
    12. ssh_networkname=(windp-aio)
    13. ssh_passwd=winner@#2023
    14. ########################
    15. # 生成本地ssh公钥
    16. ########################
    17. create_ssh_pub(){
    18. echo "生成本地ssh公钥"
    19. /usr/bin/expect << eof
    20. # 设置捕获字符串后,期待回复的超时时间
    21. set timeout 30
    22. # 执行命令开启一个新的进程
    23. spawn ssh-keygen -t rsa -b 1024
    24. ## 开始进连续捕获
    25. expect {
    26. ".ssh/id_rsa)" { send "\n"; exp_continue }
    27. "Overwrite (y/n)?" { send "y\n"; exp_continue }
    28. "no passphrase):" { send "\n"; exp_continue }
    29. "passphrase again:" { send "\n"; exp_continue }
    30. }
    31. eof
    32. }
    33. ########################
    34. # 定义复制ssh公钥方法
    35. ########################
    36. copy_ssh(){
    37. if [ ! -f /root/.ssh/id_rsa.pub ];then
    38. create_ssh_pub
    39. fi
    40. echo "复制公钥到对应的主机上"
    41. /usr/bin/expect << eof
    42. # 设置捕获字符串后,期待回复的超时时间
    43. set timeout 30
    44. # 命令执行
    45. spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $1@$2
    46. ## 开始进连续捕获
    47. expect {
    48. "connecting (yes/no)?" { send "yes\n"; exp_continue }
    49. "s password:" { send "${ssh_passwd}\n"; exp_continue }
    50. }
    51. eof
    52. }
    53. ########################
    54. # 配置免密
    55. ########################
    56. config_ssh() {
    57. # 主机遍历
    58. for name in ${ssh_networkname[*]};do
    59. timeout 5 ssh root@${name} "echo ${name}: 'This is success!'"
    60. if [[ $? -ne 0 ]];then
    61. echo "复制文件到: ${name}"
    62. copy_ssh root ${name} > /dev/null
    63. fi
    64. done
    65. echo "********** ssh installation completed **********"
    66. }
    67. # 配置root用户免密
    68. config_ssh

    4.3 自动生成kerberos用户的keytab认证文件


    1. #! /bin/bash
    2. #
    3. # Author: kangll
    4. # CreateTime: 2023-11-10
    5. # Desc: 基础环境配置,包括服务器设置,JDK,免密,kerberos配置
    6. # 可扩展到批量操作
    7. #
    8. # public 主机名和root密码
    9. ip=$(ip addr show | grep -E 'inet [0-9]' | awk '{print $2}' | awk -F '/' '{print $1}' | sed -n '$p')
    10. ssh_hosts=${ip}
    11. ssh_networkname=(windp-aio)
    12. # global.sh 配置文件中获取
    13. ssh_passwd=$root_passwd
    14. ssh_passwd=winner@#2023
    15. kerberos_user=winner_spark
    16. ##################################
    17. # 配置kerberos用户: winner_spark
    18. # 生成keytab 文件
    19. ##################################
    20. config_kerberos_user() {
    21. echo "******** 创建winner_spark用户实例 ********"
    22. /usr/bin/expect << eof
    23. # 设置捕获字符串后,期待回复的超时时间
    24. set timeout 30
    25. # 登录
    26. spawn kadmin.local
    27. ## 开始进连续捕获,添加用户
    28. expect {
    29. "kadmin.local:" { send "addprinc ${kerberos_user}\n"; exp_continue }
    30. "Enter password for principal" { send "${ssh_passwd}\n"; exp_continue }
    31. "Re-enter password for principal" { send "${ssh_passwd}\n"; }
    32. }
    33. expect "kadmin.local:" { send "quit\r"; }
    34. eof
    35. echo "******** winner_spark用户生成keytab文件 ********"
    36. /usr/bin/expect << eof
    37. # 设置捕获字符串后,期待回复的超时时间
    38. set timeout 30
    39. spawn kadmin.local
    40. ## 开始进连续捕获,生成keytab file
    41. expect {
    42. "kadmin.local:" { send "xst -k /etc/security/keytabs/${kerberos_user}.keytab ${kerberos_user}@WINNER.COM\n"; }
    43. }
    44. expect "kadmin.local:" { send "quit\r"; }
    45. eof
    46. # modify keytab file privilege
    47. chown ${kerberos_user}:hadoop /etc/security/keytabs/${kerberos_user}.keytab
    48. echo "********** kerberos user winner_spark add completed **********"
    49. }
    50. # 配置kerberos,并启动
    51. #config_krb5
    52. # 配置kerberos用户: winner_spark, 生成keytab 文件
    53. config_kerberos_user

    ————————————————

    原文链接:Linux学习之expect操作详解_expect linux-CSDN博客

    linux expect 详解-CSDN博客

  • 相关阅读:
    900年历史的万安桥失火!传统古建筑又该如何保护?
    Python中使用cv2.resize()函数批量自定义缩放图像尺寸
    零基础学python之元组
    卡片懸停毛玻璃效果
    艾美捷高纯度 Cholesterol胆固醇相关介绍
    LeetCode - 1419 数青蛙
    蓝桥杯跑步锻炼.c语言
    react源码分析:实现react时间分片
    [ESP32 Arduino]SD卡通过SPI的方式访问
    ubuntu终端代码上传github最简方法
  • 原文地址:https://blog.csdn.net/qq_35995514/article/details/134426603