我需要在两个系统A和B之间交换公钥。
以下是
的步骤但文件authorized_keys由root拥有。因此我得到了许可错误。
我无法以root身份连接到系统B.唯一的方法是以ubuntu连接并更改为root。
我尝试了以下shell脚本
# Get all the Ips from the source file
sudo grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' $1 | sort -u > /tmp/list_of_servers.txt
# Get the public key
pubkey=$(sudo cat /root/.ssh/id_rsa.pub)
# For each server
while read ip;
do
(echo "$ip"
# ssh to the server
ssh -i $2 $3@$ip
# append key to autorized_keys file
sudo -c "echo $pubkey >> /root/.ssh/authorized_keys" root
echo "done $ip" )
done < /tmp/list_of_servers.txt
但我没有工作。它给了我许可错误。
有人可以在最后一步帮助我。
答案 0 :(得分:1)
对SSH连接机制的一种完全偏执的方法可能是这样的:
# generate a shell-escaped version of the public key (spaces, wildcards, etc)
printf -v pubkey_q '%q' "$pubkey"
# generate a shell command using that quoted form
cmd="echo $pubkey_q >>/root/.ssh/authorized_keys"
# generate a shell-quoted sudo command invoking the above in a shell
printf -v cmd_q '%q ' sudo bash -c "$cmd"
# ...and execute it on the other end of a ssh connection.
ssh -i "$2" "$3@$ip" "$cmd_q"
printf %q
是一个bash扩展,它以一种shell解析方式转义字符串 - 无论是在eval
'的字符串中,是否使用bash传递给ssh
作为远程shell,或传递给bash -c
- 评估回原始数据。 (对于常规空格,其输出对sh -c
也是安全的,但对于任何bash更喜欢$''
转义不可打印字符的内容,此输出可能不符合POSIX。
答案 1 :(得分:0)
此代码不符合您的预期:
# ssh to the server
ssh -i $2 $3@$ip
# append key to autorized_keys file
sudo -c "echo $pubkey >> /root/.ssh/authorized_keys" root
ssh命令通常会打开一个交互式远程shell,但由于我们在脚本中,因此无法使用交互式shell。所以远程shell会立即退出,而实际上根本没有做任何事情。
后面的sudo命令是不正确的语法,它不能以-c
标志的方式工作。查看sudo
的手册页。而且,由于您实际上并不是您可能已经相信的遥控器,因此该命令在您的本地系统中运行,而不是您想要附加密钥的远程命令。
要远程运行sudo,请使用以下内容:
ssh -i $2 $3@$ip sudo echo hello
回声只是测试的一个例子。
然而,在授权的root列表中附加公钥的整个尝试在安全性方面存在严重缺陷。 Sudo应配置为询问用户的密码,并且没有好的方法在脚本中执行此操作。或者,如果用户无需输入密码即可运行sudo,从安全角度来看,这是不可接受的。