现在我们的仓库缓存是最新的,我们确切知道要安装哪个包,让我们运行安装命令:
dpkg -l | grep silversearcher
如果您对我们如何使用管道将 dpkg 的输出输入到 grep 命令感到困惑,请参见第 1 章“命令行如何工作”,了解使用管道字符(|)链接命令的基础知识我们还将在第 11 章“管道和重定向”中更深入地了解这种机制现在我们已经介绍了您大部分时间将使用的 90% 的基本包管理命令,是时候展示一些模式,当没有预先构建的软件包可用时,您将使用它们谨慎使用 curl | bash 有时您找不到您需要的软件的预构建包这没关系许多在线资源——甚至是值得信赖和流行的资源,如 macOS 上的 homebrew——推荐一个命令行安装过程,看起来像这样:
curl $SOMEURL | bash
这使用 curl 命令从网络下载内容,然后使用该内容作为运行 Bash 的输入(|,管道字符,我们在第 1 章“命令行如何工作”中介绍过)当您这样做时,您基本上是在运行网络上的脚本,而不是本地文件这可能是安装软件的非常方便的方式,但请绝对确保它来自可信的来源我们建议始终至少查看脚本源代码,您可以通过访问命令中的脚本 URL(在下面的例子中表示为 )来在浏览器中查看,或者通过将单个SOMEURL)来在浏览器中查看,或者通过将单个curlURL | bash 命令拆分成多个命令,以便您可以:下载脚本在本地文本编辑器中阅读它,以验证它没有执行任何恶意行为,并根据需要编辑脚本以适应您的要求现在运行脚本,因为您已经验证了它只执行您想要它执行的操作要将类似 curl $URL | bash 这样的模式拆分成多个命令,您将采取以下步骤:下载安装程序并命名为 installer.sh:curl $SOMEURL -o installer.sh使用文本编辑器(如 vim)阅读并根据需要修改脚本:vim installer.sh使脚本可执行并运行它:chmod +x installer.sh ./installer.sh通过将此拆分为多个步骤,而不是立即下载并运行不受信任的脚本,我们给自己时间审查我们即将执行的代码,并验证它是否安全最终结果相同(安装脚本运行),但这种方法为我们提供了更多的控制,并减少了盲目信任还有另一种在系统上安装软件的方法,即使没有预先编写的安装脚本可用从源代码编译第三方软件 这是在系统上安装软件的最手动和最传统的的方法——手动编译和安装它没有包管理器的许多优点,如速度、可重复性、易于管理已安装的软件,以及对您正在安装的软件二进制文件的加密验证但在紧急情况下,这仍然是最可靠的安装方式,除了基本的软件工具(编译器、链接器和 make 脚本)之外,没有真正的外部依赖项,这些都是作为开发者已经熟悉的当以下情况发生时,您将发现自己手动编译和安装软件:您手头的包管理器中没有软件的预打包版本例如,如果您使用的是最小化的容器发行版(如 Alpine),您可能在包管理器中找不到您需要的东西在这种情况下,您可以从源代码编译自己的二进制文件,并以这种方式将其放入容器镜像中您需要向 Docker 容器添加自己的(或其他自定义的)软件您需要软件的绝对最新版本,尚未存在打包版本这可能是对于不太活跃的项目的情况,这些项目并不总是有新的包可用,或者是在需要立即推出严重漏洞的热修复,而在热修复通过打包过程之前这个过程涉及几个步骤,根据软件的不同有轻微的变化通常,这包括:使用 curl 或 wget 下载压缩的软件存档使用 tar zxf downloadname 或 unzip downloadname 解压缩并解压您刚刚下载的源代码目录切换到您下载的源代码目录并阅读任何包含的 README 文件在这里,您将被告知构建软件所需的确切过程,以及与我们在这里描述的规范的任何偏差运行 ./configure,然后是 make,然后是 sudo make install 来构建和安装二进制文件与手动安装软件或通过包管理器安装软件的其他方式一样,请记住 configure 和 make 按设计执行任意代码这意味着以 root 身份运行 make install 将导致所有这些任意代码以 root 身份运行这应该会让您担忧确保验证软件的源代码是可信的,并且您是从可信的来源下载它编译和安装 htop的示例为了演示这个过程,我们将下载、编译并安装htop,这是一个小型但极其有用的系统监控工具(类似于内置的top命令,但更优越)郑重声明,这在几乎所有Linux发行版的包管理器中都很容易获得,但我们将假设它是一个难以找到的、没有通过包管理器广泛分发的定制程序我们正在操作的系统是Ubuntu 22.04 Linux服务器,所以如果你想在没有自己进行故障排除的情况下跟随操作,请使用该系统首先,我们从官方GitHub仓库检查最新版本:https://github.com/htop-dev/htop/releases ——截至目前,这是3.2.2版本现在,您将想要为此构建创建一个目录,只是为了保持整洁——我建议在/tmp目录中创建,该目录保存临时文件,并在系统每次启动时删除其内容:
mkdir /tmp/htopbuild && cd /tmp/htopbuild
这样,一旦构建完成,我们可以删除所有内容,以防止我们的系统充满旧构建的垃圾文件现在我们准备好开始了安装先决条件首先,我们需要安装基本的C开发工具链(编译器、链接器、make和其他工具——在Linux上编译C代码所需的所有工具)在Ubuntu上,这是通过安装一个元包——一个作为多个其他包别名的包——来完成的,称为build-essential:sudo apt install build-essential
我们还将安装一些我们将使用的工具:wget用于从网络下载文件,以及htop用于响应式命令行界面的ncurses开发库:sudo apt install wget libncurses-dev
下载、验证并解压缩源代码首先,我们将下载源代码并验证其加密签名,以确保它是用开发者的密钥签名的真实发布:wget https://github.com/htop-dev/htop/releases/download/3.2.2/htop-3.2.2.tar.xz
这将为我们提供压缩的、归档的源代码目录,我们将将其编译成二进制文件现在,让我们通过检查预期的哈希值来确保我们拥有开发者认可的发布版本,并打印到终端:wget https://github.com/htop-dev/htop/releases/download/3.2.2/htop-3.2.2.tar.xz.sha256cat htop-3.2.2.tar.xz.sha256
假设您正在使用本示例中的相同版本,您将看到此哈希值:bac9e9ab7198256b8802d2e3b327a54804dc2a19b77a5f103645b11c12473dc8 htop-3.2.2.tar.xz
现在使用sha256sum工具对下载的源代码进行哈希计算,以验证哈希值是否匹配:sha256sum htop-3.2.2.tar.xz
太好了我们现在知道我们拥有的软件与我们打算下载的官方发布版本相同让我们解压缩源代码目录并进入其中:
tar xf htop-3.2.2.tar.xzcd htop-3.2.2
如果您感兴趣,现在可以阅读Readme文件(关于程序的一般信息)和INSTALL文件(如何构建和安装程序的说明)现在我们准备开始配置和编译这个软件配置和编译 htop在源代码目录中,是时候运行./configure脚本了此脚本确保我们已安装了编译所需的任何依赖项(共享库、工具等),并为我们即将执行的编译配置事项:
./configure
当脚本运行时,将产生输出,检查各种依赖项,并确保您的环境看起来拥有编译所需的一切如果此脚本产生错误,请仔细阅读它们:通常,它将清楚地告诉您出了什么问题——缺少库或有问题的操作系统设置在解决它提醒您的任何问题后,重新运行它当它成功运行完成时,您就可以编译htop二进制文件了:make
这将在编译脚本运行时再次产生大量输出如果您对makefiles还完全不熟悉,它们是由开发者广泛使用的极有用的自动化工具这是一个优秀的教程:Makefile Tutorial一旦编译完成,我们可以安装我们刚刚创建的htop二进制文件(它将在名为htop的主源代码目录中)通常,有一种自动化的方法可以做到这一点:sudo make install
需要sudo,因为您正在将编译的二进制文件移动到受保护的(root拥有的)位置之后,您可以通过输入以下命令来验证htop是否已安装并正常工作:htop
您应该会看到一个漂亮的基于终端的GUI(感谢ncurses库),显示您系统的当前CPU负载、内存利用率和进程列表对于没有完整功能安装命令的程序,您可以依赖于Linux中没有魔法的事实,只需将二进制文件移动到/usr/local/bin/目录中,那里是本地编译的二进制文件所属的位置:mv htop /usr/local/bin/
看到这个过程可以如此简单,您现在拥有所有必要的知识,可以继续前进并编译结论在本章中,您学习了管理Linux环境中安装的软件的基础知识首先,我们看了一种简单的方法:通过您最有可能遇到的包管理器进行软件管理尽管这种方法应该可以满足您90%的需求,然后您学习了您将需要应用到最后10%情况的程序——仔细审查,然后使用自定义安装脚本或手动编译和安装希望您跟随了这个实际的编译示例,并尝试了htop系统监视器值得庆幸的是,htop在各地的包管理器中都可用——这是一个非常有用的工具,许多系统管理员在长期运行的生产系统上发现它非常宝贵您现在应该对您需要了解的高级概念和实用命令感到舒适,以便有效地使用许多Unix和Linux系统,无论是在开发环境还是生产环境中
(图片来源网络,侵删)
0 评论