Bash 为什么可以';我不能像sudo一样将内容回显到新文件中吗?
我刚才遇到了这个奇怪的问题,我似乎无法弄清问题的真相。我正在尝试将配置文件添加到/etc/sudoers.d/中,但权限被拒绝。在下面的示例中,文件“tweedle”不存在,并且:Bash 为什么可以';我不能像sudo一样将内容回显到新文件中吗?,bash,echo,sudo,Bash,Echo,Sudo,我刚才遇到了这个奇怪的问题,我似乎无法弄清问题的真相。我正在尝试将配置文件添加到/etc/sudoers.d/中,但权限被拒绝。在下面的示例中,文件“tweedle”不存在,并且: drwxr-xr-x 2 root root 4.0K Jan 2 18:27 sudoers.d/ 下面是命令: $ sudo echo "tweedle ALL=(ALL) ALL" > /etc/sudoers.d/tweedle -bash: /etc/sudoers.d/tweedle: P
drwxr-xr-x 2 root root 4.0K Jan 2 18:27 sudoers.d/
下面是命令:
$ sudo echo "tweedle ALL=(ALL) ALL" > /etc/sudoers.d/tweedle
-bash: /etc/sudoers.d/tweedle: Permission denied
当我将其分解为两个命令时,它甚至不起作用:
$ sudo touch /etc/sudoers.d/tweedle
$ sudo echo "poodle" > /etc/sudoers.d/tweedle
当我在本地测试时,同样的问题:
$ 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
没有sudo,一切都很好:
$ cd ~
$ mkdir poodle
$ echo "noodle" > poodle/bottle
$ cat poodle/bottle
noodle
想法?答案是将“tee”与管道一起使用,这是一个我不熟悉的命令,因此您可以在下半场使用sudo:
$ echo "tweedle ALL=(ALL) ALL" | sudo tee /etc/sudoers.d/tweedle
echo
命令以root
的身份运行,但是重定向是由shell完成的,因此它是以当前用户的身份执行的,而不是以root
的身份执行
最简单的解决方案是调用根shell来运行命令和重定向
而不是:
sudo echo line > file
试试这个:
sudo sh -c 'echo line > file'
或
非常正确,尽管搜索并没有让我到达那里。谢谢。您告诉shell的是“运行sudo…”;该命令的输出请写入
sudoers
的末尾。请注意,写入操作是在sudo
执行的命令之外完成的,并且具有您的权限(即,不允许写入该文件)。应该有类似visudo(1)的命令
可用于安全地编辑文件。重复了一个有趣的解决方法,但@Keith的答案更为惯用。我正在一个shell脚本字符串变量中建立了许多行,然后将其附加到文件中。这种方法使我不必想知道如何将参数中的变量扩展到sh-c.Dude,“echo命令正在以root用户身份运行,但是重定向是由shell完成的,因此它是以当前用户身份执行的,而不是以root用户身份执行的。”--这就省去了时间,谢谢:)
sudo bash -c 'echo line > file'