creack/pty

GitHub: creack/pty

该包为 Go 提供 Unix 伪终端接口,使开发者能够启动和控制需要 PTY 环境的交互式命令行程序。

Stars: 2064 | Forks: 262

# pty Pty 是一个用于操作 unix 伪终端的 Go 包。 ## 安装 ``` go get github.com/creack/pty ``` ## 示例 请注意,这些示例仅用于演示目的,旨在展示如何使用该库。它们并不适合在任何生产环境中使用。 ### Command ``` package main import ( "io" "os" "os/exec" "github.com/creack/pty" ) func main() { c := exec.Command("grep", "--color=auto", "bar") f, err := pty.Start(c) if err != nil { panic(err) } go func() { f.Write([]byte("foo\n")) f.Write([]byte("bar\n")) f.Write([]byte("baz\n")) f.Write([]byte{4}) // EOT }() io.Copy(os.Stdout, f) } ``` ### Shell ``` package main import ( "io" "log" "os" "os/exec" "os/signal" "syscall" "github.com/creack/pty" "golang.org/x/term" ) func test() error { // Create arbitrary command. c := exec.Command("bash") // Start the command with a pty. ptmx, err := pty.Start(c) if err != nil { return err } // Make sure to close the pty at the end. defer func() { _ = ptmx.Close() }() // Best effort. // Handle pty size. ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGWINCH) go func() { for range ch { if err := pty.InheritSize(os.Stdin, ptmx); err != nil { log.Printf("error resizing pty: %s", err) } } }() ch <- syscall.SIGWINCH // Initial resize. defer func() { signal.Stop(ch); close(ch) }() // Cleanup signals when done. // Set stdin in raw mode. oldState, err := term.MakeRaw(int(os.Stdin.Fd())) if err != nil { panic(err) } defer func() { _ = term.Restore(int(os.Stdin.Fd()), oldState) }() // Best effort. // Copy stdin to the pty and the pty to stdout. // NOTE: The goroutine will keep reading until the next keystroke before returning. go func() { _, _ = io.Copy(ptmx, os.Stdin) }() _, _ = io.Copy(os.Stdout, ptmx) return nil } func main() { if err := test(); err != nil { log.Fatal(err) } } ```
标签:EVTX分析, Go, Ruby工具, 伪终端, 开发库, 日志审计, 系统接口