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

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