使用bash脚本查找登录的用户和网络主目录


2

我正在尝试使用脚本来查找当前登录到Mac的用户的用户名和主目录。这就是我所拥有的,并且它有效,但是有更好的(即更简单的)方法吗?

user=`logname`
userHome="eval echo ~`echo $user`"
userHome=`$userHome`

登录用户几乎肯定不会运行该脚本。

这是Mac OS X 10.6,已加入Active Directory,并且已登录网络用户。所以用户名不会出现在/etc/passwd

Answers:


2

这个脚本:

#!/bin/bash
w -h | sort -u -t' ' -k1,1 | while read user etc
do
  homedir=$(dscl . -read /Users/$user NFSHomeDirectory | cut -d' ' -f2)
  echo =$user= =$homedir=
done

将执行以下操作:

  • 找到所有登录的用户(也w -h可以通过ssh!)或者也可以使用该who命令
  • 排序和查找唯一用户 sort -u -t' ' -k1,1
  • 为每个登录的用户
    • 读用户名
    • 通过命令从DirectoryService守护程序中找到他的主目录 dscl
    • 打印出用户名和他的主目录

好老dscl......不知道为什么我没想到这个!
威廉杰克逊

1

用户存储在变量USER中,而home位于HOME中:

echo user name: $USER, user home: $HOME

这是自动完成的。您不必编写任何脚本来获取它们。


这只会告诉我运行脚本的用户的用户名和主页。我想要登录到GUI的用户,该脚本作为不同的用户运行。
威廉杰克逊

我懂了。我误解了这个问题。
Hai Vu

1

这个Advanced Bash-Scripting Guide我了解到了这一点

$(...)表单取代了命令替换的反引号。

$(...)形式的命令替换允许嵌套。

现在我正在使用:

user=$(logname)
userHome=$(eval echo ~$(echo $user))

这比userHome = $更清晰(dscl.-read / Users / lognameNFSHomeDirectory | awk'{print $ 2}); user = $(basename $ userHome) - 很好地完成了
bmike

0

假设logname有效,那么你可以得到这样的主目录:

user=$(logname)
userHome=$(awk -F: -v u=$user '$1 == u {print $6}' /etc/passwd)

用户没有出现在/etc/passwd/。我更新了这个问题。
威廉杰克逊

-2

不确定是否需要所有其他并发症。

echo $USER
echo ~

1
从帖子“这个脚本几乎肯定不会被登录用户运行。” - 您的答案无法发现系统上的其他用户。
Ian C.
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.