使用 sudo su 命令?

wdy*_*x22 15 command-line

昨晚我正在开发我的命令行技能,遇到了一个问题,当我使用 sudo 时,我收到一条错误消息,显示“权限被拒绝”。但是,当我使用 'sudo su' 并成为 root 时,该命令起作用了。

为什么 sudo 首先不起作用?

它是:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D
Run Code Online (Sandbox Code Playgroud)

来自 Linux Bible 2010 版中关于设置 LAMP 服务器的部分。

kou*_*hik 18

<、> 和>> 用于命令的输入/输出重定向——这是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
Run Code Online (Sandbox Code Playgroud)

这将具有将在控制台输入的所有文本直到 ^D 放入指定为参数的文件的预期效果。

一个可能不太受欢迎的副作用是,tee它还会将输出回显到标准输出,因此在您键入每一行并按 Enter 后,tee将输出它的副本。为避免这种情况,您可以使用以下变体。

sudo tee /var/www/info.php > /dev/null
Run Code Online (Sandbox Code Playgroud)

tee可以通过info tee终端获得有关详细信息。