昨晚我正在努力开发我的命令行技能,并遇到了一个问题,当我使用 sudo 时,我收到一条错误消息,上面写着“权限被拒绝”。但是,当我使用“sudo su”并成为 root 时,该命令起作用了。
为什么 sudo 在第一个实例中不起作用?
它是:
$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D
来自 Linux Bible 2010 版中关于设置 LAMP 服务器的部分。
昨晚我正在努力开发我的命令行技能,并遇到了一个问题,当我使用 sudo 时,我收到一条错误消息,上面写着“权限被拒绝”。但是,当我使用“sudo su”并成为 root 时,该命令起作用了。
为什么 sudo 在第一个实例中不起作用?
它是:
$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D
来自 Linux Bible 2010 版中关于设置 LAMP 服务器的部分。
<、> 和 >> 用于命令的输入/输出重定向——这是 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
命令:这将具有将在控制台输入的所有文本直到 ^D 放入指定为参数的文件的预期效果。
一个可能不受欢迎的副作用是
tee
它还会将输出回显到标准输出,因此在您键入每一行并按 Entertee
后将输出它的副本。为避免这种情况,您可以使用以下变体。tee
可以通过info tee
终端获得有关详细信息。sudo 不适用于需要写入文件权限的命令,例如:
sudo echo "vm.swappines = 100" >> /etc/sysctl.conf
它在 sudo 手册页中进行了解释。
问题是 "> foo.txt" 部分在运行 sudo 命令之前很久就由您的命令解释器(shell)解释和执行。sudo 命令不知道您要将其输出重定向到文件。
您的命令解释器没有 root 权限(但 sudo 命令最终会在以后),因此它无法将输出重定向到 foo.txt。
解决此问题的另一种方法是使用 sudo 启动一个子 shell 并在该子 shell 中执行该命令:
在这里,“有 sudo”的命令是 bash,在其中执行的任何内容都具有 root 权限。
$2c, *-派克