![从 bash 获取每个用户的 .ssh 目录的可靠方法是什么?](https://linux22.com/image/56855/%E4%BB%8E%20bash%20%E8%8E%B7%E5%8F%96%E6%AF%8F%E4%B8%AA%E7%94%A8%E6%88%B7%E7%9A%84%20.ssh%20%E7%9B%AE%E5%BD%95%E7%9A%84%E5%8F%AF%E9%9D%A0%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我可以使用 augtool 解析 /etc/passwd:
myuser=bob
usershome=`augtool -L -A --transform "Passwd incl /etc/passwd" print "/files/etc/passwd/$myuser/home" | sed -En 's/\/.* = (.*)/\1/p'`
……不过好像有点太复杂了。
有没有简单的、专用的工具来显示用户的主页(比如usermod
可以用来改变它)?
答案1
你永远不应该/etc/passwd
直接解析。您可能使用的是具有远程用户的系统,在这种情况下,他们将不会处于/etc/passwd
.该/etc/passwd
文件可能在其他地方。 ETC。
如果您需要直接访问用户数据库,请使用getent
.
$ getent passwd phemmer
phemmer:*:1000:4:phemmer:/home/phemmer:/bin/zsh
$ getent passwd phemmer | awk -F: '{ print $6 }'
/home/phemmer
然而,还有另一种不涉及解析的方法:
$ user=phemmer
$ eval echo "~$user"
/home/phemmer
~
shell 中的运算符扩展到指定用户的主目录。但是我们必须使用 ,eval
因为变量的扩展$user
发生在 的扩展之后~
。因此,通过使用eval
和 双引号,您可以$user
首先有效地扩展,然后调用eval echo "~phemmer"
.
获得主目录后,只需简单地添加/.ssh
到最后即可。
$ sshdir="$(eval echo "~$user/.ssh")"
$ echo "$sshdir"
/home/phemmer/.ssh
答案2
您正在寻找 $myuser 的主目录吗?
awk -F: -v user=$myuser '$1==user { print $6 ;}' /etc/passwd
您可以使用
awk -F: -v user=$myuser '$1==user { printf "%s/.ssh\n",$6;}' /etc/passwd
获取 .ssh 目录。