为什么 sudo 没有在 Ubuntu 12.04 中添加 root 的 PATH?

为什么 sudo 没有在 Ubuntu 12.04 中添加 root 的 PATH?

我最近将我的服务器升级到了 Ubuntu Server 12.04。之前它运行的是 11.04。

从那时起,我就无法通过 sudo 执行 root 用户命令。例如:

> sudo ufw status
sudo: ufw: command not found
> sudo su - root
> ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    LIMIT       Anywhere

在 Ubuntu 11.04 上,它可以sudo ufw status正常工作,但在 Ubuntu 12.04 上,它找不到该命令。

这似乎只是一个未设置 PATH 的问题(ufw在 中找到/usr/sbin/ufw)。

我想了解的是我需要改回什么以便当我刚才sudo <sbin command>?时根的 PATH 能够正确设置。

答案1

你看过手册页sudo? 在安全注意事项部分他们讨论如何sudo使用PATH变量。

你还想了解/etc/sudoers可以PATH那里改变了secure_path。也可以通过目录中的文件进行设置/etc/sudoers.d/

建议sudo通过创建文件来更改配置,因为这样您的更改将与升级到新版本时可能发生的/etc/sudoers.d/更改无关。您仍应使用/etc/sudoerssudovisudo命令来创建和编辑文件/etc/sudoers.d/

答案2

除了安全原因(如安德斯提到PATH),保留原用户的最小惊讶原则

假设你运行了一个名为 的程序foo,但发现你确实需要将其作为 来运行root。因此你运行。如果 运行的程序与 运行的程序不同,sudo foo那就很糟糕了,如果中的不同,就会发生这种情况。这将从根本上违背你的期望和一般假设,即执行的操作与你在它后面放置的操作相同,只是作为。sudo foofoofoorootPATHsudoroot

如果sudo 挂起root的。但PATH假设PATHsudo 美联社root将的路径添加到您的PATH。如果这是sudo的行为,那么您可能会认为,如果您bar在模拟初始root登录 shell ( sudo -i) 时可以运行程序(称为 ),那么您也可以使用 运行它。但这种假设是错误的,因为您自己的(即不是的)路径中sudo bar可能存在不同的路径。barroot

sudo从一个 Ubuntu 版本到另一个 Ubuntu 版本,行为可能发生变化,而不是您的行为PATH发生变化。如果您将/sbin/usr/sbin和添加/usr/local/sbinPATH,问题将得到解决。除非您只想sbin在以 运行程序时将其添加到 PATH 中root。在这种情况下,我建议就此问题发布一个单独的问题(尽管在 中暗示了一种实现此目的的技术安德斯的回答

相关内容