goexpect
是一个用于自动化交互式应用程序的库,如 ssh 或 telnet 对话,或其他命令行工具。这在自动化中非常有用
为了使用 goexpect
,首先需要安装它。这可以通过运行 go get github.com/google/goexpect
命令在你的项目中导入 goexpect
。
以下是一个简单的例子:
代码语言:javascript复制package main
import (
"fmt"
"log"
"os"
"regexp"
"time"
expect "github.com/google/goexpect"
)
const (
sshUser = "ops1"
sshAddr = "10.0.0.21"
password = "ops1"
timeout = 10 * time.Minute
)
func main() {
// 创建一个 logger 对象
logger := log.New(os.Stdout, "goexpect: ", log.LstdFlags)
// 建立 SSH 会话
exp, _, err := expect.Spawn(fmt.Sprintf("ssh %s@%s", sshUser, sshAddr), timeout, expect.Verbose(true), expect.VerboseWriter(logger.Writer()))
if err != nil {
log.Fatal(err)
}
defer exp.Close()
// 等待 "password:" 提示符并发送密码
_, _, err = exp.Expect(regexp.MustCompile("password:"), timeout)
if err != nil {
log.Fatal(err)
}
exp.Send(password "n")
// 等待 shell 提示符
_, _, err = exp.Expect(regexp.MustCompile("[$#] "), timeout)
if err != nil {
log.Fatal(err)
}
// 使用 "su -" 命令切换到 root 用户
exp.Send("su -n")
// 等待 "Password:" 提示符并发送 root 用户的密码
_, _, err = exp.Expect(regexp.MustCompile("Password:"), timeout)
if err != nil {
log.Fatal(err)
}
exp.Send("www_2023n")
// 等待 root 用户的 shell 提示符
_, _, err = exp.Expect(regexp.MustCompile("root@.*[#] "), timeout)
if err != nil {
log.Fatal(err)
}
// 执行 "uptime" 命令
exp.Send("uptimen")
// 获取 "uptime" 命令的输出
output, _, err := exp.Expect(regexp.MustCompile(".*n"), timeout)
if err != nil {
log.Fatal(err)
}
// 打印 "uptime" 命令的输出
fmt.Println(output)
}
Expect
函数的第一个参数是一个正则表达式,它定义了我们期待从goexpect
会话中获取的输出。在这个例子中,我们期待 "password:","[$#] ","root@.[#] "和 ".n"(匹配任何一行输出)等提示符或输出。Expect
函数的第二个参数是超时时间,如果在这个时间内没有匹配到期望的输出,Expect
函数将返回一个错误。Send
函数用于发送命令或输入到goexpect
会话中。- 使用
fmt.Println
或其他函数打印 "uptime" 命令的输出。
输出示例:
代码语言:javascript复制Sent: "uptimen"
Match for RE: ".*n" found: [" 13:45:58 up 208 days, 3:42, 3 users, load average: 0.02, 0.06, 0.09n"] Buffer: 13:45:58 up 208 days, 3:42, 3 users, load average: 0.02, 0.06, 0.09
13:45:58 up 208 days, 3:42, 3 users, load average: 0.02, 0.06, 0.09
如果你有任何问题请留意!