У меня есть 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.
Здесь уже есть много хороших ответов, но это может кому-то помочь.