我刚刚遇到这个奇怪的问题,我似乎无法深究它.我正在尝试将配置文件添加到/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)
答案是使用带有管道的"tee",这是我不熟悉的命令,所以你可以在下半场使用sudo:
$ echo "tweedle ALL=(ALL) ALL" | sudo tee /etc/sudoers.d/tweedle
Run Code Online (Sandbox Code Playgroud)