我正在与一位产品支持人员合作,他坚持认为我需要以 root 身份安装一系列补丁,并且 sudo 不起作用;他没有给出理由,但似乎非常坚定地坚持自己的信念。浏览超级用户我无法确定这种情况的任何可能原因,为了确认,当我运行:
sudo -l
我得到:
...
User [MY USERNAME] may run the following commands on this host:
(ALL) ALL
据我所知,从 Linux/服务器团队获得访问权限以真正成为 root 并不是一个立即的过程,因此我宁愿自己安装它们。
是否存在任何实际原因导致 sudo 在服务器上安装软件时的行为与 root 不同?
答案1
这很大程度上取决于你如何使用sudo
或调用你的程序su
。
例如在我此刻所在的系统上:
.bashrc
COMMAND $HOME $USER Env. $PATH
1. sudo -i (root) root root [1]
2. sudo -s (USER) root USER /home/${USER}/bin:[1]
3. sudo /bin/bash (USER) root USER /home/${USER}/bin:[1]
4. sudo su (root) root USER [1]:/usr/games:/usr/local/games
5. sudo su - (root) root root [1]
其中 [1]=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Env=环境变量针对 1 和 5 进行重置,取自 2,3,4 中的 $USER。
因此,使用不同选项启动的脚本或程序可以看到不同的$PATH
、$HOME
,其 shell 可以读取不同的.bashrc
、.profile
和 环境变量。它读取与 相关的文件$HOME
。每个用户都可以以不同的方式修改其环境(变量、$PATH
、.bashrc、.profile、.bash_profile、别名……)。特别是,用户可以拥有其目录中不同的顺序$PATH
,因此,脚本可以执行命令,例如,/home/$USER/bin
而不是从 root 期望的路径中的命令。
您可以在以下位置运行程序sudo -i
由于您已使用 root 身份登录su -
sudo MyCommand
,但是如果您使用或 使用运行它,则可能会有不同的行为su -c MyCommand
。
从man su
:
在描述部分:
当前环境被传递到新的 shell。 的价值$PATH 被重置对于普通用户,为 /bin:/usr/bin;对于超级用户,为 /sbin:/bin:/usr/sbin:/usr/bin
...
在选项部分:
-、-l、--login
提供环境类似于用户会期望直接登录。
来自男人sudo
-我, --login
将目标用户的密码数据库条目指定的 shell 作为登录 shell 运行。这意味着 shell 将读取登录特定的资源文件(如 .profile 或 .login)。如果指定了命令,则该命令将通过 shell 的 -c 选项传递给 shell 执行。如果未指定命令,则执行交互式 shell。sudo
在运行 shell 之前尝试更改为该用户的主目录。 该命令的运行环境与用户登录时收到的环境类似sudoers(5) 手册中的命令环境部分记录了在使用 sudoers 策略时 -i 选项如何影响运行命令的环境。
答案2
答案3
正如@Hastur 所指出的,如果你获得了 root shell,则会有一些差异。
如果您没有获得 root shell,那么差异就更大了。支持成员可能有尝试执行诸如以 root 身份运行sudo patch -p0 < /root/patch.file
where之类的操作的经验,但(从文件进行管道传输)则没有。patch
<
答案4
这取决于您希望 root 访问权限有多细。如果您有多个用户在系统上执行不同的任务,那么 sudo 会更理想。我经常使用的一个例子是需要重新启动应用程序或数据库。安全性始终以最低权限实现。我使用组,并且只允许这些组执行明确的操作。一本描述此过程的好书是“Sudo Mastery:真实用户的用户访问控制”。实际上,这是一本关于 sudo 的好书……