亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用不帶命令的 PTY

使用不帶命令的 PTY

Go
小唯快跑啊 2022-12-26 16:37:46
我在 creack/pty 中為這個問題打開了一個問題,但實際上我認為它可能屬于這里,因為它可能更多地與我對庫的使用有關,而不是庫的任何問題。我正在使用一個websocket api,它發送 stdin 消息并從命令接收 stdout 和 stderr 輸出以及退出代碼。比如這個API用在web UI中,發送和接收的消息串如下此 Web UI 使用xterm.js提供類似終端的輸入 ui,并將響應(包括 ansi 轉義序列)解釋為終端輸出。我正在構建一個終端應用程序,它希望利用相同的 API,因此類似于“終端中的終端”,其中將標準輸入發送到 API,并在我的應用程序中呈現接收到的響應。我想使用 creack/pty 作為響應解釋器,處理 ansi 轉義序列等,并持有終端會話的視圖,我可以將其讀入字符串并呈現到我的應用程序的屏幕上。所以流程大致是這樣的:stdin 發送到 websocket 連接收到回復寫對 pty 的回應讀取整個 pty 到字符串將字符串渲染到屏幕重復如果我以這種方式使用 creack/pty,我實際上沒有啟動命令 - 它只是一個很好的框,可以為我解釋 ansi 轉義序列并允許我檢索終端的當前“字符串視圖”。這是我嘗試獲取無命令 pty、寫入并從中讀取的嘗試:package mainimport (    "bytes"    "fmt"    "github.com/creack/pty"    "io"    "os")func getPtyWithoutCommand() (*os.File, error) {    // this function just pty.StartWithAttrs with command-specific stuff commented out    pty, tty, err := pty.Open()    if err != nil {        return nil, err    }    defer func() { _ = tty.Close() }() // Best effort.    // if sz != nil {    //  if err := Setsize(pty, sz); err != nil {    //      _ = pty.Close() // Best effort.    //      return nil, err    //  }    // }    // if c.Stdout == nil {    //  c.Stdout = tty    // }    // if c.Stderr == nil {    //  c.Stderr = tty    // }    // if c.Stdin == nil {    //  c.Stdin = tty    // }    //    // c.SysProcAttr = attrs    //    // if err := c.Start(); err != nil {    //  _ = pty.Close() // Best effort.    //  return nil, err    // }    return pty, err}func main() {    myPty, err := getPtyWithoutCommand()    if err != nil {        panic(err)    }    _, err = myPty.Write([]byte("test\n"))    if err != nil {        panic(err)    }    _, err = myPty.Write([]byte{4}) // EOT    if err != nil {        panic(err)    }    buf := new(bytes.Buffer)    _, err = io.Copy(buf, myPty)    if err != nil {        panic(err)    }    fmt.Println(buf.String())}我收到以下錯誤? go run test.gopanic: write /dev/ptmx: input/output errorgoroutine 1 [running]:main.main()        test.go:52 +0x19cexit status 2我正在努力做的事情是理智的嗎?有沒有更好的方法來實現我的目標?
查看完整描述

1 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

我正在處理一個類似的問題,而 creack 的 pty 可能對于你想要的東西來說有點太抽象了。我剛剛使用了 golang 標準 xterm 終端仿真器https://pkg.go.dev/golang.org/x/term和一個管道。


這是我的意思的一個例子的部分片段。您的 stdin 流被送入stdin_writer并且您的 stdout 被寫入writer,不要忘記Flush()!


stdin_reader, stdin_writer := io.Pipe()

reader := bufio.NewReader(stdin_reader)


stdout_writer := bytes.Buffer{}

writer := bufio.NewWriter(&stdout_writer)


rw := bufio.NewReadWriter(reader, writer)

t := term.NewTerminal(rw, prompt)


// constantly be reading lines

go func() {

    for {

        line, err := t.ReadLine()

        if err == io.EOF {

            log.Printf("got EOF")

        }

        if err != nil {

            log.Printf("got err")

        }

        if line == "" {

            continue

        }

        log.Printf("LINE: %s", line)

    }

}()


查看完整回答
反對 回復 2022-12-26
  • 1 回答
  • 0 關注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號