![/home甚至不是一个普遍的约定。](https://linux22.com/image/97676/%2Fhome%E7%94%9A%E8%87%B3%E4%B8%8D%E6%98%AF%E4%B8%80%E4%B8%AA%E6%99%AE%E9%81%8D%E7%9A%84%E7%BA%A6%E5%AE%9A%E3%80%82.png)
是否可以将通常分配给(在 Debian 和 Ubuntu 等发行版中)的目录的功能/home
(全部)赋予另一个目录?例如,如果您可以执行此操作并将其更改为,/xyz
那么所有新的人类拥有的用户目录将安装在下面/xyz
(例如,Sally 的桌面路径将代替/xyz/Sally/Desktop
并且/home/Sally/Desktop
不需要/home
存在)。
我正在开发一个可保存路径并加载它们的便携式程序。如果它在另一台计算机上使用,其主目录不在/home
(因此没有/home
,而是具有其功能的另一个路径),那么我希望它调整路径以在中具有正确的主目录位置当加载路径时,它适用于新计算机。
答案1
不需要放置主目录/home
,并且如果您的程序硬连线任何此类假设(例如所有主目录共享一个公共父目录或该父目录被命名),则该程序是错误的/home
。
/home
甚至不是一个普遍的约定。
/home
这个想法是在 Unix 发明一段时间后才产生的。在早期的 Unices 中,使用了其他目录。如今,在 FreeBSD(及其衍生产品)等操作系统上仍然可以看到这种情况,其中/home
符号链接和用户目录实际上位于/usr/home
.
Solaris 同样放置了“真正的”主目录,/export/home
以便/home
可以充满自动 NFS 挂载等。
/home
不是许多常见主目录的父目录。
有很多主目录并不位于/home
.
- 最明显的一个是
/root
,超级用户的主目录,从其旧位置移动,以便/
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
.
在 Linux 操作系统上使用命令 的-d
( --home
) 和-m
( --move-home
) 选项创建帐户后可以移动主目录。usermod
OpenBSDusermod
有相同的选项。 (不要对pw usermod
FreeBSD、TrueOS/PC-BSD 等上的命令执行相同操作。-m -d
那里的组合具有细微不同的含义。)
主目录不必在/home
.
即使创建帐户时使用的传统父目录也可以更改,但不一定/home
。
在 Linux 操作系统和 OpenBSD 上,如果未使用( ) 显式命名,则该useradd
命令的-b
( --base-dir
) 选项指定在其中创建主目录的父目录。这-d
--home
默认基目录是OpenBSD 上base_dir
的变量,也是许多 Linux 上的变量。系统管理员可以随意更改此设置。/etc/usermgmt.conf
HOME
/etc/default/useradd
在 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 或可以指向零长度字符串.)- 如果您想以独立于其实际位置的方式象征性地表示用户的主目录,您可以采用类似 shell 波浪线扩展的约定:
~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