# Golang expect包怎么使用
## 什么是expect包
`expect`是一個用于自動化交互式命令行程序的Go語言庫,靈感來源于Unix的`expect`工具。它允許開發者模擬用戶輸入,并根據程序輸出進行條件匹配和響應,常用于測試或自動化運維場景。
## 安裝expect包
通過go get安裝:
```bash
go get github.com/Netflix/go-expect
c, err := expect.NewConsole(expect.WithStdout(os.Stdout))
if err != nil {
log.Fatal(err)
}
defer c.Close()
// 發送命令
_, err = c.Send("ls -l\n")
if err != nil {
log.Fatal(err)
}
// 等待特定輸出
_, err = c.ExpectString("total")
if err != nil {
log.Fatal(err)
}
// 匹配密碼提示并自動響應
_, err = c.ExpectString("Password:")
if err != nil {
log.Fatal(err)
}
_, err = c.SendLine("mypassword")
// 使用正則匹配輸出
match, err := c.Expect(expect.RegexpPattern(`\d+ files`))
fmt.Printf("Found: %s\n", match)
// 設置5秒超時
_, err = c.ExpectString("login:", expect.WithTimeout(5*time.Second))
// 匹配成功或失敗
result, err := c.Expect(
expect.String("Login successful"),
expect.String("Login failed"),
)
func TestSSHLogin(t *testing.T) {
c, err := expect.NewConsole()
// 錯誤處理省略...
go func() {
c.Send("ssh user@host\n")
c.ExpectString("password:")
c.SendLine("secret")
c.ExpectString("$ ")
c.Send("exit\n")
c.ExpectEOF()
}()
cmd := exec.Command("bash")
cmd.Stdin = c.Tty()
cmd.Stdout = c.Tty()
cmd.Stderr = c.Tty()
cmd.Run()
}
終端模式問題:
expect.WithTermSize(cols, rows)
設置虛擬終端尺寸特殊字符處理:
Send(string)
而非SendLine()
并發安全:
特性 | go-expect | pexpect (Python) | 內置testing |
---|---|---|---|
跨平臺支持 | ? | ? | ? |
正則支持 | ? | ? | ? |
交互復雜度 | 高 | 高 | 低 |
go-expect包為Golang提供了強大的交互式命令行自動化能力,特別適合: - CLI工具測試 - 自動化運維腳本 - 復雜交互流程驗證
通過合理的輸出匹配和輸入模擬,可以構建穩定的自動化測試套件。其API設計簡潔,與Go的標準庫良好集成,是Golang生態中處理交互式命令的首選方案。
注意:實際使用時請根據具體需求添加錯誤處理和日志記錄 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。