CentOS 7 中的环境 USER 和 USERNAME

CentOS 7 中的环境 USER 和 USERNAME

我偶然发现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仍然如此?一旦我取消设置变量,行为是相同的。gncsenvsudoUSERNAME

我在运行以下 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.37.4

import commands
username = commands.getoutput("logname")
print username

import os
os.getlogin()

笔记:我本想将此添加为评论,但我刚刚开始回答问题,并且没有足够的声誉将其添加为评论。

答案2

显然,该sudo程序已从 CentOS 7.3 更改为 7.4。另外,我了解到在getpassPython模块中函数getuser首先使用环境变量,这并不是最优的。

为了解决我最初的问题,我选择了以下一段 Python 代码,它似乎具有所需的行为。

import os
import pwd
pwd.getpwuid(os.getuid()).pw_name

相关内容