使用 GoExpect 进行 SSH 会话管理

2023-08-10 16:24:51 浏览数 (1)

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

如果你有任何问题请留意!

0 人点赞