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

将SSH私钥从变量写入文件时的格式问题求助

解决SSH私钥从变量写入文件时保留换行的问题

核心解决方案:带引号输出变量并设置正确权限

直接用带双引号的echo输出变量,即可保留原始换行格式,同时必须设置私钥文件的权限为600(SSH强制要求):

# 正确赋值(bash中双引号会保留换行)
ID_RSA="-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END RSA PRIVATE KEY-----"

# 带双引号输出,保留换行
echo "$ID_RSA" > ~/.ssh/id_rsa

# 设置私钥权限为600,否则SSH会拒绝使用
chmod 600 ~/.ssh/id_rsa

为什么之前的方法无效?

  • 直接用echo $ID_RSA时,bash会对未加引号的变量做单词拆分:把换行、制表符、连续空格全部替换成单个空格,导致输出变成单行。
  • 用sed 's/ /\n/g'的错误在于,它会把密钥首尾标识里的正常空格也替换成换行,破坏了SSH私钥的格式规范。

解决ssh-add报错的问题

如果执行ssh-add时报错,先确保ssh-agent已启动,再执行添加命令:

# 启动ssh-agent
eval $(ssh-agent -s)

# 从变量添加私钥(注意变量名要匹配你定义的)
ssh-add - <<< "$ID_RSA"
# 或者从文件添加(更稳妥)
ssh-add ~/.ssh/id_rsa

GitLab CI部署适配

后续在GitLab中部署时,直接将私钥存入CI/CD变量(类型选Variable),然后在.gitlab-ci.yml中执行以下步骤:

deploy_job:
  script:
    - mkdir -p ~/.ssh
    - echo "$ID_RSA" > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa
    - eval $(ssh-agent -s)
    - ssh-add ~/.ssh/id_rsa
    # 执行你的SSH操作,比如远程部署

注意在GitLab变量中粘贴私钥时,直接保留原始换行即可,GitLab会正确存储格式。

内容的提问来源于stack exchange,提问作者Andrew Metelkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:30:50