无法使用“echo”写入 /etc/shadow,但使用“nano”可以

无法使用“echo”写入 /etc/shadow,但使用“nano”可以

我的目标是写入 /etc/passwd 以将权限提升到 root。

我为新的 root 用户生成了密码“test1”:openssl passwd test1 并且我使用 echo 在 /etc/passwd 文件中添加一个新条目:sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd

但是当我执行最后一条命令时,它显示我没有权限执行此操作:bash: /etc/passwd: Permission denied

但是当我使用命令sudo nano /etc/passwd并复制到root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash文件末尾时它就起作用了!

该命令存在什么问题echo

答案1

已经通过评论回答了,但要稍微扩展一下:

sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd

翻译如下:

  1. 指示 bash(未提升权限)打开文件 /etc/passwd 进行写入
  2. 指示 bash(仍未提升)使用一些参数运行命令sudo,并使用步骤 1 中的文件描述符作为 stdout
    1. 指示 sudo (setuid root)echo使用一些参数 运行命令
      1. 指示 echo(以 root 身份运行,注意这可能类似于 /usr/bin/echo,而通常echo会调用 shell 内置命令),并从 sudo 继承 stdout)将一些文本输出到 stdout
      2. 任务完成,echo 退出
    2. 任务完成,sudo 退出;不再以 root 身份运行
  3. Bash(仍未提升)关闭 /etc/passwd 的文件描述符(刷新写入队列)
  4. Bash 等待下一个命令

当然,除非步骤 1 失败!Bash 未被提升,无法打开 /etc/passwd 进行写入。因此,bash: /etc/passwd: Permission denied步骤 2 或 3 的任何部分都不会发生,包括步骤 2 的任何子步骤。

sudo nano /etc/passwd工作正常,因为提升的进程(nano,从 sudo 继承 root 权限)是打开文件进行写入的进程。

如果您想在这里使用 echo,则需要提升 bash 本身的权限。这可以通过在 sudo 中显式调用 bash(或任何其他 shell)然后告诉它要做什么来完成:
sudo bash -c 'echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd'
或者等效地作为三个单独的命令(后两个命令提供给提升的 bash 实例):
sudo bash echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd exit

相关内容