Quel est le moyen fiable d'obtenir le répertoire .ssh de chaque utilisateur à partir de bash?

8

Je peux analyser le / etc / passwd avec augtool:

myuser=bob
usershome=`augtool -L -A --transform "Passwd incl /etc/passwd" print "/files/etc/passwd/$myuser/home" | sed -En 's/\/.* = (.*)/\1/p'`

... mais cela semble un peu trop alambiqué.

Existe-t-il un outil simple et dédié pour afficher la maison des utilisateurs (comme usermodpeut être utilisé pour le modifier )?

Adam Ryczkowski
la source
Vous cherchez une réponse fantoche?
mgjk
@mgjk Non, je sais comment le faire sur marionnette. En fait, j'ai besoin de cette réponse pour écrire un script d'amorçage qui installe un marionnettiste sur un conteneur LXC :-)
Adam Ryczkowski

Réponses:

15

Vous ne devez jamais analyser /etc/passwddirectement. Vous êtes peut-être sur un système avec des utilisateurs distants, auquel cas ils ne le seront pas /etc/passwd. Le /etc/passwdfichier peut être ailleurs. Etc.

Si vous avez besoin d'un accès direct à la base de données des utilisateurs, utilisez getent.

$ getent passwd phemmer
phemmer:*:1000:4:phemmer:/home/phemmer:/bin/zsh

$ getent passwd phemmer | awk -F: '{ print $6 }'
/home/phemmer

Cependant, il existe également une autre méthode qui n'implique pas l'analyse:

$ user=phemmer
$ eval echo "~$user"
/home/phemmer

L' ~opérateur dans le shell se développe dans le répertoire personnel de l'utilisateur spécifié. Cependant, nous devons utiliser le evalcar l'expansion de la variable $userse produit après l'expansion de ~. Donc, en utilisant les evalguillemets et les doubles, vous développez efficacement d' $userabord, puis appelez eval echo "~phemmer".

Une fois que vous avez le répertoire personnel, il suffit de virer /.sshau bout.

$ sshdir="$(eval echo "~$user/.ssh")"
$ echo "$sshdir"
/home/phemmer/.ssh
Patrick
la source
Excellente réponse avec tout le polissage qui inclut la awkmagie (que je n'ai jamais vraiment comprise)
Adam Ryczkowski
1
Est-il toujours sûr de supposer que le sshdir le sera ~/.ssh? Cela peut-il être modifié par un paramètre de configuration n'importe où ou est-il codé en dur dans ssh?
terdon
2
C'est une valeur par défaut, qui peut être modifiée dans /etc/ssh/ssh_configet sshd_config; au moins sur Ubuntu 14.04
Adam Ryczkowski
4

vous recherchez le répertoire personnel de $ myuser?

 awk -F: -v user=$myuser '$1==user { print $6 ;}' /etc/passwd

vous pouvez utiliser

 awk -F: -v user=$myuser '$1==user { printf "%s/.ssh\n",$6;}' /etc/passwd

pour obtenir .ssh dir.

Archemar
la source