为什么我不能将内容作为sudo回显到新文件中?

Spa*_*nky 3 bash sudo echo

我刚刚遇到这个奇怪的问题,我似乎无法深究它.我正在尝试将配置文件添加到/etc/sudoers.d/但获得权限被拒绝.在下面的示例中,文件"tweedle"不存在,并且:

drwxr-xr-x  2 root root   4.0K Jan  2 18:27 sudoers.d/
Run Code Online (Sandbox Code Playgroud)

所以这是命令:

$ sudo echo "tweedle ALL=(ALL) ALL" > /etc/sudoers.d/tweedle
-bash: /etc/sudoers.d/tweedle: Permission denied
Run Code Online (Sandbox Code Playgroud)

当我将它分成两个命令时,它甚至不起作用:

$ sudo touch /etc/sudoers.d/tweedle
$ sudo echo "poodle" > /etc/sudoers.d/tweedle
Run Code Online (Sandbox Code Playgroud)

当我在本地测试它时,同样的问题:

$ cd ~
$ mkdir -m 755 tweedle
$ sudo chown root:root tweedle
$ sudo echo "battle" > ~/tweedle/beetle
-bash: /home/spanky/tweedle/beetle: Permission denied
$ sudo touch tweedle/beetle
$ sudo echo "battle" > tweedle/beetle
-bash: tweedle/beetle: Permission denied
Run Code Online (Sandbox Code Playgroud)

没有sudo,一切都很好:

$ cd ~
$ mkdir poodle
$ echo "noodle" > poodle/bottle
$ cat poodle/bottle
noodle
Run Code Online (Sandbox Code Playgroud)

思考?

Kei*_*son 13

echo命令正在运行root,但重定向由shell完成,因此它作为当前用户执行,而不是作为root.

最简单的解决方案是调用root shell来运行命令和重定向.

而不是:

sudo echo line > file
Run Code Online (Sandbox Code Playgroud)

试试这个:

sudo sh -c 'echo line > file'
Run Code Online (Sandbox Code Playgroud)

要么

sudo bash -c 'echo line > file'
Run Code Online (Sandbox Code Playgroud)


Spa*_*nky 6

答案是使用带有管道的"tee",这是我不熟悉的命令,所以你可以在下半场使用sudo:

$ echo "tweedle ALL=(ALL) ALL" | sudo tee /etc/sudoers.d/tweedle
Run Code Online (Sandbox Code Playgroud)