我正在尝试以其他用户身份执行脚本(例如,马文):
$ sudo -u marvin scriptname
在一台机器(Ubuntu 14.04)上,该命令有效并且脚本成功执行。
在另一台机器(Kubuntu 16.04)上,运行相同的命令会引发错误
marvin is not in the sudoers file. This incident will be reported.
马文不在任何一台机器的 sudoers 列表中。这应该没关系,因为脚本不需要 sudo 权限即可执行。我使用 sudo 充当马文,但我在两台机器上都有 sudo 权限。 马文他自己并没有尝试执行 sudo 操作。
为什么会发生这种情况?两台机器之间肯定存在差异,但我找不到。在两个系统上,文件所有权和权限都是相同的。
编辑:/etc/sudoers
两台机器上的文件几乎完全相同;相关部分是
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
两者都没有提到任何普通用户,但我(博雷亚)是须藤两台机器上的import 行都被/etc/sudoers.d/
注释掉了,而且除了 README 之外,该目录都是空的。
答案1
哪些用户可以使用 sudo 以“runas”方式运行,这在配置文件中定义/etc/sudoers
。此实用程序可配置性极高,因此我可能会稍微简化一下。sudoers 手册页详尽地涵盖了它。
被调用时,sudo
检查调用用户的规则。在你的例子中,这意味着用户博雷亚首先评估,而不是那些,如果有的话,对于用户马文。
通话中传来的错误信息肯定无助于澄清这一点。
sudoers 中典型的“完全 sudo 权限”条目如下所示:
borea ALL = (ALL) ALL
这是与上下文相同的陈述,说明了每个项目的含义:
Who: borea
On hosts: ALL
Can run as users: (ALL)
The commands: ALL
您的问题上下文中的关键条目是第三个。如果没有将其设置为 ALL,并且将其设置为不包含 marvin 的用户列表,则调用将失败。
以下是手册页中一个更复杂的例子:
alan ALL = (root, bin : operator, system) ALL
此设置转换为:
用户 alan 可以以用户 root 或 bin 的身份运行任何命令,并可选择将组设置为操作员或系统。
因此,两个系统上的行为差异与 marvin 帐户无关,而是与您的帐户有关。我对此的最佳猜测是“以...身份运行”设置,但还有其他设置可以在同一个配置文件中阻止它,无论是全局设置还是其他微妙的方式(例如组成员身份)。
其他值得关注的事项:
根据您的反馈,问题不在于 sudoers 文件,因为该文件直接为用户配置博雷亚。以下是要收集的数据点和要尝试的事情的详细清单。使用结果更新您的问题(特别是两台机器之间看到的任何差异)。
1.此命令将总结您的“sudo”相关的权限和限制,检查两台机器之间是否报告了差异:
sudo -l -U borea
2. 为用户重复相同操作马文. 当然不需要马文需要 sudoers 才能sudo -u
工作,但这是一个很好的数据点。有可能马文通过群组成员身份继承了一些设置等。
sudo -l -U marvin
3. 在两台机器上,检查马文考虑任何差异。finger
可能未默认安装;sudo apt-get install finger
在这种情况下请先使用。
sudo finger -l marvin
sudo passwd --status marvin
id marvin
4. 尝试使用马文account.su
使用不同的方法来提升权限:
sudo su marvin
5. 假设 root 帐户已启用 shell 访问(我认为默认情况下 Ubuntu 仍然禁用该功能),请尝试以下操作:
sudo -s
sudo -u marvin scriptname
6.确认/etc/sudoers 上的权限:
ls -alt /etc/sudoers
结果应该以以下内容开头:
-r--r----- 1 root root ...
如果不是,请使用以下命令修复它:
sudo chmod 440 /etc/sudoers
sudo chown root:root /etc/sudoers
7. 尝试将 sudoers 文件从运行正常的机器复制到运行不正常的机器。执行此操作时要非常小心 - 将原始文件备份到安全位置。很容易忘记哪个文件是哪个...
8. 最后一件事 - 检查一台或两台机器上是否有文件 /etc/sudo.conf。如果有,请创建两个文件的副本,然后将它们移动到一台机器上。运行
diff sudo.conf.machine1 sudo.conf.machine2
查找配置差异。对 /etc/sudoers 文件执行相同操作(使用 diff)以查找所有差异。