给定USER,如何获得HOME?


41

我的USER脚本中有一个变量,我想查看HOME基于USER变量的路径。我怎样才能做到这一点?

Answers:


72

有一个实用程序可以查找用户信息,而不管该信息是否存储在本地文件(例如/etc/passwdLDAP或LDAP)中。叫做getent

为了从中获取用户信息,请运行getent passwd $USER。您将获得如下所示的一行:

[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash

现在,您可以简单地从其中剪切主目录,例如,使用cut,如下所示:

[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny

getent是更好的答案,特别是对于远程用户。在较简单的系统中,用户应该足够了。让你振作起来。
Rui F Ribeiro

@RuiFRibeiro,您不能在中使用~foo变量bash。无论如何,不​​是直接的。
muru

1
@muru-是的,这是规范行为。但是,~确实确实可以进行Tab扩展,并且tilde-prefix的getpwnam()另一种规范行为应替换为与使用该功能获得的登录名相关联的初始工作目录的路径名,因此查找可能非常好。我不喜欢制表符扩展,但是-我喜欢键入制表符。
mikeserv

1
注意,这只会使您获得$ HOME 的初始值;用户的登录脚本完全有权将其更改为其他名称。这是一件不寻常的事情,但是我可以想到一些明智的情况,例如在本地和安装NFS的homedir之间进行选择。
zwol 2015年

1
@HagenvonEitzen禁止使用冒号正是因为它们已被用于分隔各个字段。
珍妮D

9

您可以eval用来获取某人的主目录。

eval echo "~$USER"

至少对于本地用户而言,这可以肯定地起作用。我不知道是否使用LDAP等远程用户eval


1
那里不需要评估。小心你的英语。
Rui F Ribeiro

4
@nwk eval需要一个。Bash ~foo在变量扩展后不处理。
muru

1
有趣的是,谢谢,但是这只会获取当前用户的目录,而不是其他用户的目录。我认为LDAP用户没有得到处理,尽管我可能是错的。
Rui F Ribeiro 2015年

3
@RuiFRibeiro它将在LDAP上正常工作,只需使用包含LDAP用户的用户名而不是的任何变量即可USER
muru 2015年

3
不要未经核实使用此$USER展开来只是字母字符的单个字符串。
chepner

4

通常的位置是/home/$USER,但这不必是通用的。搜索此类信息的确切位置是文件内/etc/passwd

该文件是世界可读的(任何人都可以读取),因此任何用户都可以访问其内容。
如果文件中存在$ USER,则最后一个条目是用户HOME目录。

这将选择条目并打印HOME目录:

awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"

对于更复杂的(远程)系统,getent是从NSS(名称服务交换库)系统获取用户信息的常用命令。

一个命令

echo $(getent passwd $USER )| cut -d : -f 6

将提供等效信息(如果可用)。


2
您有〜user,并且您的解决方案不考虑更复杂系统中的用户,例如来自LDAP的用户(您必须使用getent)。
Rui F Ribeiro 2015年

2

如果用户不存在,getent将返回错误。

这是一个小的shell函数,它不会忽略的退出代码getent

get_home() {
  local result; result="$(getent passwd "$1")" || return
  echo $result | cut -d : -f 6
}

这是一个用法示例:

da_home="$(get_home missing_user)" || {
  echo 'User does NOT exist!'; exit 1
}

# Now do something with $da_home
echo "Home directory is: '$da_home'"

1

如果您以root用户身份登录,或者您知道USER的密码,或者USER没有密码,那么以下是另一种选择:

    su -c 'echo ~' ${USER}

在标准su行为下,如果USER未定义或为空,su则将尝试以超级用户身份运行命令。

如果的值USER不是有效的用户名,则会引发相应的错误:su: user <user> does not exist

这里已经有很多不错的答案,但这仍然可以帮助某人。


这是不安全的,具体取决于系统配置。它以该用户身份运行一个进程(运行echo的外壳程序),因此用户可以(例如)跟踪外壳程序并提供任意输出。它也正在用户的设置中运行,因此有可能运行用户的shell配置文件(这也可以提供任意输出)。或通过pam加载环境。等等,或者做一些简单的事情,例如向其发送SIGSTOP,以使其永久有效地DOS攻击您的脚本。
derobert
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.