这是一个最小的工作示例:
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/layout"
"github.com/fyne-io/terminal"
"log/slog"
"os"
"os/exec"
"sync"
)
func main() {
err := runMain()
if err != nil {
slog.Error(err.Error())
os.Exit(1)
}
}
func runMain() error {
wg := sync.WaitGroup{}
wg.Add(1)
term := terminal.New()
go func() {
var err error
// This works
// err = term.RunLocalShell()
// This does not work, blank screen...
cmd := exec.Command("/usr/bin/bash")
si, err := cmd.StdinPipe()
if err != nil {
slog.Error(err.Error())
os.Exit(1)
}
so, err := cmd.StdoutPipe()
if err != nil {
slog.Error(err.Error())
os.Exit(1)
}
err = cmd.Start()
if err != nil {
slog.Error(err.Error())
os.Exit(1)
}
slog.Info("started", "pid", cmd.Process.Pid)
err = term.RunWithConnection(si, so)
if err != nil {
slog.Error(err.Error())
}
wg.Done()
}()
a := app.New()
go func() {
wg.Wait()
a.Quit()
}()
w := a.NewWindow("Test")
w.SetContent(container.New(layout.NewStackLayout(), term))
w.ShowAndRun()
return nil
}
这样term.RunLocalShell()
就可以了,但是手动连接 os.Exec 调用的 stdout 和 stdinterm.RunWithConnection(in, out)
不起作用。它显示一个空白屏幕,根本没有错误消息。
这里有什么问题?
我可以看到 terminal.RunLocalShell 调用 terminal.open() 并使用 github.com/creack/pty 创建 pty。但是,terminal.pty 不是公共字段,无法从外部访问。我的目标是远程运行 shell 命令,并将其显示在本地终端仿真器中。例如,给出的示例真的很简单,实际上 stdin 和 stdout 是通过 TCP 连接到远程进程的管道。
如果目标是远程系统,我建议检查一下我使用 fyne 终端库编写的 SSH 应用程序 - 它可能会满足您的需要。
https://github.com/andydotxyz/sshterm/blob/57557c8e6ab083370f00acd21d228b0bbd692518/main.go#L170