将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
相关产品推荐
相关产品推荐

