覆盖 HOME 位置

覆盖 HOME 位置

我想在脚本中本地覆盖用户的主位置,以强制应用程序可移植地存储/加载其设置。

export HOME=$TMPDIR/Data
export XDG_CONFIG_HOME=$TMPDIR/Data

这些在大多数情况下都有效,但有一些应用程序仍然可以找到“真正的”主路径。

为什么我覆盖用户主位置的方法不起作用?

答案1

不幸的是,这很大程度上取决于您的应用程序是什么。应用程序可以通过多种方式显示用户的主目录。

  1. $HOME

    你已经知道这一点了。$HOME是一个可以通过登录配置覆盖的环境变量。文件,例如.bashrc.bash_profileBash 环境中的文件。该值通常类似于/home/username

  2. /home/$USER

    我认为这是 的变体$HOME,但我遇到过一些应用程序愚蠢地假设用户的主目录必须位于 下/home,因此他们附加该变量$USER并使用它。

  3. 解析/etc/passwd

    就获取用户主目录的最糟糕方法而言,这可能是最严重的罪犯,但许多工具和脚本都是这样做的。他们中的大多数都是这样的变体,他们使用getent命令:

    $ getent passwd | grep $1 | awk -F: '{ print $6 }'
    
    # for example (user "saml")
    $ getent passwd | grep saml | awk -F: '{ print $6 }'
    /home/saml
    

    存储用户信息的后端“数据库”可以是从文件/etc/passwd、NIS 到 LDAP 数据库的任何内容。

  4. GTK &g_get_home_dir()

    GTK 库提供了一个 API,g_get_home_dir()它将从“passwd”后端提取用户信息,而不是使用$HOME.

    摘自GLib 参考手册

    请注意,与传统的 Unix 工具相比,此函数更喜欢 passwd 条目而不是 HOME 环境变量。

  5. 凯德

    KDE 似乎使用了 $HOME。它将首先查找,如果未设置则KDEHOME 返回到。$HOME/.kde

    摘抄KDE 系统管理/KDE 文件系统层次结构

    顾名思义,该目录树通常位于用户的主目录中。如果未定义此环境变量,则使用默认位置 $HOME/.kde4。

答案2

有两种方法可以获取当前用户的主目录。

  • 一种方法是查看用户的密码条目(在/etc/passwd)。
  • 另一种方法是查看HOME环境变量。$HOME实际上是从 passwd 条目设置的。可能设置它的应用程序包括终端仿真器、登录管理器和 sudo。

您无法欺骗的应用程序可能正在查看用户的密码条目。它们也有可能将用户的主目录存储在某处(可能作为某个文件或目录的绝对路径的一部分)并忽略两者HOME和 passwd 条目。

检查应用程序是否使用HOME环境变量的一种方法是 grep 查找它。例如,grep HOME /usr/bin/pdftex将返回Binary file /usr/bin/pdftex matches,表示pdftex可能会使用$HOME

要获得更明确的答案,请查看应用程序的源代码。
用于grep -r 'getenv\s\?(.*HOME'稍微加快源代码分析速度。

相关内容