软件开发人员指南Linux(管理器命令脚本您的软件)「linux软件管理工具」

当您在不同的 Linux 或 Unix 环境中工作时,您将需要添加或删除软件
这通常通过包管理器来完成,尽管偶尔在紧急情况下您可能需要使用其他方法
您可能熟悉在编程环境中管理库的工具——npm、gem、pip、go get、maven、gradle 等
这些包管理器的运作原理与在 Linux 和 Unix 中找到的相同
软件包管理器抽象了构成软件的许多配置和二进制文件,并允许您使用一个单一的、整洁的“包”来代替
如果您来自 Windows(.exe 或 .msi 安装程序)或 macOS(.dmg 安装程序),这应该会让您感到熟悉
此外,大多数 Linux 包管理器通过以下方式为该过程添加了一层安全性:使用安全传输(TLS)进行下载
对包本身进行加密签名,以证明作者至少是他们所说的人(无论您是否隐含地信任他们)
不同的 Linux 发行版还率先提出了可搜索的包仓库的想法,帮助用户找到要下载的软件,这启发了今天存在的 Apple 和 Microsoft “应用商店”
在本章中,我们将涵盖以下内容:包管理器是什么
您将看到的最常见的包管理器
最重要的包管理操作以及执行它们的各个命令,“翻译”成跨包管理器的命令——这是您在实践中需要知道的 90%
下载和执行自定义安装脚本的流行程序
快速实践介绍本地构建和安装软件
如果您正在寻找有关在 Docker 中安装软件的说明,请查看第 15 章,“使用 Docker 容器化应用程序”
首先:作为一名开发者,当您想要执行一些常见操作时,您将使用包管理命令:安装新的软件包,例如,您的应用程序期望在其执行环境中可用的依赖项
检查已安装的包(例如,“nginx Web 服务器是否已经安装在这个系统上?”)
更新当前安装的包集,以确保您拥有所有软件的最新版本
这通常用于解决已发现的漏洞,或确保您拥有软件的最新功能
删除一个包——即从系统中卸载它
让我们深入了解如何实现这些实际目标,并查看您将使用的实际命令
使用软件包 在我们深入实际命令之前,您应该知道您将使用的确切命令将根据您使用的 Unix(或 Linux 发行版)的不同而有所不同
不同的 Linux 发行版使用不同的包管理器,尽管它们的语法足够不同,可能会让人感到烦恼,但它们的工作方式几乎相同
常见的包管理器包括:homebrew(macOS)apt(在 Ubuntu 和基于 Debian 的系统上可靠地找到,甚至是没有安装 aptitude 的最小系统)pacman(Arch)apk(Alpine)在接下来的实践部分中,我们将介绍我们想要实现的高级目标(例如“安装特定包”),然后展示使用我们刚刚命名的流行包管理器完成该任务的确切命令
更新本地仓库缓存 在安装或删除包之前,您需要确保您的本地包缓存(系统在互联网上可用包的记录)是最新的
例如,如果您试图安装 nginx Web 服务器,但上次更新本地包缓存是一个月前,您可能无意中安装了上个月的旧版本,而不是本周发布的新版本
要更新缓存,请在下面的列表中找到您的包管理器,并运行相应的命令:包管理器命令homebrewbrew updateaptapt updatepacmanpacman -Syapkapk update您的可用包的本地缓存将被更新,然后您可以继续进行寻找和安装包的激动人心的工作
搜索包 并非所有包的名称都与它们包含的软件相同
Firefox 可能在 firefox 包中可用,但如果您尝试安装 ag(包名称:silversearcher-ag),您可能会感到失望
使用以下包管理器命令搜索您正在考虑安装的包的描述:包管理器命令homebrewbrew search $PACKAGENAMEaptapt-cache search $PACKAGENAMEpacmanpacman -Ss $PACKAGENAMEapkapk search $PACKAGENAME这是确认您获得预期内容的好方法,但它也可以用来扩大您的搜索范围,寻找与您的问题相关的通用软件
例如,在 Ubuntu 上,我可以使用 apt-cache search grep 搜索类似 grep 的工具
任何包含 grep 在名称或描述中的包都将被显示
安装包 终于,最重要的环节来了
现在我们的仓库缓存是最新的,我们确切知道要安装哪个包,让我们运行安装命令:包管理器命令homebrewbrew install $PACKAGENAMEaptapt install $PACKAGENAMEpacmanpacman -Sy $PACKAGENAMEapkapk add $PACKAGENAME如果您的包管理器提示您确认安装,请对提示做出响应,您的包将被安装(以及它所依赖的任何其他包)
由于这些命令中的一些在安装包之前会提示确认,这些可能会阻止脚本运行
当您在脚本中自动化任务并且需要安装包时,请确保阅读适当的包管理器手册页,了解如何在非交互方式下安装包
这通常通过环境变量或命令的额外参数来完成
升级所有有可用更新的包 在长期运行的系统上,您将希望偶尔将已安装的包升级到最新版本
这可以修复已知的漏洞,获取最新功能,并防止不同系统的状态因在其他系统之前或之后几个月配置而产生漂移:包管理器命令homebrewbrew upgradeaptapt dist-upgradepacmanpacman -Syuapkapk upgrade这些命令也会提示确认,所以如果您在脚本中使用它们,相同的建议是添加一个选项使它们非交互式
例如,apt –y dist-upgrade 将不会等待手动确认,并将直接执行升级
移除包(以及任何依赖项,前提是其他包不需要它们) 有时您可能想要卸载一个包:也许您只是试用它,或者您的应用程序需求已经改变,或者它已知存在漏洞而没有修复方案
所有包管理器都有一个命令用于移除已安装的包:包管理器命令homebrewbrew remove $PACKAGENAMEaptapt remove $PACKAGENAMEpacmanpacman -Rs $PACKAGENAMEapkapk del $PACKAGENAME在移除包之前或之后,您可能需要做的一件事是验证包是否已安装
让我们看看如何做到这一点
查询已安装的包 如果您需要列出当前在系统上安装的所有包,您可以用一个命令来完成:包管理器命令homebrewbrew listaptdpkg –lpacmanpacman -Qiapkapk info因为这个列表通常有数百或数千个包,所以有点笨重
可以通过将其输出通过管道传输到搜索命令如 grep,来缩小输出范围,找到您要找的内容: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系统,无论是在开发环境还是生产环境中
软件开发人员指南Linux(管理器命令脚本您的软件)
(图片来源网络,侵删)

联系我们

在线咨询:点击这里给我发消息