У меня есть USER
переменная в моем скрипте, и я хочу видеть его HOME
путь на основе USER
переменной. Как я могу это сделать?
У меня есть USER
переменная в моем скрипте, и я хочу видеть его HOME
путь на основе USER
переменной. Как я могу это сделать?
Ответы:
Существует утилита, которая ищет информацию пользователя независимо от того, хранится ли эта информация в локальных файлах, таких как /etc/passwd
или в LDAP, или каким-либо другим способом. Это называется getent
.
Для того, чтобы получить информацию о пользователе, вы запускаете getent passwd $USER
. Вы получите строку назад, которая выглядит так:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
Теперь вы можете просто вырезать из него домашний каталог, например, используя cut, например:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
с переменными в bash
. Во всяком случае, не напрямую.
~
действительно кажется вкладка-расширение, хотя и другой билд поведение тильды-префикс должно быть заменено на имя путем первоначального рабочего каталога , связанный с именем пользователя , полученным с помощью getpwnam()
функции и поэтому , вероятно , что поиск очень хорошо. мне не нравятся расширения вкладок, хотя - я люблю печатать вкладки.
Вы можете использовать, eval
чтобы получить чей-то домашний каталог.
eval echo "~$USER"
По крайней мере, для локальных пользователей это работает точно. Я не знаю, обрабатываются ли удаленные пользователи, такие как LDAP eval
.
eval
нужен. Bash не обрабатывает ~foo
после расширения переменной.
USER
.
$USER
расширяется до всего одной строки алфавитных символов.
Обычное место есть /home/$USER
, но это не обязательно должно быть универсальным. Определенное место для поиска такой информации находится внутри файла /etc/passwd
.
Этот файл доступен для чтения всем (любой может его прочитать), поэтому любой пользователь имеет доступ к его содержимому.
Если в файле существует $ USER, запись, предшествующая последней, является пользовательским каталогом HOME.
Это выберет запись и распечатает каталог HOME:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
В более сложных (удаленных) системах getent - это обычная команда для получения информации о пользователях из системы NSS (библиотеки Service Name Switch).
Команда
echo $(getent passwd $USER )| cut -d : -f 6
Предоставит эквивалентную информацию (если имеется).
Если пользователь не существует, getent
вернет ошибку.
Вот небольшая функция оболочки, которая не игнорирует код выхода getent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
Вот пример использования:
da_home="$(get_home missing_user)" || {
echo 'User does NOT exist!'; exit 1
}
# Now do something with $da_home
echo "Home directory is: '$da_home'"
Если вы вошли в систему как пользователь root, если вы знаете USER
пароль или если у USER
него нет пароля, следующий вариант - еще один вариант:
su -c 'echo ~' ${USER}
При стандартном su
поведении, если USER
он не определен или пуст, он su
попытается выполнить команду от имени пользователя root.
Если значение USER
не является допустимым именем пользователя, то будет поднят соответствующая ошибка: su: user <user> does not exist
.
Здесь уже есть много хороших ответов, но это может кому-то помочь.