Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 为什么可以';我不能像sudo一样将内容回显到新文件中吗?_Bash_Echo_Sudo - Fatal编程技术网

Bash 为什么可以';我不能像sudo一样将内容回显到新文件中吗?

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

我刚才遇到了这个奇怪的问题,我似乎无法弄清问题的真相。我正在尝试将配置文件添加到/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: 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'