第四周
处理文本的工具 sed
Stream EDitor, 行编辑器
sed 是一种流编辑器, 它一次处理一行内容. 处理时, 把当前处理的行存储在临时 缓冲区中, 称为 "模式空间"(pattern space), 接着用 sed 命令处理缓冲区中的 内容, 处理完成后, 把缓冲区的内容送往屏幕. 然后读入下行, 执行下一个循环. 如果没有使诸如'D'的特殊命令, 那会在两个循环之间清空模式空间, 但不会清 空保留空间. 这样不断重复, 直到文件末尾. 文件内容并没有改变, 除非你使用重 定向存储输出.
功能: 主要用来自动编辑一个或多个文件, 简化对文件的反复操作, 编写转换程序等
参考: http://www.gnu.org/software/sed/manual/sed.html
sed [option]... 'script' inputfile...
常用选项:
-n 不输出模式空间内容到屏幕, 即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i.bak 备份文件并原处编辑
script: '地址命令'
地址定界:
(1) 不给地址: 对全文进行处理
(2) 单地址:
?? #: 指定的行,$: 最后一行
?? /pattern/: 被此处模式所能够匹配到的每一行
(3) 地址范围:
- ????#,#
- ????#,+#
- ????/pat1/,/pat2/
- ????#,/pat1/
(4) ~: 步进
?? 1~2 奇数行
?? 2~2 偶数行
编辑命令:
d 删除模式空间匹配的行, 并立即启用下一轮循环
p 打印当前模式空间内容, 追加到默认输出之后
a []text 在指定行后面追加文本, 支持使用 \ n 实现多行追加
i []text 在行前面插入文本
c []text 替换行为单行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s/// 查找替换, 支持使用其它分隔符,[email protected]@@,s###
替换标记:
????g 行内全局替换
????p 显示替换成功的行
????w /PATH/FILE 将替换成功的行保存至文件中
高级编辑命令:
P: 打印模式空间开端至 \ n 内容, 并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H: 把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G: 从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N: 读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D: 如果模式空间包含换行符, 则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行, 而使用合成的模式空间重新启动循环. 如果模式空间 不包含换行符, 则会像发出 d 命令那样启动正常的新循环
软件包管理
包和包管理器
最初只提供了. tar.gz 的打包的源码文件, 用户必须自已编译每个想在 GNU/Linux 上运行的软件. 用户急需系统能提供一种更加便利的方法来 管理这些软件, 当 Debian 诞生时, 这样一个管理工具也就应运而生, 它 被命名为 dpkg. 从而著名的 "package" 概念第一次出现在 GNU/Linux 系统中, 稍后 Red Hat 才开发自己的 "rpm" 包管理系统
包的组成: 二进制文件, 库文件, 配置文件, 帮助文件
程序包管理器:
debian: deb 文件, dpkg 包管理器
RedHat: rpm 文件, rpm 包管理器
- rpm:RedHat Package Manager
- ???RPM Package Manager
包命名
源代码: name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release
rpm 包命名方式:
name-VERSION-release.arch.rpm
例: bash-4.2.46-19.el7.x86_64.rpm
VERSION: major.minor.release release:release.OS
常见的 arch: x86: i386, i486, i586, i686 x86_64: x64, x86_64, amd64 powerpc: ppc
跟平台无关: noarch
包命名和工具
包: 分类和拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 开发子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
包之间: 可能存在依赖关系, 甚至循环依赖
解决依赖包管理工具
yum:rpm 包管理器的前端工具
apt:deb 包管理器前端工具
zypper:suse 上的 rpm 前端管理工具
dnf:Fedora 18+ rpm 包管理器前端管理工具
库文件
查看二进制程序所依赖的库文件
ldd /PATH/TO/BINARY_FILE
管理及查看本机装载的库文件
ldconfig 加载配置文件中指定的库文件
/sbin/ldconfig -p 显示本机已经缓存的所有可用库文件名及文件路径 映射关系
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
缓存文件:/etc/ld.so.cache
程序包的来源
管理程序包的方式:
?????? 使用包管理器: rpm
?????? 使用前端工具: yum, dnf
获取程序包的途径
(1) 系统发版的光盘或官方的服务器
CentOS 镜像:
- https://www.centos.org/download/
- http://mirrors.aliyun.com/
- http://mirrors.sohu.com/
- http://mirrors.163.com/
(2) 项目官方站点
(3) 第三方组织:
- Fedora-EPEL:
- Extra Packages for Enterprise Linux
Rpmforge:RHEL 推荐, 包很全
搜索引擎:
- http://pkgs.org/
- http://rpmfind.net/
- http://rpm.pbone.net/
- https://sourceforge.net/
(4) 自己制作
注意: 第三方包建议要检查其合法性 来源合法性, 程序包的完整性
rpm 包管理
CentOS 系统上使用 rpm 命令管理程序包:
安装, 卸载, 升级, 查询, 校验, 数据库维护
安装: rpm {-i|--install} [install-options] PACKAGE_FILE...
-v: verbose
-vv:
-h: 以 #显示程序包管理执行进度
rpm -ivh PACKAGE_FILE ...
rpm 包安装
[install-options]
--test: 测试安装, 但不真正执行安装, 即 dry run 模式
--nodeps: 忽略依赖关系
--replacepkgs | replacefiles
--nosignature: 不检查来源合法性
--nodigest: 不检查包完整性
--noscripts: 不执行程序包脚本
??????%pre: 安装前脚本 --nopre
??????%post: 安装后脚本 --nopost
??????%preun: 卸载前脚本 --nopreun
??????%postun: 卸载后脚本 --nopostun
rpm 包升级
升级:
- rpm {
- -U|--upgrade
- } [install-options] PACKAGE_FILE...
- rpm {
- -F|--freshen
- } [install-options] PACKAGE_FILE...
???upgrade: 安装有旧版程序包, 则 "升级"
?????? 如果不存在旧版程序包, 则 "安装"
???freshen: 安装有旧版程序包, 则 "升级"
?????? 如果不存在旧版程序包, 则不执行升级操作
- rpm -Uvh PACKAGE_FILE ...
- rpm -Fvh PACKAGE_FILE ...
--oldpackage: 降级
--force: 强制安装
注意:
(1) 不要对内核做升级操作; Linux 支持多内核版本并存, 因此直接安装新版本内核
(2) 如果原程序包的配置文件安装后曾被修改, 升级时, 新版本提供的同一个配置文 件不会直接覆盖老版本的配置文件, 而把新版本文件重命名 (FILENAME.rpmnew) 后 保留
包查询
- rpm {
- -q|--query
- } [select-options] [query-options]
- [select-options]
-a: 所有包
-f: 查看指定的文件由哪个程序包安装生成
-p rpmfile: 针对尚未安装的程序包文件做查询操作
--whatprovides CAPABILITY: 查询指定的 CAPABILITY 由哪个包所提供
--whatrequires CAPABILITY: 查询指定的 CAPABILITY 被哪个包所依赖
rpm2cpio 包文件 | cpio -itv 预览包内文件
rpm2cpio 包文件 | cpio -id "*.conf" 释放包内文件
[query-options]
--changelog: 查询 rpm 包的 changelog
-c: 查询程序的配置文件
-d: 查询程序的文档
-i:information
-l: 查看指定的程序包安装后生成的所有文件
--scripts: 程序包自带的脚本
--provides: 列出指定程序包所提供的 CAPABILITY
-R: 查询指定的程序包所依赖的 CAPABILITY
常用查询用法
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
-qa
包卸载
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
当包卸载时, 对应的配置文件不会删除, 以 FILENAME.rpmsave 形式保留
包校验
- rpm {
- -V|--verify
- } [select-options] [verify-options]
- S file Size differs
- M Mode differs (includes permissions and file type)
- 5 digest (formerly MD5 sum) differs
- D Device major/minor number mismatch
- L readLink(2) path mismatch
- U User ownership differs
- G Group ownership differs
- T mTime differs
- P capabilities differ
包来源的合法性验证及完整性验证
完整性验证: SHA256
来源合法性验证: RSA
公钥加密
对称加密: 加密, 解密使用同一密钥
非对称加密: 密钥是成对儿的
public key: 公钥, 公开所有人
secret key: 私钥, 不能公开
导入所需要公钥
rpm -K|checksig rpmfile 检查包的完整性和签名
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7 发行版光盘提供: RPM-GPG-KEY-CentOS-7
rpm -qa "gpg-pubkey*"
rpm 数据库
数据库重建: /var/lib/rpm
rpm {--initdb|--rebuilddb}
initdb: 初始化
如果事先不存在数据库, 则新建之
否则, 不执行任何操作
rebuilddb: 重建已安装的包头的数据库索引目录
yum 源
阿里云 repo 文件 http://mirrors.aliyun.com/repo/
CentOS 系统的 yum 源 ? 阿里云:
清华大学:
EPEL 的 yum 源
阿里云: https://mirrors.aliyun.com/epel/$releasever/x86_64
阿里巴巴开源软件 https://opsx.alibaba.com/
yum-config-manager
生成 172.16.0.1_cobbler_ks_mirror_CentOS-X-x8664.repo yum-config-manager --add-repo= http://172.16.0.1/cobbler/ks_mirror/7/
yum-config-manager --disable "仓库名" 禁用仓库
yum-config-manager --enable "仓库名" 启用仓库
yum 命令
yum 命令的用法:
yum [options] [command] [package ...]
显示仓库列表: yum repolist [all|enabled|disabled]
显示程序包: yum list yum list [all | glob_exp1] [glob_exp2] [...] yum list {available|installed|updates} [glob_exp1] [...]
安装程序包: yum install package1 [package2] [...] yum reinstall package1 [package2] [...] (重新安装)
升级程序包: yum update [package1] [package2] [...] yum downgrade package1 [package2] [...] (降级)
检查可用升级: yum check-update
卸载程序包: yum remove | erase package1 [package2] [...]
查看程序包 information:
yum info [...]
查看指定的特性 (可以是某文件) 是由哪个程序包所提供: yum provides | whatprovides feature1 [feature2] [...]
清理本地缓存:
清除 / var/cache/yum/$basearch/$releasever 缓存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
构建缓存: yum makecache
搜索: yum search string1 [string2] [...]
以指定的关键字搜索程序包名及 summary 信息
查看指定包所依赖的 capabilities:
yum deplist package1 [package2] [...]
查看 yum 事务历史:
- yum history [info|list|packages-list|packages-info|
- summary|addon-info|redo|undo|
- rollback|new|sync|stats]
- yum history
- yum history info 6
- yum history undo 6
日志 :/var/log/yum.log
安装及升级本地程序包
- yum localinstall rpmfile1 [rpmfile2] [...]
- (用 install 替代)
- yum localupdate rpmfile1 [rpmfile2] [...]
- (用 update 替代)
包组管理的相关命令
- yum groupinstall group1 [group2] [...]
- yum groupupdate group1 [group2] [...]
- yum grouplist [hidden] [groupwildcard] [...]
- yum groupremove group1 [group2] [...]
- yum groupinfo group1 [...]
yum 的命令行选项:
--nogpgcheck: 禁止进行 gpg check
-y: 自动回答为 "yes"
-q: 静默模式
--disablerepo=repoidglob: 临时禁用此处指定的 repo --enablerepo=repoidglob: 临时启用此处指定的 repo
--noplugins: 禁用所有插件
系统安装光盘作为本地 yum 仓库:
(1) 挂载光盘至某目录, 例如 / mnt/cdrom
*<<开起 autofs 服务 systemctl start autofs
开机启动 autofs 服务 systemctl enable autofs
开启 autofs 服务后根目录下出现 misc 目录, cd /misc/cd cd 目录会自动挂载光盘. 从而可以将 / misc/cd 目录作为 yum 仓库>>
关闭 Linux 防火墙 systemctl
mount /dev/cdrom /mnt/cdrom
(2) 创建配置文件
- [CentOS7]
- name=
- baseurl=
- gpgcheck=
- enabled=
创建 yum 仓库:
- createrepo [options] <directory>
- DNF
DNF 介绍: 新一代的 RPM 软件包管理器. DNF 发行日期是 2015 年 5 月 11 日, DNF 包管 理器采用 Python 编写, 发行许可为 GPL v2, 首先出现在 Fedora 18 发行版中. 在 RHEL 8.0 版本正式取代了 YUM,DNF 包管理器克服了 YUM 包管理器的一些瓶颈, 提升 了包括用户体验, 内存占用, 依赖分析, 运行速度等
安装所需软件包, 依赖 epel 源
- wget
- wget
- wget
- yum install python-dnf-0.6.4-2.sdl7.noarch.rpm dnf-0.6.4-2.sdl7.noarch.rpm dnf-conf-0.6.42.sdl7.noarch.rpm python2-libcomps-0.1.8-3.el7.x86_64.rpm libcomps-0.1.83.el7.x86_64.rpm
配置文件:/etc/dnf/dnf.conf
仓库文件:/etc/yum.repos.d/*.repo
日志: /var/log/dnf.rpm.log
*<<将上述 rpm 包制作成 yum 仓库, baseurl = 仓库文件地址>>
DNF 使用
dnf 用法: 与 yum 一致
- dnf [options] <command> [<arguments>...]
- dnf --version dnf repolist
- dnf install httpd
- dnf remove httpd
- dnf clean all
- dnf makecache
- dnf list installed
- dnf list available
- dnf search nano
- dnf history undo 1
来源: http://www.bubuko.com/infodetail-3147606.html