修改root拥有的授权密钥文件时的权限错误

时间:2015-11-20 13:54:18

标签: bash shell

我需要在两个系统A和B之间交换公钥。

以下是

的步骤
  1. 从/root/.ssh目录复制id_rsa.pub的内容并将其保存在变量' key'
  2. ssh到B作为ubuntu用户。 ssh -i key_file ubuntu @ B
  3. 通过sudo su
  4. 移至root登录
  5. 将变量$ key附加到/root/.ssh/authorized_keys
  6. 但文件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
    

    但我没有工作。它给了我许可错误。

    有人可以在最后一步帮助我。

2 个答案:

答案 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,从安全角度来看,这是不可接受的。