昨晚我正在练习命令行技能,遇到了一个问题,当我使用 sudo 时,我收到一条错误消息,提示“权限被拒绝”。但是,当我使用“sudo su”并成为 root 时,该命令就可以正常工作了。
为什么 sudo 一开始不起作用?
它是:
$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D
摘自《Linux Bible》2010 版中有关设置 LAMP 服务器的部分。
答案1
<、> 和 >> 用于命令的输入/输出重定向 - 这是 shell(例如 bash)提供的功能。因此,如果您键入如下命令,sudo cat > /var/www/info.php
则接收此命令作为输入的 shell 将尝试打开文件/var/www/info.php
并将该文件作为标准输出提供给sudo
命令。该sudo
命令甚至不知道其输出是发送到控制台还是重定向到文件,因为这由调用它的 shell 处理。
如果您输入命令的 shell 是您的登录 shell 或以您的用户 ID 在终端中运行的另一个 shell,那么它具有与您的用户 ID 相同的权限 - 而不是 root 的权限。
因此在您的情况下,虽然 cat 命令是以 root 身份执行的,但其输出的复制却是/var/www/info.php
由以普通用户身份运行的 shell 尝试进行的,正如预期的那样,失败了。
解决此类情况的方法是使用以下命令tee
:
sudo tee /var/www/info.php
这将产生预期的效果,即将控制台中输入的所有文本(直到 ^D)放入作为参数指定的文件中。
一个可能不太理想的副作用是,它还tee
会将输出回显到 stdout,因此在您输入每一行并按下回车键后,tee
都会输出其副本。为了避免这种情况,您可以使用以下变体。
sudo tee /var/www/info.php > /dev/null
有关的详细信息tee
可以通过info tee
终端获取。
答案2
sudo 不适用于需要权限来写入文件的命令,例如:
sudo echo "vm.swappines = 100" >> /etc/sysctl.conf
它在 sudo 手册页中进行了解释。
答案3
问题在于“> foo.txt”部分由你的命令解释器(shell)解释并执行长的在运行 sudo 命令之前。sudo 命令不知道您想将其输出重定向到文件。
您的命令解释器没有 root 权限(但 sudo 命令最终会具有),因此它无法将输出重定向到 foo.txt。
答案4
解决此问题的另一种方法是使用 sudo 启动子 shell 并在该子 shell 中执行该命令:
$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D
这里“具有sudo”的命令是bash,在其中执行的任何操作都具有root权限。
2c 美元,*-长矛