Linux 如何在安装脚本中使chgrp命令成为可选命令?

Linux 如何在安装脚本中使chgrp命令成为可选命令?,linux,sh,file-permissions,autoconf,chgrp,Linux,Sh,File Permissions,Autoconf,Chgrp,我正在为Linux游戏创建一个安装脚本。作为安装的一部分,我将游戏可执行文件的suid权限更改为“games”组,这样游戏即使由普通用户运行也可以更新highscore文件 现在,我的Makefile.am如下所示: AUTOMAKE_OPTIONS = foreign SUBDIRS = src man install-exec-hook: chgrp games @bindir@/xjump chmod +s @bindir@/xjump mkdir -p

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

现在,我的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权限的情况下运行并跳过权限更改?或者我应该在配置脚本中添加配置标志,而不是尝试自动修复此权限问题?

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

chgrp games @localstatedir@/xjump/record 2>/dev/null || true
如果您运行“whoami”,您将能够找出当前用户是谁

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

是的,chgrp需要根权限。否则,您可以通过“给”组或用户一堆文件并超过其磁盘配额,对其进行DoS攻击。只有root用户才能以任意方式泄露文件。或者愚蠢的系统黑客,比如创建一个你自己的suid二进制文件,chown/chgrp将其发送到root/wheel,然后完全破坏系统。我的问题是,如果我为单个用户安装,那么chgrp就不需要了。因此,在这种情况下,我想知道安装脚本是否不像现在那样需要root。如果它只针对单个用户,为什么要更改组?将score文件放入用户的homedir中,作为用户拥有/分组。它并不总是针对单个用户。我想要全局或本地安装的选项。这很有效!但是有一个疑问是,如果没有一种更细致的方法来解决这个问题,而不接受chgrop可能抛出的任何其他错误。您可以使用类似于
[“$(id-u)”=“0”]
的方法,但是您引入了更多的控制语句。生成文件不是外壳脚本。