You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:39:27