¿Cuál es la forma confiable de obtener el directorio .ssh de cada usuario de bash?

8

Puedo analizar / etc / passwd con augtool:

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

... pero parece demasiado complicado.

¿Existe alguna herramienta simple y dedicada para mostrar el hogar de los usuarios (como usermodse puede usar para cambiarlo )?

Adam Ryczkowski
fuente
¿Estás buscando una respuesta títere?
mgjk
@mgjk No, sé cómo hacerlo en títeres. De hecho, necesito esta respuesta para escribir un script de arranque que configure un puppetmaster en un contenedor LXC :-)
Adam Ryczkowski

Respuestas:

15

Nunca debe analizar /etc/passwddirectamente. Es posible que esté en un sistema con usuarios remotos, en cuyo caso no estarán /etc/passwd. El /etc/passwdarchivo podría estar en otro lugar. Etc.

Si necesita acceso directo a la base de datos de usuarios, use getent.

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

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

Sin embargo, también hay otra forma que no implica el análisis:

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

El ~operador en el shell se expande al directorio de inicio del usuario especificado. Sin embargo, tenemos que usar el evalporque la expansión de la variable $userocurre después de la expansión de ~. Entonces, al usar las evalcomillas dobles y, se está expandiendo efectivamente $userprimero, luego llamando eval echo "~phemmer".

Una vez que tenga el directorio de inicio, simple tachuela /.sshhasta el final.

$ sshdir="$(eval echo "~$user/.ssh")"
$ echo "$sshdir"
/home/phemmer/.ssh
Patricio
fuente
Gran respuesta con todo el pulido que incluye la awkmagia (que nunca entendí realmente)
Adam Ryczkowski
1
¿Siempre es seguro asumir que el sshdir lo será ~/.ssh? ¿Puede eso ser cambiado por una configuración en cualquier lugar o está codificado en ssh?
terdon
2
Es un valor predeterminado, que se puede cambiar en /etc/ssh/ssh_configy sshd_config; al menos en Ubuntu 14.04
Adam Ryczkowski
4

¿Está buscando el directorio de inicio de $ myuser?

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

puedes usar

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

para obtener el directorio .ssh.

Archemar
fuente