deb包postinst脚本错误将目录创建到/root而非普通用户家目录问题求助
问题根因
- deb包的所有维护脚本(包括preinst、postinst、prerm、postrm)在安装过程中都是以root身份运行的,此时环境变量
$HOME默认指向/root,同时普通用户的XDG_CACHE_HOME、XDG_DATA_HOME等用户级环境变量不会传递到root的执行上下文里,所以你的脚本会把目录创建到/root路径下。 - 额外的逻辑问题:deb包属于系统级安装组件,原则上不应该直接操作用户主目录的内容——你无法预知安装后哪些用户会使用这个软件,在安装阶段直接写入某个用户的家目录本身就是不符合deb打包规范的操作。
- 你的
mkdir参数存在错误:-m 666给目录设置的权限没有执行位,没有执行位的目录无法进入、也无法在内部创建文件,目录的基础权限至少需要设置为7开头,比如755。
正确的实现方案
如果你的需求是给每个使用软件的用户生成私有的配置、数据目录:
- 移除postinst里操作用户主目录的代码
- 在
/etc/profile.d/目录下安装一个随用户登录执行的脚本,比如/etc/profile.d/99-example-init.sh,内容如下:
#!/usr/bin/env bash configdir="${XDG_CACHE_HOME:-$HOME/.config}/example" datadir="${XDG_DATA_HOME:-$HOME/.local/share}/example" [ -d "$configdir" ] || mkdir -m 755 "$configdir" [ -d "$datadir" ] || mkdir -m 755 "$datadir"
这个脚本会在每个用户登录时以用户自己的身份执行,会自动创建对应用户家目录下的路径。
如果你的需求是存放系统级的公共配置、资源:
直接使用系统级标准路径即可,比如公共配置放/etc/opt/example,公共数据放/usr/share/example,不需要操作用户家目录。
如果你的软件是服务类程序,有固定的专属运行用户:
可以在postinst里先创建对应的系统用户,再切换到该用户身份创建目录,示例代码:
# postinst中执行 id -u example >/dev/null 2>&1 || useradd -r -s /sbin/nologin example runuser -u example -- mkdir -p ~example/.config/example ~example/.local/share/example
内容的提问来源于stack exchange,提问作者user11819675
相关产品推荐
相关产品推荐

