第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用不帶命令的 PTY

使用不帶命令的 PTY

Go
小唯快跑啊 2022-12-26 16:37:46
我在 creack/pty 中為這個(gè)問題打開了一個(gè)問題,但實(shí)際上我認(rèn)為它可能屬于這里,因?yàn)樗赡芨嗟嘏c我對(duì)庫的使用有關(guān),而不是庫的任何問題。我正在使用一個(gè)websocket api,它發(fā)送 stdin 消息并從命令接收 stdout 和 stderr 輸出以及退出代碼。比如這個(gè)API用在web UI中,發(fā)送和接收的消息串如下此 Web UI 使用xterm.js提供類似終端的輸入 ui,并將響應(yīng)(包括 ansi 轉(zhuǎn)義序列)解釋為終端輸出。我正在構(gòu)建一個(gè)終端應(yīng)用程序,它希望利用相同的 API,因此類似于“終端中的終端”,其中將標(biāo)準(zhǔn)輸入發(fā)送到 API,并在我的應(yīng)用程序中呈現(xiàn)接收到的響應(yīng)。我想使用 creack/pty 作為響應(yīng)解釋器,處理 ansi 轉(zhuǎn)義序列等,并持有終端會(huì)話的視圖,我可以將其讀入字符串并呈現(xiàn)到我的應(yīng)用程序的屏幕上。所以流程大致是這樣的:stdin 發(fā)送到 websocket 連接收到回復(fù)寫對(duì) pty 的回應(yīng)讀取整個(gè) pty 到字符串將字符串渲染到屏幕重復(fù)如果我以這種方式使用 creack/pty,我實(shí)際上沒有啟動(dòng)命令 - 它只是一個(gè)很好的框,可以為我解釋 ansi 轉(zhuǎn)義序列并允許我檢索終端的當(dāng)前“字符串視圖”。這是我嘗試獲取無命令 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())}我收到以下錯(cuò)誤? go run test.gopanic: write /dev/ptmx: input/output errorgoroutine 1 [running]:main.main()        test.go:52 +0x19cexit status 2我正在努力做的事情是理智的嗎?有沒有更好的方法來實(shí)現(xiàn)我的目標(biāo)?
查看完整描述

1 回答

?
隔江千里

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊

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


這是我的意思的一個(gè)例子的部分片段。您的 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)

    }

}()


查看完整回答
反對(duì) 回復(fù) 2022-12-26
  • 1 回答
  • 0 關(guān)注
  • 112 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)