获取其他用户的环境变量


23

有没有办法可以查看其他用户的环境变量?我想以root用户身份执行此操作,因此权限不会成为问题。

对于用户本人,我使用echo $PATHset | grep PATH(或set当我不记得变量名时)。对于其他用户,类似的指示是什么?

对于它的价值,我使用的是Ubuntu Server 13.04。


4
用户没有环境变量,过程没有。一个用户执行的进程并非都具有相同的环境是很常见的。您要解决什么问题?
吉尔(Gilles)'所以

例如,@ Gilles,我想知道用户拥有哪个MAIL文件夹。我可以以该用户身份登录,然后执行操作echo $MAIL,但我认为可能会有捷径。

3
但这仍然无法有效地定义问题(例如,取决于许多因素,您接受的答案可能有效也可能无效)。您是否在寻找默认邮箱位置?您是否正在寻找用户实际接收其本地邮件的位置(如果用户使用,则可能会有所不同,并且可能不存在.forward)?用户经常在他们.profile或其他配置文件中设置一些变量,并且无法可靠地枚举所有变量。同样,您要解决什么问题?
吉尔斯(Gillles)“所以-别再邪恶了”

Answers:


20

另一个选择是使用env。运行为root

sudo -Hiu $user env | grep $var

例如

sudo -Hiu terdon env | grep HOME
HOME=/home/terdon

1
当我以root用户身份登录并以我的标准用户名执行此命令时,我得到了HOME=/root。那是root的主目录,但是不是我的标准主目录。如果您想知道特定用户登录时所处的环境,则必须运行该特定用户的登录Shell的启动脚本(请记住,他的登录Shell可能与您的登录Shell不同)。
Uwe

@Uwe在什么系统上?这对我来说可以。您是说您root从登录管理器登录吗?如果我放到tty并以身份登录,效果很好root
terdon

我在Debian机器上。我以uwe身份登录,打开一个xterm,运行env | grep HOME并获取HOME=/home/uwe;我执行su,然后再次执行并env | grep HOME获得HOME=/root,然后我运行sudo -u uwe env | grep HOME并仍然获得HOME=/root
Uwe

@uwe很奇怪。我也在Debian(LMDE)机器上,我执行了与您描述的过程完全相同的过程(甚至使用它xterm代替了我的常规终端),并获得了预期的结果。
terdon

根据手册,sudo仅当-H存在该选项或/etc/sudoers设置了相应的条目时,才设置HOME变量。看来我们的sudoers文件有所不同。无论如何,-H在这里使用它可能是一个好主意,也可能在这里使用-i
Uwe

2

对于一个用户,您可以这样做:

su - <username> -c '. ~/.profile; echo $PATH'

列出所有用户的$ PATH:

for user in $(cat /etc/passwd | awk -F: '{print $1}'); do
  su - $user -c '. ~/.profile; printf "%s\n" "$PATH"'
done

@Camil Staps

. ~/.profile因此,这是我从我最喜欢的人Peteris Krumins那里学到的一个技巧。他在这里解释了窍门。也许后来的bash版本已经有了option选项NON_INTERACTIVE_LOGIN_SHELLS


谢谢!因为$PATH它也可以毫无. ~/.profile; 作用地工作-它的作用是什么?

@CamilStaps“有效”是什么意思?是的,$PATH即使没有采购也能获得价值~/.profile,但几乎可以肯定不是您想要的价值(=该用户登录时看到的价值)。甚至采购~/.profile也不是完全可靠的,因为用户可能使用启动文件不同于的shell ~/.profile
Uwe

@Uwe我没有得到相同的输出,但是我想那只是一个巧合。

您假设用户未使用csh。
格伦·杰克曼(Glenn Jackman)2013年

@CamilStaps第一个问题是该特定用户是否完全修改了他的PATH ~/.profile。但是无论如何,sudo可以在其中配置很多行为/etc/sudoers(请参阅我与terdon的讨论),因此,当我们的系统行为不同时,这可能是由于配置文件中的差异引起的。
Uwe

0

您可以从根目录su -到用户,然后grep您要查看的环境变量:

su - <username> -c 'echo $PATH'


由于某种原因,即使命令以其他用户身份执行,这对我也不起作用。我最终使用了“ env”,所以某事runuser -l <username> -c "env | grep <var>" | cut -d '=' -f 2对我来说很好。如果您不是root用户,则需要在命令前面加上sudo
Andrei-Niculae Petre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.