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

Я могу проанализировать / 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 можно использовать для его изменения )?

Вы никогда не должны разбирать /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 и double, вы фактически расширяете $user сначала, а затем вызываете eval echo "~phemmer" .

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

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

вы ищете домашний каталог $ 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.