我最近将我的服务器升级到了 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/sudoers
sudo
visudo
命令来创建和编辑文件/etc/sudoers.d/
。
答案2
除了安全原因(如安德斯有提到PATH
),保留原用户的最小惊讶原则。
假设你运行了一个名为 的程序foo
,但发现你确实需要将其作为 来运行root
。因此你运行。如果 运行的程序与 运行的程序不同,sudo foo
那就很糟糕了,如果中的不同,就会发生这种情况。这将从根本上违背你的期望和一般假设,即执行的操作与你在它后面放置的操作相同,只是作为。sudo foo
foo
foo
root
PATH
sudo
root
如果sudo
前挂起root
的。但PATH
假设PATH
sudo
美联社root
将的路径添加到您的PATH
。如果这是sudo
的行为,那么您可能会认为,如果您bar
在模拟初始root
登录 shell ( sudo -i
) 时可以运行程序(称为 ),那么您也可以使用 运行它。但这种假设是错误的,因为您自己的(即不是的)路径中sudo bar
可能存在不同的路径。bar
root
sudo
从一个 Ubuntu 版本到另一个 Ubuntu 版本,行为可能发生变化,而不是您的行为PATH
发生变化。如果您将/sbin
、/usr/sbin
和添加/usr/local/sbin
到PATH
,问题将得到解决。除非您只想sbin
在以 运行程序时将其添加到 PATH 中root
。在这种情况下,我建议就此问题发布一个单独的问题(尽管在 中暗示了一种实现此目的的技术安德斯的回答。