【发布时间】:2021-08-17 08:46:51
【问题描述】:
我使用ssh package 连接到Linux 服务器并检索命令的输出。我为此编写的辅助函数如下:
func sshRunCommand(host string, command string) (output string, err error) {
keyData, err := ioutil.ReadFile("srv.private.openssh")
if err != nil {
return "", err
}
key, err := ssh.ParsePrivateKey(keyData)
if err != nil {
return "", err
}
// Authentication
config := &ssh.ClientConfig{
User: "root",
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Auth: []ssh.AuthMethod{
ssh.PublicKeys(key),
},
}
// Connect
client, err := ssh.Dial("tcp", net.JoinHostPort(host, "22"), config)
if err != nil {
return "", err
}
// Create a session. It is one session per command.
session, err := client.NewSession()
if err != nil {
return "", err
}
defer session.Close()
var b bytes.Buffer
session.Stdout = &b // ???? this is the place I am concerned with
// Finally, run the command
err = session.Run(command)
return b.String(), err
}
此命令通常工作正常:它始终连接但随机不返回输出。
在进一步调查之前,我想确保在返回输出之前刷新输出缓冲区。是这样吗?
【问题讨论】:
-
如果操作系统是 Linux,只有 stderr 保证被刷新,而不是 stdout AFAIK。
-
尝试检查 stderr 是否有任何输出。任何 io 问题都应作为错误从
Session.Run返回。