吴小白 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
..
.gitignore e5d28115ee vendor: regenerate 3 年之前
Dockerfile.golang 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
Dockerfile.riscv 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
LICENSE 0595c01718 switch kr/pty to creack/pty v1.1.7 6 年之前
README.md 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
asm_solaris_amd64.s 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
doc.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ioctl.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ioctl_bsd.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ioctl_solaris.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ioctl_unsupported.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
mktypes.bash 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
pty_darwin.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
pty_dragonfly.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
pty_freebsd.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
pty_linux.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
pty_netbsd.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
pty_openbsd.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
pty_solaris.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
pty_unsupported.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
run.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
start.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
start_windows.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
test_crosscompile.sh 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
winsize.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
winsize_unix.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
winsize_unsupported.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_386.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_amd64.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_arm.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_arm64.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_dragonfly_amd64.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_freebsd_386.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_freebsd_amd64.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_freebsd_arm.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_freebsd_arm64.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_freebsd_ppc64.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_loong64.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_mipsx.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_netbsd_32bit_int.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_openbsd_32bit_int.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_ppc64.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_ppc64le.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_riscvx.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前
ztypes_s390x.go 4876c09b2a build(deps): bump github.com/creack/pty from v1.1.11 to v1.1.18 2 年之前

README.md

pty

Pty is a Go package for using unix pseudo-terminals.

Install

go get github.com/creack/pty

Examples

Note that those examples are for demonstration purpose only, to showcase how to use the library. They are not meant to be used in any kind of production environment.

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)
        }
}