Skip to content

chore: add quotes to rm command in postrm script#520

Merged
lzwind merged 1 commit intolinuxdeepin:masterfrom
lzwind:master
Apr 16, 2026
Merged

chore: add quotes to rm command in postrm script#520
lzwind merged 1 commit intolinuxdeepin:masterfrom
lzwind:master

Conversation

@lzwind
Copy link
Copy Markdown
Contributor

@lzwind lzwind commented Apr 16, 2026

Quote variables in rm -rf command to prevent globbing and word splitting, addressing shellcheck SC2086 warning for safer package removal.

log: add quotes to rm command in postrm script

Quote variables in rm -rf command to prevent globbing and word splitting,
addressing shellcheck SC2086 warning for safer package removal.

log: add quotes to rm command in postrm script
@lzwind lzwind merged commit 59ed3a9 into linuxdeepin:master Apr 16, 2026
15 of 16 checks passed
@deepin-ci-robot
Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: lzwind, wyu71

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@deepin-ci-robot
Copy link
Copy Markdown

deepin pr auto review

这段代码是一个 Debian 软件包的 postrm(安装后移除)脚本,用于在卸载或清除软件包时执行清理操作。以下是对这段 diff 的详细审查,包括语法逻辑、代码质量、代码性能和代码安全方面的改进建议:

1. 语法逻辑审查

当前代码逻辑:

userName=$(who)
if [ "$1" = "purge" ]; then
    rm -rf "/home/${userName%% *}/.config/deepin/deepin-terminal/"*

问题与改进:

  1. 变量引用:diff 中已经将 $1 和路径引用加了双引号,这是正确的改进,可以防止包含空格的路径或参数导致的错误。
  2. 用户名获取方式:使用 who 命令获取当前用户名在系统维护脚本中是不稳定的。postrm 脚本可能由 root 用户在非交互式环境(如包管理器)中执行,此时 who 可能返回空或不预期的结果。
    • 建议:应该遍历 /home 目录下的所有用户目录,或者从 /etc/passwd 获取实际使用过该软件的用户列表。
  3. 条件判断if [ "$1" = "purge" ] 是正确的,用于判断是否执行清除操作。

2. 代码质量审查

问题与改进:

  1. 硬编码路径/home/${userName%% *} 假设所有用户的家目录都在 /home 下。虽然这是常见做法,但不符合 POSIX 标准(用户家目录可能在不同位置)。
    • 建议:使用 getent passwd 获取用户家目录。
  2. 注释语言:注释使用中文(#解决...),虽然不影响功能,但在国际化项目中建议使用英文。
  3. 错误处理rm -rf 命令没有错误检查。如果目录不存在或删除失败,脚本会继续执行。
    • 建议:添加错误检查或使用 || true 忽略非关键错误。

3. 代码性能审查

问题与改进:

  1. who 命令who 需要读取系统登录记录,性能开销较大且在此场景下不必要。
    • 建议:直接遍历 /home 目录或使用更轻量的方法。
  2. rm -rf 操作:如果用户目录下有大量文件,rm -rf 可能会较慢。
    • 建议:如果只是删除配置文件,可以考虑直接删除整个配置目录(rm -rf /path/to/config),而不是目录下的文件。

4. 代码安全审查

问题与改进:

  1. 路径遍历风险${userName%% *} 虽然可以截断空格后的内容,但如果 userName 包含特殊字符(如 ../),可能导致路径遍历攻击。
    • 建议:对 userName 进行更严格的验证,或直接使用安全的目录遍历方法。
  2. 权限问题:脚本以 root 权限运行,如果 userName 被恶意篡改,可能导致误删系统文件。
    • 建议:确保 userName 是合法用户名(如通过正则表达式验证)。
  3. /nonexistent 目录:代码中提到 /nonexistent 目录残留问题,但未说明其来源。如果这是系统目录,直接操作可能不安全。
    • 建议:确认 /nonexistent 的用途,并确保操作是安全的。

改进后的代码示例

#DEBHELPER#

if [ "$1" = "purge" ]; then
    # 遍历所有用户家目录,删除 deepin-terminal 配置
    for user_home in $(getent passwd | cut -d: -f6); do
        config_dir="$user_home/.config/deepin/deepin-terminal"
        if [ -d "$config_dir" ]; then
            rm -rf "$config_dir" || true
        fi
    done

    # 解决 /nonexistent 目录残留问题
    if [ -f /nonexistent/.config/deepin/deepin-terminal/install_flag ]; then
        rm -f /nonexistent/.config/deepin/deepin-terminal/install_flag || true
    fi
fi

改进点总结:

  1. 使用 getent passwd 安全获取所有用户家目录。
  2. 直接删除整个配置目录,而不是目录下的文件。
  3. 添加 || true 忽略非关键错误。
  4. 更清晰的注释和逻辑。

进一步优化建议:

  • 如果 deepin-terminal 的配置文件很小,可以保留原逻辑(删除目录下的文件),但需要确保路径安全。
  • 如果 /nonexistent 目录是系统临时目录,建议在安装脚本中修复根本问题,而不是在卸载脚本中清理残留。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants