如何将SSH公钥变量内容追加到authorized_keys文件的新行?
解决SSH公钥追加无换行及文件安全问题
问题根源
你当前使用的命令中,echo $SSH_KEY 输出的内容如果本身末尾没有换行符,追加时就会和文件原有内容连在一起。另外,sudo echo ... >> $SSH_AUTHORIZED_KEYS_FILE 存在权限隐患:重定向操作>>是由当前用户执行的,而非sudo的root权限,若目标文件为root所有,可能会导致追加失败(你这里成功但无换行,说明文件权限允许当前用户写入,但仍有潜在风险)。
可靠解决方法
方法1:强制添加换行符
用printf替代echo,确保输出末尾带有换行,即使$SSH_KEY本身没有:
sudo printf '%s\n' "$SSH_KEY" >> "$SSH_AUTHORIZED_KEYS_FILE"
"%s\n"格式字符串会在公钥内容后强制添加一个换行- 给变量加双引号
"$SSH_KEY",避免空格或特殊字符被Shell解析破坏
方法2:用tee命令规避权限问题
如果目标文件是root权限,用sudo tee更可靠,同时保证换行:
printf '%s\n' "$SSH_KEY" | sudo tee -a "$SSH_AUTHORIZED_KEYS_FILE" > /dev/null
-a参数表示以追加模式写入,替代>>- 重定向到
/dev/null是避免tee在终端重复输出内容
方法3:先补全文件末尾换行(可选)
为彻底避免连行问题,可先检查目标文件末尾是否有换行,没有则先添加:
sudo bash -c ' if [ -s "$SSH_AUTHORIZED_KEYS_FILE" ] && [ "$(tail -c1 "$SSH_AUTHORIZED_KEYS_FILE")" != "" ]; then echo >> "$SSH_AUTHORIZED_KEYS_FILE" fi printf "%s\n" "$SSH_KEY" >> "$SSH_AUTHORIZED_KEYS_FILE" '
这个脚本会先判断文件非空且末尾无换行时,先添加一个空行,再追加公钥。
额外安全提示
- 确认
$SSH_KEY内容为合法SSH公钥,避免注入恶意内容 - 追加后建议修正文件权限:
sudo chmod 600 "$SSH_AUTHORIZED_KEYS_FILE",sudo chown $USER:$USER "$SSH_AUTHORIZED_KEYS_FILE"(根据实际用户调整),防止权限过大引发安全问题
内容的提问来源于stack exchange,提问作者user5405648
相关产品推荐
相关产品推荐

