/home
Можно ли вместо этого (полностью) передать функциональность каталога, который обычно назначается (в дистрибутивах вроде Debian и Ubuntu), другому каталогу? Например, если бы вы могли это сделать и изменили его на /xyz
, то все ваши новые пользовательские каталоги, принадлежащие человеку, были бы установлены в /xyz
(например, путь к рабочему столу Салли был бы /xyz/Sally/Desktop
вместо /home/Sally/Desktop
и /home
не нуждался бы в существовании).
Я работаю над портативной программой, которая сохраняет пути и загружает их. Если она используется на другом компьютере с домашним каталогом, который не находится в /home
(и, следовательно, нет /home
, а есть другой путь с его функциональностью), то я хочу, чтобы она скорректировала путь, чтобы иметь правильное расположение домашнего каталога в нем для нового компьютера, когда вместо этого загружается путь.
решение1
Домашние каталоги не обязательно размещать в , /home
и ваша программа ошибочна, если она жестко закладывает какие-либо предположения, например, что все домашние каталоги имеют общего родителя или что этот родитель называется /home
.
/home
это даже не всеобщая конвенция.
/home
была идея, задуманная довольно давно после изобретения Unix. В ранних Unix использовались другие каталоги. Это все еще можно увидеть сегодня в операционных системах, таких как FreeBSD (и ее производных), где /home
есть символическая ссылка, а пользовательские каталоги фактически находятся в /usr/home
.
Solaris также размещает «настоящие» домашние каталоги, /export/home
чтобы /home
можно было заполнить их автоматическими монтированиями NFS и т. п.
/home
не является родительским каталогом для многих обычных домашних каталогов.
Существует множество домашних каталогов, которые не находятся в /home
.
- Наиболее очевидным из них является
/root
домашний каталог суперпользователя, перемещенный из своего старого расположения,/
чтобы личные файлы и файлы «dot» пользователя root не загромождали корневой каталог, но оставались на корневом томе, чтобы суперпользователь мог войти в систему даже в случае сбоя монтирования других томов диска. - Различные демоны имеют домашние каталоги в других местах для специальных учетных записей, от имени которых эти демоны работают.
- Различные учетные записи демонов qmail используют
/var/qmail
, например, или/var/qmail/alias
. Последний даже обычно называется~alias
и являетсяразработанныйбыть домашним каталогом с~alias/.qmail
файлами, как в домашних каталогах других (реальных) пользователей. - Различные серверные программы HTTP(S) и FTP(s) имеют (официальные или неофициальные) соглашения. Например: домашние каталоги для виртуальных хостов, имеющих выделенные системные учетные записи, могут быть
/var/www
или/var/www/$VHOST
. - Другое программное обеспечение можно найти в различных операционных системах, использующих домашние каталоги для неперсональных учетных записей пользователей, таких как
/var/unbound
,/var/db/mysql
, и/var/db/tor
. - Различные обычные неперсональные учетные записи пользователей имеют домашние каталоги, такие как
/sbin
,/var/adm
,/var/spool/lpd
,/var/spool/mail
,/var/spool/news
,/var/spool/uucp
и так далее.
- Различные учетные записи демонов qmail используют
- В OpenBSD учетная запись системного оператора имеет домашний каталог
/operator
, а различные учетные записи пользователей, не являющиеся персональными, имеют/var/empty
свои домашние каталоги.
Домашние каталоги не обязательно должны оставаться в /home
.
Домашние каталоги можно перемещать после создания учетной записи, используя параметры -d
( --home
) и -m
( --move-home
) команды usermod
в операционных системах Linux.
В OpenBSD usermod
есть те же самые опции. (Не делайте того же самого с pw usermod
командой в FreeBSD, TrueOS/PC-BSD и т. д. -m -d
Комбинация там имеет немного иное значение.)
Домашние каталоги не обязательно создавать в /home
.
Даже обычный родительский каталог, используемый при создании учетных записей, может быть изменен, и это не обязательно /home
.
В операционных системах Linux и OpenBSD параметр useradd
команды -b
( --base-dir
) указывает родительский каталог, в котором создаются домашние каталоги, если он явно не указан с помощью -d
( --home
).по умолчаниюБазовый каталог — это base_dir
переменная в /etc/usermgmt.conf
OpenBSD и HOME
переменная в /etc/default/useradd
во многих Linux. Системный администратор может изменить это по своему усмотрению.
В FreeBSD, TrueOS/PC-BSD и т. д. есть аналогичная -b
опция для pw useradd
команды и значение по умолчанию для нее, которое можно изменить с помощью home
переменной в /etc/pw.conf
.
Как с этим справиться
Ваша программа не должна задавать никаких жестких ожиданий относительно расположения домашних каталогов или их родительских каталогов.
- Если вы хотите узнать домашний каталог текущего вошедшего в систему пользователя, используйте
HOME
переменную окружения. Она устанавливается такими программами, какlogin
,userenv
илиsystemd
при переключении вошедшей в систему учетной записи. ЕслиHOME
переменной окружения нет, то допустимым решением будет просто прервать работу, поскольку переменные окружения сеанса входа должны присутствовать для запуска вашей программы. В противном случае вы можете прибегнуть к получению эффективного/реального (в зависимости от ситуации) UID процесса и запросу базы данных паролей. - Если вы хотите узнать домашний каталог конкретного пользователя, выполните запрос к базе данных паролей с помощью библиотечных функций
getpwnam()
/getpwnam_r()
илиgetpwuid()
/getpwiud_r()
и извлекитеpw_dir
поле. (Обратите внимание, чтоэто поле может быть NULL или указывать на строку нулевой длины.) - Если вы хотите символически обозначить домашний каталог пользователя способом, который не зависит от его фактического местоположения, вы можете принять соглашение о расширении тильды в стиле оболочки:
~JdeBP
. Многие программы делают это, отvim
доmailx
.
дальнейшее чтение
- Разница между «/export/home» и «/home»
- Джонатан де Бойн Поллард.
userenv
. страницы руководства по набору инструментов Nosh. - Джонатан де Бойн Поллард (2016).Ложные утверждения о среде демонов". Исправления для systemd doco. Часто задаваемые ответы.
решение2
если вы хотите изменить местоположение домашнего каталога пользователя на какое-то другое место, то обратитесь к этому ответу
https://stackoverflow.com/questions/20797819/command-to-change-the-default-home-directory-of-a-user