• Shell编程之免交互


    一,Here Document 免交互

    1:Here Document概述

    Here Document,简称Heredoc,是Shell脚本中一种特殊的输入重定向方式,允许你插入多行文本到命令中,作为输入数据源。它由一个起始标记界定开始,以相同标记结束(通常该标记位于一行的开始),并且在结束标记前可以包含任意文本,甚至是变量和命令的输出。

    2:Here Document 免交互

    Heredoc设计用于简化向脚本或命令提供多行数据的过程,避免了手动输入或交互式对话的需求,特别适用于自动化脚本的编写。

    (1).通过read命令接收输入并打印

    虽然read命令直接与Here Document无关,但提到免交互,可以对比说明。常规使用read时需要用户逐行输入,而使用Heredoc,可以预先定义好要输入的多行文本,实现自动化:

    1. # 使用Here Document代替read的交互过程
    2. cat <<EOF
    3. This is the first line.
    4. This is the second line.
    5. EOF
    (2).通过passwd给用户设置密码

    Here Document在非交互式地设置用户密码时非常有用,避免了手动输入密码的步骤:

    1. sudo passwd username <<EOF
    2. newPassword123
    3. newPassword123 # 确认密码
    4. EOF

    注意:出于安全考虑,某些系统或版本的passwd命令可能不接受来自stdin的密码输入。

    3:Here Document 变量设定

    在Heredoc中,可以方便地插入和使用变量,实现动态内容生成:

    1. greeting="Hello"
    2. name="Alice"
    3. cat <<EOF
    4. ${greeting}, ${name}!
    5. EOF
    4:Here Document 格式控制

    Heredoc支持所有文本格式化控制,包括转义序列(如\n换行、\t制表符)和多行文本,适用于生成格式化输出,如配置文件、HTML等:

    1. #bash
    2. cat <<EOF
    3. <html>
    4. <head>
    5. <title>Welcome</title>
    6. </head>
    7. <body>
    8. <h1>Hello, World!</h1>
    9. </body>
    10. </html>
    11. EOF
    5:Here Document 多行注释

    尽管不推荐作为主要的注释方式,但Here Document可以用作多行注释的一种非传统方法:

    1. : <<'COMMENT'
    2. 这是一个
    3. 多行注释
    4. 不会展开变量
    5. COMMENT

    注意:使用单引号包围结束标记以阻止变量展开,保持注释内容原样输出。然而,标准的井号#仍然是推荐的单行或多行注释方式。

    二,expect 免交互

    1:expect 概述

    Expect 是一个强大的自动化和测试工具,它使用Tcl语言编写,专为处理交互式程序设计,如那些需要用户输入密码或对提示做出响应的程序。通过期望(expect)特定的输出并发送(send)相应的回复,expect脚本能模拟人类与命令行应用程序的交互,从而实现自动化操作,无需人工介入。

    2:expect 安装

    在Linux系统中,expect通常作为一个独立的软件包存在,可以通过包管理器安装:

    • Debian/Ubuntusudo apt-get install expect
    • Fedora/RHEL/CentOSsudo yum install expect 或 sudo dnf install expect
    • macOS: 可以通过Homebrew安装,brew install expect
    3:基本命令介绍
    (1)脚本解释器

    每个expect脚本通常以#!/usr/bin/expect作为第一行,指定了脚本的解释器。

    (2)expect/send
    • expect: 等待从进程接收到的输出匹配给定的模式,然后执行后续命令。
    • send: 向进程发送字符串,模拟用户输入。通常需要\r来模拟回车键。
    (3)spawn
    • 用于启动一个新的子进程,并将该进程与expect脚本连接起来,以便对其进行交互。
    (4)结束符

    expect可以使用-exact, -glob, -regexp等选项来指定匹配模式的类型。

    (5)set

    用于设置变量,如set variable value

    (6)exp_continue

    在满足expect条件后,使用exp_continue可以继续执行下一次expect,而不是退出当前循环。

    (7)send_user

    类似于print或echo,但只输出到控制台,不发送给进程,用于调试或状态反馈。

    (8)接收参数

    脚本可以通过1,2等变量获取命令行参数,如set arg1 [lindex $argv 0]

    4:expect 语法
    (1)语法结构

    基本结构包括spawn启动进程,一系列expect和send交互,以及最后的流程控制。

    (2)expect 执行方式

    脚本可以直接执行,或在shell脚本中调用expect命令执行。

    5:expect 案例
    (1)创建用户并设置密码
    1. #!/usr/bin/expect
    2. set username "newuser"
    3. set password "secretpassword"
    4. spawn useradd $username
    5. expect "Enter new UNIX password:"
    6. send "$password\r"
    7. expect "Retype new UNIX password:"
    8. send "$password\r"
    9. interact
    (2)实现ssh自动登录
    1. #!/usr/bin/expect
    2. set user "remote_username"
    3. set host "remote_host"
    4. set password "remote_password"
    5. spawn ssh $user@$host
    6. expect {
    7. "(yes/no)?" { send "yes\r"; exp_continue }
    8. "password:" { send "$password\r" }
    9. }
    10. interact
    (3)利用 expect 完成 FTP 登录过程
    1. #!/usr/bin/expect
    2. set ftp_server "ftp.example.com"
    3. set ftp_user "ftp_username"
    4. set ftp_password "ftp_password"
    5. spawn ftp $ftp_server
    6. expect "Name .*:"
    7. send "$ftp_user\r"
    8. expect "Password:"
    9. send "$ftp_password\r"
    10. expect "ftp>"
    11. send "ls\r"
    12. expect "ftp>"
    13. send "quit\r"

    这些案例展示了expect在自动化管理任务,如用户管理、远程登录和文件传输等方面的强大功能,通过模拟用户交互,实现无须人工干预的脚本执行。

  • 相关阅读:
    【YOLOv5/v7改进系列】引入特征融合网络——ASFYOLO
    电商直播系统的开发方式及费用,提供直播商城平台城搭建方案
    【软考 系统架构设计师】软件架构设计⑦ 构件与中间件技术
    跨平台开发方案调研
    idea 的使用和安装 以及简介
    图计算发展简史(3)
    【Git】gitignore不生效场景2: 添加文件忽略 & .gitignore,整个文件夹都被忽略了
    万用表测量电阻图解及使用注意事项
    超声波测距毕设单机版本-张怡君
    Chrome 103支持使用本地字体,纯前端导出PDF优化
  • 原文地址:https://blog.csdn.net/weixin_63631452/article/details/140017769