我想将软件从源代码(例如第三方 GitHub 存储库)安装到我的计算机上。通常 /usr/local/bin 和 /usr/local/src 用于非特定于发行版的软件,对吧?
获得 /usr/local 的所有权似乎有风险:以我的权限运行的任何内容都可能对 /usr/local/bin 中的可执行文件或 /usr/local/src 中的源代码进行恶意更改。
但另一种选择,即以 root ( sudo
) 身份构建和安装,对我来说没有意义。GitHub 警告不要git
以 root 身份运行。即使我从其他地方的本地存储库复制了源代码,我也必须运行make
and make install
as sudo
,这意味着我正在安装的软件可能会劫持我的计算机的其余部分。
我可以把所有东西都放在 /home 中,但这似乎是一种逃避——这不是 /usr/local 吗为了?
答案1
不要拥有/usr/local
.用于sudo
安装软件。但请使用您自己的帐户建造它。
git clone … # or tar -x or …
cd …
./configure
make
sudo make install
为什么不拥有所有权/usr/local
?你成功了。这将允许您帐户上运行的任何程序都可以在那里写入。对抗恶意程序,无论如何你都输了——感染本地帐户是重要的一步,升级到 root 并不困难(例如,通过在下次运行时搭载sudo
)。但对于配置错误的程序,最好不要在系统范围的目录中包含可写位。
至于/usr/local
您的主目录之间的选择:您的主目录用于存放您只想用于您的帐户的东西,/usr/local
用于存放系统范围内安装的东西。
答案2
方法
此解决方案有两种方法。
/usr/local/{src,bin}
用于由系统管理员安装的定制软件,即 ,root
在这种情况下应始终使用sudo
或,使这个问题成为一个没有实际意义的问题。su -
- 安装预编译的二进制更新,即在您的发行版包管理机制中找到的更新,但
/opt
.同样在这种情况下,由系统管理员完成。
推理
在这两种情况下,您的发行版上游都不支持安装在这些位置的软件,因此需要 root 权限才能覆盖潜在的危险操作。另外,/usr/local/src
不是编译源代码的地方。这是存储源的地方。记住这两项可以确保诸如在 CentOS 7 上使用 Awesome 窗口管理器不要发生。
不要混淆
如果您只想更新已安装的软件,则应通过向发行版添加测试软件的首选方法来完成此操作。一些主要方法:
答案3
大多数构建系统都遵循默认值--prefix=$path
。/usr/local
所以通常你构建+测试+安装,其中构建+测试步骤可以发生在你有写权限的任何地方+安装步骤通常是......
sudo make install(安装到--prefix
)
设置构建环境的一种方法是拥有一个包含 work + attic 子目录的构建目录。
我的构建环境是...
/smartbuild/work
- 包的构建位置(来自 tarball 或 git/svn/etc)
/smartbuild/attic
- tarball 缓存的位置(因此重建会跳过 tarball 下载)