Як отримати ДОМАШНЬОГО ПОЛУЧЕННЯ?


41

Я маю USERзмінну в своєму сценарії, і я хочу бачити його HOMEшлях на основі USERзмінної. Як я можу це зробити?

Відповіді:


72

Існує утиліта, яка буде шукати інформацію користувачів, незалежно від того, зберігається ця інформація в локальних файлах, таких як /etc/passwdабо в LDAP або іншому методі. Це називається getent.

Для того, щоб вивести з нього інформацію про користувача, ви запустите getent passwd $USER. Ви отримаєте рядок назад, який виглядає так:

[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash

Тепер ви можете просто вирізати з нього домашній директор, наприклад, використовуючи нарізку, наприклад:

[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny

getent - краща відповідь, особливо з віддаленим користувачем. у більш простих системах ~ користувача повинно бути достатньо. Модерував тебе.
Rui F Ribeiro

@RuiFRibeiro ви не можете використовувати ~fooзі змінними в bash. Не безпосередньо, все одно.
муру

1
@muru - це правда - і це специфіка поведінки. ~дійсно здається вкладка-розширення, хоча і інший білд поведінку тильди-префікс має бути замінено на ім'я шляхом первісного робочого каталогу , пов'язаний з ім'ям користувача , отриманим з допомогою getpwnam()функції і тому , ймовірно , що пошук дуже добре. Мені не подобаються розширення табуляцій, хоча - я люблю вводити вкладки.
mikeserv

1
Зауважте, що це отримує лише початкове значення $ HOME; сценарії входу користувача повністю мають право змінити його на щось інше. Це незвично, але я можу придумати ситуації, коли це було б розумно, наприклад, вибір між місцевим хомедіром та NFS.
zwol

1
Колони @HagenvonEitzen заборонені саме тому, що їх використовували для розділення полів.
Jenny D

9

Ви можете використовувати evalдля отримання домашнього каталогу когось.

eval echo "~$USER"

Принаймні для місцевих користувачів це працює точно. Я не знаю, чи обробляються віддалені користувачі, такі як LDAP eval.


1
Тут немає необхідності в eval. Будьте уважні зі своєю англійською.
Rui F Ribeiro

4
@nwk evalпотрібен. Bash не обробляється ~fooпісля змінного розширення.
муру

1
Цікаво, дякую, однак це отримує лише каталог поточного користувача, а не інших користувачів. Я думаю, що користувачі LDAP не звертаються, хоча я можу помилитися.
Rui F Ribeiro

3
@RuiFRibeiro Це буде добре працювати з LDAP, просто використовуйте будь-яку зміну, а не ім'я користувача вашого LDAP USER.
муру

3
Не використовуйте це, не перевіряючи, що $USERрозширюється лише на один рядок алфавітних символів.
чепнер

4

Звичайне місце є /home/$USER, але це не повинно бути універсальним. Визначальне місце для пошуку такої інформації знаходиться всередині файлу /etc/passwd.

Цей файл читається у всьому світі (кожен може прочитати його), тому будь-який користувач має доступ до його вмісту.
Якщо у файлі існує $ USER, попередній та останній запис - це HOME-користувач.

Це дозволить вибрати запис та надрукувати каталог HOME:

awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"

Для більш складних (віддалених) систем getent - це звичайна команда для отримання інформації про користувачів з системи NSS (Name Service Switch Library).

Команда

echo $(getent passwd $USER )| cut -d : -f 6

Надає еквівалентну інформацію (якщо є).


2
у вас є ~ user для цього, і ваше рішення не розглядає користувачів у більш складних системах, як-от користувач з LDAP, де вам потрібно використовувати getent.
Rui F Ribeiro

2

Якщо користувача не існує, 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'"

1

Якщо ви зареєстровані як root, якщо ви знаєте USERпароль або якщо у USERвас немає пароля, наступний варіант - це ще один варіант:

    su -c 'echo ~' ${USER}

За стандартної suповедінки, якщо USERвона не визначена або порожня, suспробує запустити команду як корінь.

Якщо значення USERне є допустимим ім'ям користувача, то буде піднято відповідна помилка: su: user <user> does not exist.

Тут вже багато хороших відповідей, але це все одно може допомогти комусь.


Це не безпечно, залежно від конфігурації системи. Він запускає процес (оболонка, що виконує відлуння) як цей користувач, тож користувач міг (наприклад) простежити оболонку і дати вам довільний вихід. Він також працює в налаштуваннях користувача, тому можливо, що конфігураційні файли оболонки користувачів запускаються (що також може давати довільні виходи). Або навантаження на навколишнє середовище через пам. І т. Д. Або просто зробіть щось таке просте, як надіслати його SIGSTOP, щоб він пройшов назавжди, ефективно DOS атакував ваш сценарій.
дероберт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.