Go pty handling https://github.com/creack/pty

Joel Sing 0d412c9fbe Provide correct pty/tty file paths on OpenBSD (#148) 3 months ago
.github 6eb8749846 Remove go 1.6 on macos test run (#143) 4 months ago
.gitignore 12319125d6 initial 11 years ago
Dockerfile.golang 060a4be6ce Update cross compile test for go1.16 1 year ago
Dockerfile.riscv 060a4be6ce Update cross compile test for go1.16 1 year ago
LICENSE 8a22c94093 s/kr/creack/ in README 3 years ago
README.md ab4a70c372 Closes #111. Close chan in README example. 1 year ago
asm_solaris_amd64.s f73a158a9a Simplify solaris implementation. (#120) 1 year ago
doc.go 060a4be6ce Update cross compile test for go1.16 1 year ago
doc_test.go 0d412c9fbe Provide correct pty/tty file paths on OpenBSD (#148) 3 months ago
go.mod f73a158a9a Simplify solaris implementation. (#120) 1 year ago
ioctl.go d301b27172 fix aix compile error (#144) 4 months ago
ioctl_bsd.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ioctl_solaris.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ioctl_unsupported.go d301b27172 fix aix compile error (#144) 4 months ago
mktypes.bash e9fe422625 Add support for NetBSD 386/amd64/arm (#117) 1 year ago
pty_darwin.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
pty_dragonfly.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
pty_freebsd.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
pty_linux.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
pty_netbsd.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
pty_openbsd.go 0d412c9fbe Provide correct pty/tty file paths on OpenBSD (#148) 3 months ago
pty_solaris.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
pty_unsupported.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
run.go a24f8808b5 Fix windows compilation (#142) 4 months ago
start.go a24f8808b5 Fix windows compilation (#142) 4 months ago
start_windows.go d301b27172 fix aix compile error (#144) 4 months ago
test_crosscompile.sh edfd13da2a Remove ppc from freebsd as it is not available in go1.18beta1. Check error in Getsize(). (#137) 6 months ago
types.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
types_dragonfly.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
types_freebsd.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
types_netbsd.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
types_openbsd.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
winsize.go edfd13da2a Remove ppc from freebsd as it is not available in go1.18beta1. Check error in Getsize(). (#137) 6 months ago
winsize_unix.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
winsize_unsupported.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_386.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_amd64.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_arm.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_arm64.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_dragonfly_amd64.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_freebsd_386.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_freebsd_amd64.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_freebsd_arm.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_freebsd_arm64.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_freebsd_ppc64.go 819195d464 Add support for freebsd/ppc64 (#126) 10 months ago
ztypes_loong64.go b135084511 Rename loongarchx to loong64. (#130) 9 months ago
ztypes_mipsx.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_netbsd_32bit_int.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_openbsd_32bit_int.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_ppc64.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_ppc64le.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_riscvx.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago
ztypes_s390x.go 7de28cee0d Add GHA workflow to run test_crosscompile and go test (#141) 4 months ago

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