本文介绍如何在 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.")}? 关键优势说明: 幻导航网 发现优质实用网站,开启网络探索之旅!
相关推荐
IpdataCloud7 分钟前
AI智能体调用工具怎么核验来源IP?归属地、网络类型与代理风险识别(含Python代码)曹牧22 分钟前
Java:SQL 注入漏洞2601_9669496531 分钟前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据蒸鱼Yuzheng35 分钟前
Python 游戏测试开发怎么准备:日志解析、接口校验、并发与可维护性Ivanqhz1 小时前
BM1688 双核架构程序员JerrySUN1 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】Java后端的Ai之路1 小时前
Python进阶探索17 - Python中的深拷贝与浅拷贝oradh1 小时前
Oracle Undo问题总结(ORA-600 [4xxx] 系列错误)达梦数据1 小时前
DMDRS辅助表生成规则与作用ദ്ദിᵔ.˛.ᵔ₎2 小时前
MySQL 表约束