我正在尝试使用下面的脚本将文件(包含密钥)复制到远程计算机。但出现下面的错误
/root/.ssh/authorized_keys:权限被拒绝
#!/bin/bash
for i in `cat hosts`
do cat team.keys | sshpass -f pass ssh -t -o "StrictHostKeyChecking no" normal_user@ad@${i} "sudo cat >> /root/.ssh/authorized_keys";
done
-- 请分享您的建议以确定解决方案。
答案1
sudo cat >> /root/.ssh/authorized_keys
该命令不会执行您认为的操作。
shell(以普通用户身份运行)将在开始执行命令之前实现重定向sudo cat
。因此,重定向以非 root 用户身份发生,该用户显然没有写入 rootauthorized_keys
文件的权限。
标准解决方法是使用tee
带有 sudo 的命令:
#!/bin/bash
for i in $(cat hosts)
do cat team.keys | sshpass -f pass ssh -t -o "StrictHostKeyChecking no" \
normal_user@ad@${i} "sudo tee -a /root/.ssh/authorized_keys >/dev/null"
done
在此版本中,运行 as 的远程 shellnormal_user@ad
将执行命令 as sudo <some parameters for sudo> >/dev/null
,并且该sudo
命令将获得 root 访问权限并执行tee /root/.ssh/authorized_keys
。
该tee
命令将接收从标准输入通过管道传入的密钥,并将其输入的一个副本写入文件/root/.ssh/authorized_keys
(它可以这样做,因为它以 root 身份运行),并将另一个副本传递到标准输出。额外的副本返回到第一个以 运行的远程 shell normal_user@ad
,然后将其发送到/dev/null
。