Каков надежный способ получения каталога .ssh каждого пользователя из bash?


8

Я могу разобрать / etc / passwd с помощью augtool:

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

... но это кажется слишком запутанным.

Есть ли какой-нибудь простой, специализированный инструмент для отображения пользовательского дома (например, usermodего можно использовать для его изменения )?


Вы ищете кукольный ответ?
mgjk

@mgjk Нет, я знаю, как сделать это на марионетке. На самом деле мне нужен этот ответ, чтобы написать сценарий начальной загрузки, который устанавливает puppetmaster в контейнере LXC :-)
Адам Рычковски,

Ответы:


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

~Оператор в оболочке расширяется в домашний каталог указанного пользователя. Однако мы должны использовать evalпотому, что расширение переменной $userпроисходит после расширения ~. Таким образом, используя evalдвойные кавычки и, вы эффективно расширяете $userсначала, а затем звоните eval echo "~phemmer".

Когда у вас есть домашний каталог, просто прикрепите его /.sshк концу.

$ sshdir="$(eval echo "~$user/.ssh")"
$ echo "$sshdir"
/home/phemmer/.ssh

Отличный ответ со всей полировкой, включающей в себя awkмагию (которую я никогда по-настоящему не понимал)
Адам Рычковски,

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 dir.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.