【问题标题】:How can I make a chgrp command optional in my install script?如何在我的安装脚本中使 chgrp 命令可选?
【发布时间】:2024-01-07 00:31:01
【问题描述】:

我正在为 Linux 游戏创建安装脚本。作为安装的一部分,我将游戏可执行文件的 suid 权限更改为“游戏”组,这样游戏即使在普通用户运行时也可以更新高分文件。

现在我的 Makefile.am 看起来像这样:

AUTOMAKE_OPTIONS = foreign
SUBDIRS = src man

install-exec-hook:
    chgrp games @bindir@/xjump
    chmod +s    @bindir@/xjump

    mkdir -p    @localstatedir@/xjump
    touch       @localstatedir@/xjump/record
    chmod 660   @localstatedir@/xjump/record
    chgrp games @localstatedir@/xjump/record

我遇到的问题是 chgrp 命令需要管理权限。如果我使用sudo make install 在全球范围内安装游戏,那么它一切正常,但如果我将前缀更改为我的主目录中的某个位置并尝试执行常规make install,它会由于 chgrp 而失败

chgrp: changing group of ‘/home/hugo/Desktop/aaa/bin/xjump’: Operation not permitted

由于游戏的本地安装版本只有一个玩家,我真的不需要做 chgrp 的事情。有没有办法检测makefile是否在没有root权限的情况下运行并跳过权限更改?或者我应该在我的配置脚本中添加一个配置标志,而不是尝试自动修复这个权限问题?

【问题讨论】:

  • 是的,chgrp 需要 root 权限。否则,您可以通过“给”他们一堆文件并超出其磁盘配额来对组或用户进行简单的 DoS 攻击。只有 root 可以以任意方式放弃文件。或者愚蠢的系统黑客,比如创建一个你拥有的 suid 二进制文件,chown/chgrp-ing 到 root/wheel,然后完全颠覆系统。
  • 我的问题是,如果我为单个用户安装,则不需要 chgrp。因此,在这种情况下,我希望安装脚本不需要像现在这样的 root。
  • 如果只是针对单个用户,为什么要更改组呢?将分数文件放入用户的主目录中,作为用户拥有/分组。
  • 它并不总是针对单个用户。我希望选择全局或本地安装。

标签: linux sh file-permissions autoconf chgrp


【解决方案1】:

当命令失败时,您没有以 root 身份运行。似乎没有任何问题,您只是不想要错误消息。 你可以看到你是谁,但最简单的解决方案是重定向输出 以 true 结尾,这样您的步骤就不会失败:

chgrp games @localstatedir@/xjump/record 2>/dev/null || true

【讨论】:

  • 这行得通!但是想知道是否没有更细致入微的方法来解决这个问题,而不会吞下 chgrop 可能抛出的任何其他错误。
  • 你可以使用类似[ "$(id -u)" = "0" ]的东西,但是你会引入更多的控制语句。 makefile 不是 shellscript。
【解决方案2】:

如果您运行“whoami”,您将能够找出当前用户是谁。

    runner=`whoami` ; 
    if test $$runner == "root" ; 
    then 
            chgrp games @localstatedir@/xjump/record
    fi

【讨论】: