使用sudo su命令吗?


15

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

为什么sudo在一开始不起作用?

它是:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

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


如果您不提供示例,则很难解决该问题。
LassePoulsen

1
考虑sudo -s一下sudo su
杰里米·L

Answers:


18

<,>和>>用于命令的输入/输出重定向-这是shell提供的功能(例如bash)。因此,如果您键入类似的命令,sudo cat > /var/www/info.php那么将其作为输入接收的外壳程序将尝试打开该文件,/var/www/info.php并将该文件作为sudo命令的标准输出提供。该sudo命令甚至不知道其输出是要发送到控制台还是重定向到文件,因为调用它的外壳会处理该命令。

如果您在其中键入命令的外壳是您的登录外壳或另一个在终端中运行且具有您的用户ID的外壳,则它具有与您的用户ID相同的特权-而不是root用户。

因此,在您的情况下,虽然cat命令是作为root用户执行的,但它的输出要复制到/var/www/info.php以普通用户身份运行的shell尝试,这会失败。

这种情况的解决方法是使用以下tee命令:

sudo tee /var/www/info.php

这样可以达到预期的效果,即将在控制台输入的所有文本最多^ D放入指定为参数的文件中。

一个可能令人不快的副作用是,tee它还会将输出回显到stdout,因此,在键入每一行并按Enter键之后tee,它的副本会返回。为了避免这种情况,您可以使用以下变体。

sudo tee /var/www/info.php > /dev/null

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


2

sudo不适用于需要权限来写入文件的命令,例如:

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

它在sudo手册页中进行了说明。


4
提及您可以使用“ sudo -i”或“ sudo -s”来获得root用户提示,将使此答案更好!
豪尔赫·卡斯特罗

示例命令中没有管道。有一个重定向。另外,“有时不起作用”似乎通过传达了片状行为sudo。正如koushik的回答所指出的,对于UNIX权限模型,该行为是完全可预测的,一致的并且是“正确的”。
msw

2

问题是在运行sudo命令之前很久,命令解释器(shell)就解释并执行了“> foo.txt”部分。sudo命令不知道您要将其输出重定向到文件。

您的命令解释器没有超级用户权限(但最终将使用sudo命令),因此它无法将输出重定向到foo.txt。


1

解决此问题的另一种方法是使用sudo启动一个子shell并在该子shell中执行该命令:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

在这里,“具有sudo”的命令是bash,并且其中执行的所有命令都具有root权限。

$ 2c,*-派克

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.