我偶然发现CentOS 7.3 和 CentOS 7.4 之间sudo
更改变量的方式存在差异。env
这是我在 CentOS 7.3 和 7.4 上运行的脚本:
#!/bin/bash
env | grep USER
sudo env | grep USER
unset USERNAME
env | grep USER
sudo env | grep USER
在 CentOS 7.3 上,这给出(格式化):
USER=gncs
USERNAME=gncs
[sudo] password for gncs:
USERNAME=gncs
USER=root
SUDO_USER=gncs
USER=gncs
USER=root
USERNAME=root
SUDO_USER=gncs
在 CentOS 7.4 上,这给出(格式化):
USER=gncs
USERNAME=gncs
[sudo] password for gncs:
USERNAME=gncs
USER=gncs # !!!
SUDO_USER=gncs
USER=gncs
USER=root
USERNAME=root
SUDO_USER=gncs
为什么我在 CentOS 7.4 上运行时USER
仍然如此?一旦我取消设置变量,行为是相同的。gncs
env
sudo
USERNAME
我在运行以下 python 程序时遇到了这个问题sudo
:
import getpass
getpass.getuser()
在 Centos 7.3 下它返回root
,在 7.4 下gncs
。我相信这与上面提到的环境变量有关。
附加信息:
$ sudo --version
Sudo version 1.8.19p2
Sudoers policy plugin version 1.8.19p2
Sudoers file grammar version 45
Sudoers I/O plugin version 1.8.19p2
$ sudo grep -r env /etc/sudo*
[sudo] password for gncs:
/etc/sudoers:# is already set when the the env_reset option is enabled, so
/etc/sudoers:# env_reset is disabled or HOME is present in the env_keep list.
/etc/sudoers:Defaults env_reset
/etc/sudoers:Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
/etc/sudoers:Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
/etc/sudoers:Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
/etc/sudoers:Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
/etc/sudoers:Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
/etc/sudoers:# Adding HOME to env_keep may enable a user to run unrestricted
/etc/sudoers:# Defaults env_keep += "HOME"
答案1
CentOS 7.4 中的 sudo 程序发生了变化。问题实际上是用户想要在 python 代码中获取操作系统用户名。所有方法似乎都依赖于环境变量,因此它可能不适用于所有情况。
您可以尝试这些选项以使其至少可以工作CentOS 7.3和7.4
import commands
username = commands.getoutput("logname")
print username
import os
os.getlogin()
笔记:我本想将此添加为评论,但我刚刚开始回答问题,并且没有足够的声誉将其添加为评论。
答案2
显然,该sudo
程序已从 CentOS 7.3 更改为 7.4。另外,我了解到在getpass
Python模块中函数getuser
首先使用环境变量,这并不是最优的。
为了解决我最初的问题,我选择了以下一段 Python 代码,它似乎具有所需的行为。
import os
import pwd
pwd.getpwuid(os.getuid()).pw_name