Можно ли переопределить тильду ('~', домашний каталог)?

13

Можно ли переопределить домашний каталог? например , чтобы /ext1/usernameвместо того , чтобы /home/username, например , разлагая ~в другой каталог (в отличие от изменения фактического домашнего каталога , где домашние файлы пользователей расположены).

(Этот вопрос носит в основном академический характер, так как это кажется плохой практикой. У меня также нет выбора в отношении использования csh, несмотря на то, что я прочитал Топ-10.)

Эндрю Чонг
источник
11
Вы имеете в виду изменить фактический домашний каталог, или вы хотите, чтобы оболочка расширилась ~до чего-то другого, кроме реального домашнего каталога?
Дероберт
Я имел в виду расширение ~до другого каталога (нет, если я правильно понимаю вашу альтернативу, изменение места расположения домашних каталогов всех пользователей). Я не понимал, что это ~было истолковано как краткая форма $HOME, как @michas описал в своем ответе.
Эндрю Чонг
2
Не все домашние каталоги пользователей, вы можете изменить только один, как показывает slm в своем ответе.
Дероберт

Ответы:

28

Тильда ~интерпретируется вашей оболочкой. Ваша оболочка будет интерпретироваться ~как короткая форма $HOME.

Попробуй (echo ~; HOME=foo; echo ~). Это должно сначала напечатать ваш настоящий домашний каталог, а затем "foo", как вы установили $HOME.

Значение по умолчанию $HOMEзависит от конфигурации вашей системы. Используйте getent passwdдля перечисления всех известных пользователей и их домашних каталогов. В зависимости от конфигурации вашей системы эти записи могут поступать из /etc/passwdлюбой удаленной службы каталогов.

Если вы хотите временно переопределить ваш домашний каталог, просто установите другой $HOME.

Если вы постоянно хотите изменить его, вы должны изменить запись passwd, например, путем ручного редактирования /etc/passwd.

Михась
источник
Спасибо, @michas. Не могу поверить, что я пропустил эту переменную. (Кстати, получается, cshчто соответствующая переменная $home(в нижнем регистре), а вы не setenv HOME /ext1/acheongможете - вы можете только set home=/ext1/acheong, и это сработало для меня.)
Эндрю Чонг
2
Чтобы изменить его навсегда, вы также можете использоватьusermod -d
user606723
1
Используйте vipw(или любой другой графический интерфейс, который предоставляет ваша ОС), а не редактируйте /etc/passwdнапрямую. Прямое редактирование может повредить файл, который может быть трудно восстановить.
Кит Томпсон
11

Используемое значение ~определяется из значения, которое вы получаете из административной базы данных ( getent passwd), обычно в /etc/passwdфайле, для домашнего каталога каждого пользователя, который там определен.

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

В шестом столбце этого файла указано значение, используемое при вводе cd ~.

NSSwitch

Вы можете увидеть, что система будет использовать для домашнего каталога пользователя, используя команду getent passwd:

$ getent passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

«База данных», которая предоставляет их, управляется через ваш системный преобразователь, определенный в /etc/nsswitch.conf.

$ grep passwd /etc/nsswitch.conf 
#passwd:    db files nisplus nis
passwd:     files

Указанные выше файлы означают /etc/passwd, что «база данных» может поступать, например, из LDAP, NIS или других мест в сети.

Перемещение / переосмысление?

Выполнить эту операцию немного сложно после создания учетных записей. Если вы создаете учетные записи с нуля, переопределить местоположение пользователя в его домашнем каталоге тривиально. При запуске useraddкоманды вы можете указать местоположение, которое будет использоваться для домашнего каталога пользователя.

пример

$ useradd -d /ext1/acheong ...

выдержка из справочной страницы

-d, --home HOME_DIR
   The new user will be created using HOME_DIR as the value for the users 
   login directory. The default is to append the LOGIN name to BASE_DIR and 
   use that as the login directory name. The directory HOME_DIR does not 
   have to exist but will not be created if it is missing.

Для существующих аккаунтов?

Это становится скорее хирургической операцией, поскольку часто путь к домашнему каталогу пользователя статически включается в файлы конфигурации, что усложняет его.

пример

$ grep home /home/sam/.*
/home/sam/.gtkrc-1.2-gnome2:include "/home/sam/.gtkrc.mine"

Они либо должны быть исправлены, либо вам нужно будет предоставить ссылку /home/samна новое местоположение /ext1/sam.

Перемещение, когда «база данных» не /etc/passwd

Если система получает домашние каталоги из LDAP, NIS и т. Д., Вам необходимо выполнить перемещение в этих системах и согласовать перемещение файлов из /home/samв /ext1/sam.

Ссылки

SLM
источник
Конечно, изменение, которое потребует перемещения файлов пользователя. И, вероятно, оставив символическую ссылку на старом месте (иначе многое сломается ...)
Дроберт
@derobert - да, сделав это несколько раз, я стараюсь избежать этого, как чума.
SLM
@slm - Спасибо за такой подробный ответ (и немного истории). Боюсь, я хотел сделать что-то гораздо более простое, и я не знал о существовании переменной среды, представляющей домашний каталог сеанса. Я уверен, что ваш ответ поможет другому читателю в будущем, однако. Еще раз спасибо.
Эндрю Чонг
1

Если причина заключается в распределении пользователей по нескольким файловым системам, вы также можете использовать automounter. И даже позволяют вам иметь другой «базовый» каталог для ваших пользователей.

sleepyweasel
источник