如何避免在从源安装应用程序的最后一步中以 root 身份运行 make?

如何避免在从源安装应用程序的最后一步中以 root 身份运行 make?

我总是不愿意make install以 root 身份运行作为从源安装应用程序的最后一步。毕竟,它允许执行 Makefile 中的任意代码。我已经遇到过这样的情况:由于缺乏正确的引用,Makefile 命令删除了不应该删除的内容,包括源代码目录之外的文件。

因此,我正在寻找一种方法来避免make install以 root 身份运行,并将我作为 root 的活动限制为不执行任意代码的基本操作(例如复制文件或提取存档)。

答案1

经过一番搜索,我发现大多数源包(至少是使用 autotools 或 cmake 的源包)允许安装到与用于编译的 PREFIX 不同的目录,您只需在 DESTDIR 环境变量中指定所需的位置即可。

我最终做了以下事情:

firejail --x11=none --net=none --whitelist="$PWD" # Enter sandbox
./configure # (or similar)
make
DESTDIR=dest make install # install application into dest
exit # from firejail

pkgname="$(basename "$PWD")" # (or specify desired package name manually)
fakeroot tar czf "$pkgname.tgz" -C dest . # pack the installed files into a .tgz archive
fakeroot alien --version=$(date +%F) -k "$pkgname.tgz" # create a .deb package from the .tgz archive

还可以在最后一个命令中使用sudo alien -i而不是fakeroot alien立即安装该软件包。或者,如果您不想将应用程序转换为包,则可以将最后一行(调用alien)替换为sudo tar xzf "$pkgname.tgz" -C /以根身份提取包。

这里有几点需要注意:

  • 编译和安装不是简单地避免以 root 身份运行可能有害的命令,而是在沙箱内进行,这更安全(但完全可选)。
  • 我放弃checkinstall并使用alien它,这是一个稍微干净和安全的解决方案,因为它不依赖于丑陋和不可靠的黑客来观察和逆转文件操作。

相关内容