使用期望自动化telnet会话
Contents
1. 概述
在这个简短的教程中,我们将讨论 使用expect命令自动执行telnet 会话的不同方法。
2. expect脚本
expect程序提供了一种自动化交互式程序的方法。它能够调用一个或多个程序,模拟用户通过标准终端操作它们。
expect还提供了一种特殊的语言,允许我们编写与受控程序的对话脚本。一般来说,程序将围绕向受控程序发送输入和等待特定输出的想法为中心。
接下来,我们将讨论如何使用expect来自动化 telnet 会话的示例。
2.1. 登录服务器
telnet在很大程度上已被更安全的ssh取代,成为远程主机连接的首选协议。
但是,telnet具有一些优势。例如,它是一种适用于低功率设备的轻量级协议。此外,在安全网络中,更安全的协议提供的收益可能是微不足道的。
在下面的脚本中,expect调用telnet自动登录主机:
#!/usr/bin/expect
set timeout 5
set host [lindex $argv 0]
set port [lindex $argv 1]
set login [lindex $argv 2]
set password [lindex $argv 3]
spawn telnet $host $port
expect "login: "
send "$login\r"
expect "password: "
send "$password\r"
interact
现在,让我们分析一下上面的脚本:
- 设置超时 5:被调用的程序(在我们的例子中是telnet)可能会挂起,或者我们正在等待的字符串可能不会出现。通过设置超时变量,我们确保expect只会等待指定的时间量,以秒为单位。
- 设置主机、端口和其他变量:这里我们使用*[lindex $argv index]*形式的语句来设置变量,其中调用者提供的值作为命令行参数
- spawn telnet $host $port:调用telnet传递主机和端口变量的值
- expect语句:指示expect等待特定的字符串模式出现在受控程序的输出中
- send语句:模拟用户输入一个值
- interact:将控制权传递给调用脚本的用户。现在,我们可以使用键盘与telnet交互 。
下面是我们如何调用脚本:
$ ./automate-telnet.sh localhost 23 myusername mypassword
2.2. 请求 HTTP 页面
当连接到 23 以外的端口时,telnet假定它没有连接到 telnet 服务器。然后,它不会尝试执行常规协议协商。
这允许我们将telnet用作通用 TCP/IP 客户端,以使用任意协议与服务器进行交互。
在下面的示例中,expect调用一个telnet 进程来建立到www.example.com 主机的 HTTP 连接:
#!/usr/bin/expect
set timeout 5
spawn telnet www.example.com 80
expect "Connected"
send "GET /index.html HTTP/1.1\r"
send "Host: www.example.com\r\r"
expect "</html>"
首先,expect脚本将等待“Connected”字符串(telnet可以建立连接的标志)。然后,它发送一个简单的GET请求并等待字符串“”,表示 HTML 输出结束。