从bash获取每个用户的.ssh目录的可靠方法是什么?


8

我可以用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可以用来对其进行更改)?


您是否在寻找伪造的答案?
2014年

@mgjk不,我知道该怎么做。实际上,我需要这个答案来编写一个引导脚本,该脚本在LXC容器上设置一个puppetmaster :-)
Adam Ryczkowski 2014年

Answers:


15

您永远不要/etc/passwd直接解析。您可能在具有远程用户的系统上,在这种情况下,他们将不在/etc/passwd。该/etc/passwd文件可能在其他地方。等等。

如果您需要直接访问用户数据库,请使用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

包括awk魔术在内的所有抛光都得到了很好的答案(我从未真正理解过)
Adam Ryczkowski 2014年

1
假设sshdir将始终安全~/.ssh吗?可以通过任何地方的配置设置更改它,还是将其硬编码到ssh中?
terdon

2
这是默认设置,可以在/etc/ssh/ssh_config和中进行更改sshd_config。至少在Ubuntu 14.04
亚当·赖采科斯基

4

您是否正在寻找$ 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目录。

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.