Qual é a maneira confiável de obter o diretório .ssh de cada usuário a partir do bash?

8

Eu posso analisar o / etc / passwd com augtool:

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

... mas parece um pouco complicado.

Existe alguma ferramenta simples e dedicada para exibir o domicílio dos usuários (como usermodpode ser usado para alterá- lo)?

Adam Ryczkowski
fonte
Você está procurando uma resposta fantástica?
mgjk
@mgjk Não, eu sei como fazê-lo em fantoches. Na verdade eu preciso esta resposta para escrever um script de inicialização que configura uma puppetmaster em um recipiente LXC :-)
Adam Ryczkowski

Respostas:

15

Você nunca deve analisar /etc/passwddiretamente. Você pode estar em um sistema com usuários remotos; nesse caso, eles não estarão /etc/passwd. O /etc/passwdarquivo pode estar em outro lugar. Etc.

Se você precisar de acesso direto ao banco de dados do usuário, use getent.

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

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

No entanto, há também outra maneira que não envolve a análise:

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

O ~operador no shell se expande para o diretório inicial do usuário especificado. No entanto, temos que usar o evalporque a expansão da variável $userocorre após a expansão de ~. Portanto, usando as evalaspas e duplas, você estará expandindo efetivamente $userprimeiro e depois chamando eval echo "~phemmer".

Depois de ter o diretório inicial, siga /.sshpara o final.

$ sshdir="$(eval echo "~$user/.ssh")"
$ echo "$sshdir"
/home/phemmer/.ssh
Patrick
fonte
Grande resposta com todo o polimento que inclui a awkmagia (que eu nunca realmente entendeu)
Adam Ryczkowski
1
É sempre seguro assumir que o sshdir será ~/.ssh? Isso pode ser alterado por uma configuração em qualquer lugar ou é codificado no ssh?
terdon
2
É um padrão, que pode ser alterado em /etc/ssh/ssh_confige sshd_config; pelo menos no Ubuntu 14.04
Adam Ryczkowski
4

você está procurando pelo diretório doméstico de $ myuser?

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

você pode usar

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

obter .ssh dir.

Archemar
fonte