Linux 要求用户从根模式运行makefile

Linux 要求用户从根模式运行makefile,linux,bash,shell,makefile,Linux,Bash,Shell,Makefile,我在我的项目中有一个makefile和配置shell。我编写的代码要求用户使用以下代码在根模式下运行configureshell [ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@" 但是当我运行“makeinstall”时 我需要要求用户从根模式运行。 因此,我只是从configure shell复制了代码,并将其复制到另一个名为“runasroot.sh”的shell脚本文件中。然后我从makeinstall运行这个shel

我在我的项目中有一个makefile和配置shell。我编写的代码要求用户使用以下代码在根模式下运行configureshell

[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"
但是当我运行“
makeinstall
”时 我需要要求用户从根模式运行。 因此,我只是从configure shell复制了代码,并将其复制到另一个名为“
runasroot.sh
”的shell脚本文件中。然后我从
makeinstall
运行这个shell脚本

install:
    @echo About to install XXX Project
    ./runasroot.sh
    find . -name "*.cgi" -exec cp {}  $(SCRIPTDEST)/ \;
当我运行上面的代码时,我得到了下面的错误

About to install XXX Project
./runasroot.sh \;
make: *** [install] Error 1
runasroot.sh

#!/bin/bash
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

这里有几个错误

第一个问题是你想做什么。在构建过程中要求根目录是非常糟糕的。对于构建部分,尝试不需要root来编译任何内容。如果需要创建特殊文件作为打包的一部分,请使用
fakeroot
fakeroot ng
以获得相同的效果,而无需任何实际的权限提升

对于安装,只要让用户以root用户身份运行整个make文件,如果她选择这样做的话。许多通常需要root的操作有时不需要。例如,如果安装到用户有权限的
DESTDIR
,则
make install
不需要root用户

但是,如果你死心塌地地想这么做,那么你的流程就完全错了。虽然
runasroot.sh
确实执行了您希望它执行的操作,但它只为自己执行。当你看你的收据时:

install:
    @echo About to install XXX Project
    ./runasroot.sh # <<-- this line runs as root
    find . -name "*.cgi" -exec cp {}  $(SCRIPTDEST)/ \;
安装:
@echo即将安装XXX项目

/runasroot.sh#这里有几个错误

第一个问题是你想做什么。在构建过程中要求根目录是非常糟糕的。对于构建部分,尝试不需要root来编译任何内容。如果需要创建特殊文件作为打包的一部分,请使用
fakeroot
fakeroot ng
以获得相同的效果,而无需任何实际的权限提升

对于安装,只要让用户以root用户身份运行整个make文件,如果她选择这样做的话。许多通常需要root的操作有时不需要。例如,如果安装到用户有权限的
DESTDIR
,则
make install
不需要root用户

但是,如果你死心塌地地想这么做,那么你的流程就完全错了。虽然
runasroot.sh
确实执行了您希望它执行的操作,但它只为自己执行。当你看你的收据时:

install:
    @echo About to install XXX Project
    ./runasroot.sh # <<-- this line runs as root
    find . -name "*.cgi" -exec cp {}  $(SCRIPTDEST)/ \;
安装:
@echo即将安装XXX项目
./runasroot.sh#解释
您可以使用
ifneq
检查用户是否为root用户并回显消息。例如,如果用户确实是
root
用户,则不执行实际操作。由于在类UNIX操作系统上,
root
用户的id通常是
0
,因此我们可以检查用户id是否是
0
(或不是)

提案解决方案 输出 外部资源

解释 您可以使用
ifneq
检查用户是否为root用户并回显消息。例如,如果用户确实是
root
用户,则不执行实际操作。由于在类UNIX操作系统上,
root
用户的id通常是
0
,因此我们可以检查用户id是否是
0
(或不是)

提案解决方案 输出 外部资源


提醒我不要使用您的代码。不要在makefile中强制执行
root
。在自述文件或安装文件中记录用户应以root用户身份运行的
makeinstall
。您不可能需要
root
权限进行编译。如果您甚至不要求
root
进行安装,这是最好的选择-如果用户有权在相关目录中写入,则允许用户以自己的身份安装它。
runasroot.sh
是否只包含上面显示的代码?这看起来不像是可复制的。请参阅创建的说明。您希望每个人都不使用root密码运行,还是在提示时愉快地键入密码?基本上,您只知道如何使用bash shell检查root。不要这样做,检查make文件中的root。它避免了make文件调用shell脚本来检查这一点@Pipo向您展示了如何从下面的make文件中进行检查。提醒我不要使用您的代码。不要在makefile中强制执行
root
。在自述文件或安装文件中记录用户应以root用户身份运行的
makeinstall
。您不可能需要
root
权限进行编译。如果您甚至不要求
root
进行安装,这是最好的选择-如果用户有权在相关目录中写入,则允许用户以自己的身份安装它。
runasroot.sh
是否只包含上面显示的代码?这看起来不像是可复制的。请参阅创建的说明。您希望每个人都不使用root密码运行,还是在提示时愉快地键入密码?基本上,您只知道如何使用bash shell检查root。不要这样做,检查make文件中的root。它避免了make文件调用shell脚本来检查这一点@Pipo向您展示了如何从下面的make文件中进行检查。
install:
ifneq ($(shell id -u), 0)
    @echo "You must be root to perform this action."
else
    @echo "TODO: The action when the user is root here..."
endif
$ make install
You must be root to perform this action.
$ sudo make install
TODO: The action when the user is root here...