前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 GoExpect 进行 SSH 会话管理

使用 GoExpect 进行 SSH 会话管理

作者头像
运维开发王义杰
发布2023-08-10 16:24:51
4630
发布2023-08-10 16:24:51
举报

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_2023\n")

  // 等待 root 用户的 shell 提示符
  _, _, err = exp.Expect(regexp.MustCompile("root@.*[#] "), timeout)
  if err != nil {
    log.Fatal(err)
  }

  // 执行 "uptime" 命令
  exp.Send("uptime\n")

  // 获取 "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: "uptime\n"
Match for RE: ".*\n" found: [" 13:45:58 up 208 days,  3:42,  3 users,  load average: 0.02, 0.06, 0.09\n"] 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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发王义杰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档