/home甚至不是一个普遍的约定。

/home甚至不是一个普遍的约定。

是否可以将通常分配给(在 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
  • 在 OpenBSD 上,系统操作员帐户具有主目录/operator,并且各种非个人用户帐户也拥有/var/empty其主目录。

主目录不必保留在/home.

在 Linux 操作系统上使用命令 的-d( --home) 和-m( --move-home) 选项创建帐户后可以移动主目录。usermod

OpenBSDusermod有相同的选项。 (不要对pw usermodFreeBSD、TrueOS/PC-BSD 等上的命令执行相同操作。-m -d那里的组合具有细微不同的含义。)

主目录不必在/home.

即使创建帐户时使用的传统父目录也可以更改,但不一定/home

在 Linux 操作系统和 OpenBSD 上,如果未使用( ) 显式命名,则该useradd命令的-b( --base-dir) 选项指定在其中创建主目录的父目录。这-d--home默认基目录是OpenBSD 上base_dir的变量,也是许多 Linux 上的变量。系统管理员可以随意更改此设置。/etc/usermgmt.confHOME/etc/default/useradd

在 FreeBSD、TrueOS/PC-BSD 等上。-b该命令有一个类似的选项pw useradd,并且可以通过home中的变量修改默认值/etc/pw.conf

应对这个

您的程序不应该对主目录或其父目录的位置有任何期望。

  • 如果您想知道当前登录用户的主目录,请使用HOME环境变量。它是由 、 等程序设置的loginuserenv或者systemd是在切换登录帐户时设置的。如果没有HOME环境变量,则中止是一个有效的设计选择,因为需要存在登录会话环境变量才能运行程序。否则,您可以依靠获取进程的有效/真实(视情况而定)UID 并查询密码数据库。
  • getpwnam()如果您想知道特定用户的主目录,请使用/getpwnam_r()getpwuid()/库函数查询密码数据库getpwiud_r()并提取该pw_dir字段。 (注意该字段可以为 NULL 或可以指向零长度字符串.)
  • 如果您想以独立于其实际位置的方式象征性地表示用户的主目录,您可以采用类似 shell 波浪线扩展的约定:~JdeBP。许多程序都这样做,从vimmailx

进一步阅读

答案2

如果您想将用户主目录位置更改为其他位置,请参考此答案

https://stackoverflow.com/questions/20797819/command-to-change-the-default-home-directory-of-a-user

相关内容