昨晚我正在开发我的命令行技能,遇到了一个问题,当我使用 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终端获得有关详细信息。