Golang调用SSH连接远程主机成功后执行命令无响应挂起
问题原因及解决方案
你的问题出在没有将当前进程的标准输入(stdin)传递给ssh子进程。虽然你把ssh的输出和错误输出绑定到了终端,但输入无法传递过去,导致ssh进程一直在等待输入却接收不到任何内容,看起来就像挂起了。
修复后的代码
package main import ( "fmt" "os" "os/exec" ) func ssh(keyname string, user string, address string) { cmd := exec.Command("ssh", "-tt", user+"@"+address, "-i", "~/"+keyname) // 绑定标准输入、输出、错误流到当前进程的对应流 cmd.Stderr = os.Stderr cmd.Stdout = os.Stdout cmd.Stdin = os.Stdin // 新增这一行,让输入能传递给ssh进程 if err := cmd.Run(); err != nil { fmt.Println(err.Error()) } } func main() { ssh("example.pem", "ubuntu", "192.169.0.1") }
为什么直接终端SSH正常?
在终端直接执行ssh命令时,shell会自动将当前终端的stdin、stdout、stderr传递给ssh进程,所以输入和输出都能正常交互。但Go的exec.Command默认不会继承父进程的标准流,必须手动显式绑定这三个流才能实现完整的终端交互。
另外你用的-tt参数是正确的,它强制ssh分配伪终端,确保远程shell能正确处理交互(比如命令行编辑、颜色输出等),这部分无需修改。
内容的提问来源于stack exchange,提问作者badman
相关产品推荐
相关产品推荐

