Linux expect 命令实战示例

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习如何使用 Linux 的 expect 命令来自动化交互式命令行应用程序,例如 SSH、FTP 等。你将首先了解 expect 命令的用途和语法,然后继续学习如何使用 expect 自动化 SSH 登录,并在 expect 脚本中处理提示和响应。

本实验涵盖以下步骤:

  • 了解 expect 命令的用途和语法
  • 使用 expect 自动化 SSH 登录
  • expect 脚本中处理提示和响应

expect 命令是一个强大的工具,允许你创建脚本来自动化重复性任务,减少手动干预的需求。在第一步中,你将安装 expect 包并探索 expect 命令的基本语法。在后续步骤中,你将学习如何使用 expect 自动化 SSH 登录,并在脚本中处理各种提示和响应。

Linux 命令速查表


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("`Linux`")) -.-> linux/RemoteAccessandNetworkingGroup(["`Remote Access and Networking`"]) linux/RemoteAccessandNetworkingGroup -.-> linux/ssh("`Secure Connecting`") subgraph Lab Skills linux/ssh -.-> lab-422669{{"`Linux expect 命令实战示例`"}} end

了解 expect 命令的用途和语法

在这一步中,你将学习 Linux 中 expect 命令的用途和语法。expect 命令是一个强大的工具,允许你自动化交互式命令行应用程序,例如 SSH、FTP 等。

expect 命令的工作原理是与程序交互,向其发送输入,然后检查输出以获取预期的响应。这使你可以创建脚本来自动化重复性任务,减少手动干预的需求。

让我们首先在 Ubuntu 22.04 环境中安装 expect 包:

sudo apt-get update
sudo apt-get install -y expect

现在,让我们探索 expect 命令的基本语法:

expect [options] [script file]

expect 命令可以通过两种方式使用:

  1. 交互模式:你可以不带任何参数启动 expect 命令,它将进入交互模式,你可以在其中输入命令并查看输出。
expect
  1. 脚本模式:你可以提供一个脚本文件作为 expect 命令的参数,它将执行脚本中的命令。
expect my_script.exp

在脚本模式下,expect 命令使用一种特定领域语言来定义预期的输出和相应的操作。expect 脚本的基本结构如下:

#!/usr/bin/expect -f

set timeout 10
spawn ssh user@host
expect "password:"
send "mypassword\r"
expect "$"
send "ls -l\r"
expect eof

在这个示例中,expect 脚本:

  • 设置超时时间为 10 秒
  • 生成一个 SSH 会话连接到远程主机
  • 等待 "password:" 提示
  • 发送密码
  • 等待 shell 提示符
  • 执行 ls -l 命令
  • 等待脚本结束 (eof)

这只是一个简单的示例,但 expect 命令可以用于自动化更复杂的交互。

使用 expect 自动化 SSH 登录

在这一步中,你将学习如何使用 expect 命令来自动化 SSH 登录过程。

让我们首先创建一个 expect 脚本来实现 SSH 登录的自动化:

#!/usr/bin/expect -f

set timeout 10
set host "example.com"
set user "myuser"
set password "mypassword"

spawn ssh $user@$host
expect "password:"
send "$password\r"
expect "$"
send "echo 'SSH login successful!'\r"
expect eof

在这个脚本中:

  • 我们将超时时间设置为 10 秒
  • 定义了主机、用户和密码变量
  • 使用 spawn 命令生成 SSH 会话
  • 使用 expect 命令等待 "password:" 提示
  • 使用 send 命令发送密码
  • 使用 expect 命令等待 shell 提示符
  • 执行 echo 命令以验证 SSH 登录
  • 使用 expect eof 命令等待脚本结束

将此脚本保存为 ssh_login.exp,并放置在 ~/project 目录中。

现在,让我们使脚本可执行并运行它:

chmod +x ~/project/ssh_login.exp
~/project/ssh_login.exp

你应该会看到以下输出:

SSH login successful!

这展示了如何使用 expect 命令自动化 SSH 登录过程,从而消除手动干预的需求。

expect 脚本中处理提示和响应

在这一步中,你将学习如何在 expect 脚本中处理不同类型的提示和响应。

让我们创建一个新的 expect 脚本来演示如何处理各种提示和响应:

#!/usr/bin/expect -f

set timeout 10
set host "example.com"
set user "myuser"
set password "mypassword"

spawn ssh $user@$host
expect {
    "password:" {
        send "$password\r"
        expect "$"
    }
    "yes/no" {
        send "yes\r"
        expect "$"
    }
    "$" {
        send "echo 'SSH login successful!'\r"
        expect "$"
    }
    timeout {
        puts "SSH login timed out"
        exit 1
    }
}

send "exit\r"
expect eof

在这个脚本中,我们使用 expect 命令和一组 expect 语句块来处理不同类型的提示:

  1. 如果脚本遇到 "password:" 提示,它会发送密码并等待 shell 提示符。
  2. 如果脚本遇到 "yes/no" 提示,它会发送 "yes" 并等待 shell 提示符。
  3. 如果脚本遇到 shell 提示符 ($),它会执行 echo 命令以验证 SSH 登录。
  4. 如果脚本遇到超时,它会打印一条消息并以错误代码退出。

最后,脚本发送 exit 命令以关闭 SSH 会话,并等待脚本结束 (expect eof)。

将此脚本保存为 handle_prompts.exp,并放置在 ~/project 目录中。

现在,让我们使脚本可执行并运行它:

chmod +x ~/project/handle_prompts.exp
~/project/handle_prompts.exp

你应该会看到以下输出:

SSH login successful!

这展示了如何使用 expect 命令在脚本中处理不同类型的提示和响应,从而使脚本更加健壮和适应性强。

总结

在本实验中,你学习了 Linux 中 expect 命令的用途和语法。expect 命令是一个强大的工具,允许你自动化交互式命令行应用程序,例如 SSH、FTP 等。你学习了如何安装 expect 包并探索 expect 命令的基本语法,包括交互模式和脚本模式。此外,你还学习了如何使用 expect 命令自动化 SSH 登录,并在 expect 脚本中处理提示和响应。

Linux 命令速查表

您可能感兴趣的其他 Linux 教程