使用 sudo su 执行命令?

使用 sudo su 执行命令?

昨晚我正在练习命令行技能,遇到了一个问题,当我使用 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 美元,*-长矛

相关内容