如何在 Go 中安全高效地将 SSH 公钥复制到远程服务器

本文介绍使用 Go 标准库 os/exec 直接将本地 SSH 公钥写入远程服务器 ~/.ssh/authorized_keys 的正确方法,避免 shell 字符串拼接风险,兼容 macOS/Linux 环境,且不依赖 ssh-copy-id。 本文介绍使用 go 标准库 `os/exec` 直接将本地 ssh 公钥写入远程服务器 `~/.ssh/authorized_keys` 的正确方法,避免 shell 字符串拼接风险,兼容 macos/linux 环境,且不依赖 `ssh-copy-id`。在 Go 中通过命令行方式(如 cat key.pub | ssh user@host 'cat >> ~/.ssh/authorized_keys')实现公钥分发看似直观,但原代码存在多个关键问题: ? 错误调用 exec.Command(identity, address):将两个独立命令(cat ... 和 ssh ...)作为参数传给单个 exec.Command,实际会尝试执行名为 cat /home/foo/.ssh/foobar.pub 的二进制文件(显然不存在); ? 未正确构建管道逻辑:Go 的 exec.Command 不会自动解析 shell 管道符 |,需显式设置 Stdin; ? 路径硬编码与拼接风险:~/.shh/authorized_keys(注意 typo:shh 应为 ssh)和字符串格式化易引入路径注入或权限错误; ? 忽略 SSH 连接前置条件:如目标用户 .ssh 目录权限(应为 700)、authorized_keys 文件权限(推荐 600),否则 OpenSSH 会拒绝加载。? 正确做法是:用 Go 原生读取公钥文件内容,并将其作为 stdin 流式传递给 ssh 进程。这样既规避了 shell 解析的不确定性,又提升安全性与可移植性。以下是完整、健壮的实现:import ( "io" "log" "os" "os/exec" "path/filepath")func copySSHPubKeyToServer(username, hostname, keyName string) error { // 1. 构建公钥文件路径(使用 filepath.Join 避免路径拼接漏洞) homeDir := os.Getenv("HOME") if homeDir == "" { return fmt.Errorf("HOME environment variable not set") } keyPath := filepath.Join(homeDir, ".ssh", keyName+".pub") // 2. 打开公钥文件 keyFile, err := os.Open(keyPath) if err != nil { return fmt.Errorf("failed to open public key %s: %w", keyPath, err) } defer keyFile.Close() // 3. 构建 ssh 命令:注意目标路径必须为 ~/.ssh/authorized_keys(修正 typo) // 使用绝对路径更可靠(如 $HOME/.ssh/authorized_keys),但 ~ 在 ssh 上下文中通常可被服务端 shell 展开 sshTarget := username + "@" + hostname cmd := exec.Command("ssh", sshTarget, "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys") // 4. 将公钥文件设为命令标准输入 cmd.Stdin = keyFile // 5. 捕获输出以便调试 output, err := cmd.CombinedOutput() if err != nil { log.Printf("SSH command failed (output: %s)", string(output)) return fmt.Errorf("failed to copy SSH key to %s: %w", sshTarget, err) } log.Printf("Successfully added %s.pub to %s's authorized_keys", keyName, sshTarget) return nil}? 关键注意事项: RedClaw 百度推出的手机端万能AI Agent助手

相关推荐
GuWenyue3 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
想会飞的蒲公英4 小时前
计算机怎样读取中文文本:编码、清洗与标准化
人工智能·python·自然语言处理
Miao121315 小时前
某海外住宿平台如何在大规模场景下实现指标一致性:Minerva 指标平台实践
大数据·数据库·人工智能
SeaTunnel5 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
CodexDave5 小时前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
深度研习笔记5 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
碎光拾影5 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
曾阿伦5 小时前
MongoDB 查询语句备忘手册
数据库·mongodb
一叶龙洲5 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
CCPC不拿奖不改名5 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github