本文介绍如何在 go 中绕过 shell 命令拼接,直接通过 os.open 读取本地公钥文件并以标准输入(stdin)方式传输至远程服务器的 authorized_keys,避免 shell 注入、路径错误与跨平台兼容性问题。 本文介绍如何在 go 中绕过 shell 命令拼接,直接通过 os.open 读取本地公钥文件并以标准输入(stdin)方式传输至远程服务器的 authorized_keys,避免 shell 注入、路径错误与跨平台兼容性问题。在自动化部署或基础设施管理场景中,经常需要通过 Go 程序将本地生成的 SSH 公钥安全地追加到远程 Linux/macOS 服务器的 ~/.ssh/authorized_keys 文件中。许多开发者最初尝试用 exec.Command 模拟终端管道命令(如 cat key.pub | ssh user@host 'cat >> ~/.ssh/authorized_keys'),但这种方式存在严重缺陷:不仅因字符串拼接易引发 shell 注入和路径解析错误(如示例中误写为 ~/.shh/authorized_keys),更因 exec.Command 的参数传递机制不支持 Unix 管道符 | ------ 它只会把整个字符串当作单一命令名执行,导致运行失败。正确的做法是解耦「读取」与「传输」逻辑:由 Go 直接打开公钥文件,再将其作为 stdin 注入 ssh 子进程。这样既规避了 shell 解析依赖,又确保了二进制安全传输(无换行截断、编码失真风险),且天然兼容 macOS、Linux 等不同系统。以下为推荐实现方案:import ( "log" "os" "os/exec" "path/filepath")func copySSHPubKeyToServer(pubKeyPath, userAtHost string) error { // 1. 安全读取公钥文件(自动处理路径) absPath, err := filepath.Abs(pubKeyPath) if err != nil { return err } file, err := os.Open(absPath) if err != nil { return err } defer file.Close() // 2. 构建 ssh 命令:注意目标路径应为 ~/.ssh/authorized_keys(非 .shh!) cmd := exec.Command("ssh", userAtHost, "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys") cmd.Stdin = file // 3. 执行并捕获输出(便于调试) output, err := cmd.CombinedOutput() if err != nil { log.Printf("SSH command failed: %s", string(output)) return err } return nil}// 使用示例func main() { homeDir := fileUtil.FindUserHomeDir() // 假设该工具函数已定义 pubKeyPath := filepath.Join(homeDir, ".ssh", "foobar.pub") userAtHost := "alice@example.com" if err := copySSHPubKeyToServer(pubKeyPath, userAtHost); err != nil { log.Fatal("Failed to install SSH key:", err) } log.Println("SSH public key successfully installed.")}? 关键优势说明: 幻导航网 发现优质实用网站,开启网络探索之旅!
相关推荐
顾林海30 分钟前
Agent入门阶段-编程基础-Python:流程控制呱呱复呱呱3 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的Nturmoils4 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT曲幽8 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API渣波8 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码荣码8 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面兵慌码乱18 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析金銀銅鐵19 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程FreakStudio1 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发用户0332126663671 天前
使用 Python 从零创建 Word 文档