Linux程序包管理及sed命令简述

本文详细介绍了Linux中的rpm与yum命令,包括安装、升级、卸载和查询等选项。此外,还讲解了at和crontab命令的使用,以及如何设置周期性任务。最后,简述了sed命令的常用操作,包括删除、追加、插入和替换等。通过实例展示了如何在Linux环境中管理程序包和执行文本编辑操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、简述rpm与yum命令的常见选项,并举例

rpm即RedHat系列发行版的程序包管理工具,即为RPM package Manager。yum是RedHat系列RPM的前端管理工具,其主要是解决程序在安装或卸载过程中RPM包的依赖关系,为其用户更方便快捷的安装程序。

rpm命令

格式:rpm [OPTIONS] PACKAGE.FILE

安装:-i --install

升级:-U --update,-F --freshen

卸载:-e --erase

查询:-q --query

校验:-V --verify

数据库维护:--builddb,--initdb


rpm -i 安装:

安装rpm包-i选项可与-v(显示其详细信息)、-h(输出进度条)合并使用,例如:我们要装个zsh的程序包,需要有zsh的rpm存在,然后进行安装。

rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm 安装其后面所跟的包名必须是全路径,全包名。

[root@localhost ~]# ls
anaconda-ks.cfg  zsh-5.0.2-28.el7.x86_64.rpm
[root@localhost ~]# rpm -qa | grep zsh
[root@localhost ~]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm 
warning: zsh-5.0.2-28.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:zsh-5.0.2-28.el7                 ################################# [100%]
[root@localhost ~]# rpm -qa | grep zsh
zsh-5.0.2-28.el7.x86_64
[root@localhost ~]# 

我的主机上没有zsh这个rpm包,通过rpm -qa 可查询已安装的rpm包是否有zsh这个rpm包,以上相信大家都看得懂。

rpm -v 通用选项 显示安装的详细信息;

rpm -vv 显示安装更详细的过程输出信息;

rpm -h  [hash marks] 安装输出显示进度条,每个#表示2%的进度;

其中,rpm -i 和-v,-h可合并使用,事实上,-vh可合并使用在-i,-e等选项中;

install options:rpm -i 安装rpm包有安装属性选项,如以下属性选项:

--test 测试安装,检查并报告其依赖关系和冲突消息等,用法:rpm -i --test PACKAGE_NAME;

--nodeps 忽略依赖关系,不建议使用,用法:rpm -ivh --nodeps;

--replacepkgs 重新安装,主要应用于配置文件遭改动等,用法:rpm -i --replacepkgs;

另外:rpm包安装文档里自带的有四类脚本文件:

preinstall 安装过程开始之前运行的脚本,表示为%pre;

postinstall 安装过程完成之后运行的脚本,表示为%post;

preuninstall 卸载前执行的脚本,%preun;

postuninsatll 卸载后执行的脚本,%postun;

选项属性:rpm -i --noscripts,--nopre,--nopost,--nopreun,--nopostun;

--nosignature 不检查包签名信息,不检查来源合法性,用法:rpm -i --nosignature;

--nodigest 不检查包完整性,用法:rpm -i --nodigest;


rpm -U 升级(升级安装,-F只有安装了老版本需要升级新版本,使用-F选项)

用法:rpm -Uvh;rpm -Fvh

其也有属性选项:--oldpackage 降级安装;--force 强制升级安装,因为有的升级安装需要解决其依赖关系,故可使用--force来强制安装升级。(这里介绍的都是常有的选项属性,并非全部,如需详细了解可man或查看相关文档,这里没有需要升级安装的rpm,就不做演示了,嘻嘻。)


rpm -e 卸载

用法:rpm -e packagename 包名字,而非文件路径,或包全名即可。

[root@localhost ~]# rpm -qa | grep zsh
zsh-5.0.2-28.el7.x86_64
[root@localhost ~]# rpm -evh zsh
Preparing...                          ################################# [100%]
Cleaning up / removing...
   1:zsh-5.0.2-28.el7                 ################################# [100%]
[root@localhost ~]# rpm -qa | grep zsh
[root@localhost ~]# 

以上我已卸载了之前安装过的zshRPM包,当然,当时安装的时候没有安装,也没有所依赖的rpm包,所有rpm -e 没有什么错误提示,如果你在安装其他的rpm包需要先安装依赖包,那么卸载的时候也需要查看提示信息是否需要先卸载依赖包。(其实这里可以使用yum管理工具卸载更省心,呵呵。)

rpm -e 也有选项属性:比如:

--allmatches 卸载所有匹配指定名称的程序包的各个版本;

--nodeps 忽略依赖关系卸载;

--test 测试卸载,不是真正的卸载,只是测试使用,如dry run(干跑)模式。


rpm -q 查询安装相关信息

用法:rpm -q select options | query options

select options:(选择属性)其后跟的参数为package_name,程序名。

-qa 查询已安装的所有程序包 (此操作刷屏严重,故不演示了,自行查看其内容)

-qf FILE 其后可跟个文件名,查询指定文件是由哪个程序包安装生成的

[root@localhost ~]# rpm -qf /bin/ls
coreutils-8.22-18.el7.x86_64
[root@localhost ~]# rpm -qf /bin/cd
bash-4.2.46-28.el7.x86_64
[root@localhost ~]# rpm -qf /bin/cp
coreutils-8.22-18.el7.x86_64
[root@localhost ~]# rpm -qf /bin/pwd
coreutils-8.22-18.el7.x86_64
[root@localhost ~]# 

以上是查看ls,cd,cp,pwd这些命令,Linux下这些命令也是文件,是由哪个程序包安装生成的。

-qp 用于实现对未安装的程序包执行查询操作,其后有--whatprovides CAPABILITY,未安装的程序包有哪些特性;

[root@localhost ~]# rpm -qa | grep zsh
[root@localhost ~]# rpm -qp zsh-5.0.2-28.el7.x86_64.rpm 
warning: zsh-5.0.2-28.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
zsh-5.0.2-28.el7.x86_64
[root@localhost ~]# rpm -qp zsh-5.0.2-28.el7.x86_64.rpm --whatprovides
rpm: one type of query/verify may be performed at a time
[root@localhost ~]# 

--whatprovides CAPABILITY 查询指定的CAPABILITY由哪个程序包提供;

--whatprovides CAPABILITY 查询指定的CAPABILITY被哪个程序包所依赖;

query options(查询选项)其后跟的参数是程序包的包名

--changelog 查询rpm包的changelog

-ql 程序安装生成的所有文件列表;

-qi 程序包的相关信息,版本号,大小,所属的包组等;

-qc 查询指定的程序提供的配置文件

-qd 查询指定的程序提供的帮助文件

[root@localhost ~]# rpm -ql zsh
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
/usr/lib64/zsh
/usr/lib64/zsh/5.0.2
[root@localhost ~]# rpm -qi zsh
Name        : zsh
Version     : 5.0.2
Release     : 28.el7
Architecture: x86_64
Install Date: Fri 06 Jul 2018 06:48:13 PM CST
Group       : System Environment/Shells
Size        : 5855982
License     : MIT
Signature   : RSA/SHA256, Fri 11 Aug 2017 04:28:17 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : zsh-5.0.2-28.el7.src.rpm
Build Date  : Wed 02 Aug 2017 06:52:37 PM CST
Build Host  : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://zsh.sourceforge.net/
Summary     : Powerful interactive shell
Description :
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor.  Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements.  Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.
[root@localhost ~]# 
[root@localhost ~]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@localhost ~]# rpm -qd zsh
/usr/share/doc/zsh-5.0.2/BUGS
/usr/share/doc/zsh-5.0.2/CONTRIBUTORS
/usr/share/doc/zsh-5.0.2/FAQ
/usr/share/doc/zsh-5.0.2/FEATURES
/usr/share/doc/zsh-5.0.2/LICENCE
/usr/share/doc/zsh-5.0.2/MACHINES
/usr/share/doc/zsh-5.0.2/NEWS
/usr/share/doc/zsh-5.0.2/README
/usr/share/doc/zsh-5.0.2/completion-style-guide
/usr/share/doc/zsh-5.0.2/zsh-development-guide
/usr/share/doc/zsh-5.0.2/zshprompt.pl

--provides 查询指定的程序包提供的所有的CAPABILITY;

-R 查询指定的程序包的依赖关系;

--scripts 查询程序包自带的脚本信息;

[root@localhost ~]# rpm -q --provides zsh
config(zsh) = 5.0.2-28.el7
zsh = 5.0.2-28.el7
zsh(x86-64) = 5.0.2-28.el7
[root@localhost ~]# rpm -qR zsh
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/bin/zsh
/sbin/install-info
/sbin/install-info
config(zsh) = 5.0.2-28.el7
[root@localhost ~]# rpm -q --scripts zsh
postinstall scriptlet (using /bin/sh):
if [ ! -f /etc/shells ] ; then
    echo "/bin/zsh" > /etc/shells
else
    grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells
fi

if [ -f /usr/share/info/zsh.info.gz ]; then
# This is needed so that --excludedocs works.
/sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir \
  --entry="* zsh: (zsh).			An enhanced bourne shell."
fi

:
preuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ] ; then
    if [ -f /usr/share/info/zsh.info.gz ]; then
    # This is needed so that --excludedocs works.
    /sbin/install-info --delete /usr/share/info/zsh.info.gz /usr/share/info/dir \
      --entry="* zsh: (zsh).			An enhanced bourne shell."
    fi
fi
:
postuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ] ; then
    if [ -f /etc/shells ] ; then
        TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX`
        grep -v '^/bin/zsh$' /etc/shells > $TmpFile
        cp -f $TmpFile /etc/shells
        rm -f $TmpFile
    fi
fi
[root@localhost ~]# 

基本用法:(PACKAGE包名,FILE文件路径名,PACKAGE_FILE程序包全文件名)

rpm -qi PACKAGE,-qf FILE,-qc PACKAGE,-ql PACKAGE,-qd PACKAGE;

rpm -qpi PACKAGE_FILE,-qpl,-qpc等。


rpm -V 校验:

rpm -V [select options | verify options]

verify options:包来源合法性验证和完整性验证

来源合法性验证通过数字签名,完整性验证通过获取并导入信任的包制作者的密钥;

对于CentOS发行版来说:

rpm -import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7/6

验证:

1. 安装此组织签名的程序时,会自动执行验证;

2. 手动验证:rpm -K PACKAGE_FILE

[root@localhost ~]# cd /media/cdrom/
[root@localhost cdrom]# ls
CentOS_BuildTag  EFI  EULA  GPL  images  isolinux  LiveOS  Packages  repodata  RPM-GPG-KEY-CentOS-7  RPM-GPG-KEY-CentOS-Testing-7  TRANS.TBL
[root@localhost cdrom]# 

我把系统光盘挂载到/media/cdrom下,在系统盘里就有RPM-GPG-KEY-*的两个文件为数字签名文件。

[root@localhost ~]# rpm -K zsh
error: zsh: open failed: No such file or directory
[root@localhost ~]# rpm -K zsh-5.0.2-28.el7.x86_64.rpm 
zsh-5.0.2-28.el7.x86_64.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#f4a80eb5) 
[root@localhost ~]# rpm -import /etc/p
pam.d/          passwd-         pki/            pm/             popt.d/         ppp/            printcap        profile.d/      python/
passwd          pkcs11/         plymouth/       polkit-1/       postfix/        prelink.conf.d/ profile         protocols       
[root@localhost ~]# rpm -import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-
RPM-GPG-KEY-CentOS-7          RPM-GPG-KEY-CentOS-Debug-7    RPM-GPG-KEY-CentOS-Testing-7  
[root@localhost ~]# rpm -import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@localhost ~]# rpm -K zsh-5.0.2-28.el7.x86_64.rpm 
zsh-5.0.2-28.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
[root@localhost ~]# 

我的系统是CentOS 7,-import导入7的数字签名文件,rpm -K zsh 即显示此包的来源合法性,显示OK。


数据库重建:

rpm数据库的位置路径为:/var/lib/rpm/,查询操作,通过此处的数据库进行;

rpm --initdb | --rebuilddb

--initdb 初始化数据库,当前无任何数据库可初始化创建一个新的,当前有时不执行任何操作;

--rebuilddb 重新构建,通过读取当前系统上所有已经安装过的程序包进行重新构建;

RPMDB(8)                                                         System Manager's Manual                                                         RPMDB(8)

NAME
       rpmdb - RPM Database Tool

SYNOPSIS
       rpm {--initdb|--rebuilddb}

DESCRIPTION
       The general form of an rpm rebuild database command is

       rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]

       Use --initdb to create a new database if one doesn't already exist (existing database is not overwritten), use --rebuilddb to rebuild the database
       indices from the installed package headers.

这里通过man命令查看rpmdb工具的使用方法,请大家可查看实验。


yum命令:

yum命令是RPM包的前端管理工具,可自行解决其程序包安装升级卸载等操作中程序包的依赖关系,故目前比较习惯于用yum执行rpm包的管理操作,但是,使用yum命令的前提是要有rpm程序包,或者是说要有rpm这个命令生成或二进制文件,否则将无法使用yum命令。

语法格式:yum [options] [command] [package ...] yum命令可一次性操作多个rpm包的管理

这里先说yum的command选项有很多种,如下:(这里只说些常用的命令选项)

install package1 [package2] [...] 安装程序包,package为程序包名即可;

update [package1] [package2] [...] 程序包升级,更新,其后可跟程序包名,也可不跟程序包名,如果不加程序包名,即有更新升级的程序包即升级更新,没有的话就不升级更新;这个对比的是yum仓库源里的程序包版本;

remove | erase package1 [package2] [...] 卸载程序包;

list 显示yum仓库里的程序包文件列表;

info 查看指定程序包简要信息

provides | whatprovides feature1 [feature2] [...] 查看指定的特性或者某个文件由哪个程序包提供

makecache 构建缓存;

gruops 包组管理;有些程序包可打包成一个包组名来进行统一管理;

clean [packages|metadata|expire-cache|rpmdb|plugins|all] 清理本地缓存;

search string1 [string2] [...] 搜索指定字符串的相关程序包信息;

localinstall rpmfile1 [rpmfile2] [...] 安装本地程序包;

localupdate rpmfile1 [rpmfile2] [...] 升级更新本地程序包;

reinstall package1 [package2] [...] 重新安装程序包;

downgrade package1 [package2] [...] 降级安装程序包;

deplist package1 [package2] [...] 显示指定程序包的依赖关系;

repolist [all|enable|disable] 显示仓库列表;

repoinfo [all|enable|disable] 显示仓库的详细信息;

version 显示yum的版本相关信息;

history 查看yum事务历史;

check-update 检查可用升级的程序包;

yum包组管理的相关管理命令:

yum groupinstall 包组名

gruopupdate,gruoplist,groupremove,groupinfo等。

常用命令选项即以上这几个,大家可实验查看其使用方法。

options:yum的命令选项(常用选项)

-y  --assumeyes 避免交互式安装,交互回答时,自动回答为“yes”;

-c  --config=[config file] 指明安装时的配置文件安装,可为HTTP,FTP,本地文件路径;

-q  --quiet 静默安装模式 不输出安装信息;

--nogpgcheck 安装时禁止进行gpg检查;

--disablerepo=repoidglob 临时禁用此处指定的repo仓库

--enablerepo=repoidglob 临时启用此处指定的repo仓库

--noplugins 禁用所有的插件安装

[root@localhost ~]# rpm -qa | grep zsh
[root@localhost ~]# 
[root@localhost ~]# yum -y install zsh
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.bit.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirror.bit.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package zsh.x86_64 0:5.0.2-28.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================================================================================================
 Package                           Arch                                 Version                                     Repository                          Size
=============================================================================================================================================================
Installing:
 zsh                               x86_64                               5.0.2-28.el7                                base                               2.4 M

Transaction Summary
=============================================================================================================================================================
Install  1 Package

Total download size: 2.4 M
Installed size: 5.6 M
Downloading packages:
zsh-5.0.2-28.el7.x86_64.rpm                                                                                                           | 2.4 MB  00:00:08     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : zsh-5.0.2-28.el7.x86_64                                                                                                                   1/1 
  Verifying  : zsh-5.0.2-28.el7.x86_64                                                                                                                   1/1 

Installed:
  zsh.x86_64 0:5.0.2-28.el7                                                                                                                                  

Complete!
[root@localhost ~]# 

这里还是以zsh为例,rpm -qa 查找系统中没有安装zsh程序包,yum -y install zsh可安装。

[root@localhost ~]# 
[root@localhost ~]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.bit.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirror.bit.edu.cn
repo id                                                                   repo name                                                                    status
base/7/x86_64                                                             CentOS-7 - Base                                                              9,911
extras/7/x86_64                                                           CentOS-7 - Extras                                                              314
updates/7/x86_64                                                          CentOS-7 - Updates                                                             946
repolist: 11,171
[root@localhost ~]# ls /etc/yum.repos.d/
CentOS-Base.repo  CentOS-CR.repo  CentOS-Debuginfo.repo  CentOS-fasttrack.repo  CentOS-Media.repo  CentOS-Sources.repo  CentOS-Vault.repo
[root@localhost ~]# 

这里查看repo仓库有哪些,已经yum仓库目录下的仓库配置文件。

[root@localhost ~]# yum clean
Loaded plugins: fastestmirror
Error: clean requires an option: headers, packages, metadata, dbcache, plugins, expire-cache, rpmdb, all
[root@localhost ~]# yum clean all
Loaded plugins: fastestmirror
Cleaning repos: base extras updates
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
Cleaning up list of fastest mirrors
[root@localhost ~]# 

清理本地缓存,用法及clean后所跟的参数,大家可自行实验查看其它命令选项。


2、自建yum仓库,分别为网络源和本地源

yum命令实现是C/S架构的,也就说需要有服务器端的镜像文件站点,或者rpm包的源地址为服务器端,用户在本地是yum的客户端操作管理程序包,yum的服务器端是yum的仓库,也有配置文件来定义仓库的指向,而客户端也可自行创建仓库配置文件来指向yum仓库是为本地源还是网络源。

[root@localhost ~]# 
[root@localhost ~]# rpm -qc yum
/etc/logrotate.d/yum
/etc/yum.conf
/etc/yum/version-groups.conf
[root@localhost ~]# cat /etc/yum.conf 
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release


#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
#  It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
[root@localhost ~]# 

/etc/yum.conf此配置文件为所有yum仓库提供公共配置信息,/etc/yum.repos.d/*.repo为仓库的指向提供配置文件。

[root@localhost ~]# ls /etc/yum.repos.d/
CentOS-Base.repo  CentOS-CR.repo  CentOS-Debuginfo.repo  CentOS-fasttrack.repo  CentOS-Media.repo  CentOS-Sources.repo  CentOS-Vault.repo
[root@localhost ~]# cat /etc/yum.repos.d/CentOS-Base.repo 
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates 

这里我给大家查看下了系统当中自动生成的base仓库配置文件,简单介绍下里面参数的意义;

其仓库指向配置文件有多个,给大家找个base基础的配置文件/etc/yum.repos.d/CentOS-Base.repo里面的参数信息:

[base] repository ID 即显示在repolist列表中标明是哪个仓库

name 仓库的名字 可自定义

baseurl 仓库的镜像文件地址 可以是http、ftp、file等形式的URL路径,例如:http://,ftp://,file://;

mirrorlist 即镜像文件列表,可是多个网络镜像站点的列表,也可以是本地路径列表文件;

gpgcheck={0|1}  是否进行gpg检查 (这里的参数赋值为0表示不启用此功能,为1表示启动此功能,例如:gpgcheck=0表示不检查)

gpgkey=URL 指向密钥文件的访问路径

enable={0|1} 表示是否启用此仓库

这里面在baseurl或者mirrorlist后面的URL里有变量信息,可根据当前系统的变量引用到URL里面进行匹配查询仓库源;

$releasever 当前OS的发行版的主版本号;$arch 架构平台;$basearch 基础架构平台。

这里给大家介绍下创建本地源和网络源的yum仓库配置文件;

1. 本地源,一般是指通过系统光盘制作仓库,或者直接指向本地网络的FTP服务器仓库路径;

首先需要挂载光盘文件,可用mount命令查看是否挂载文件,再用mount -r -t iso9660 /dev/cdrom /media/cdrom挂载。

[root@localhost ~]# 
[root@localhost ~]# mount -r -t iso9660 /dev/cdrom /media/cdrom/
[root@localhost ~]# ls /media/cdrom/
CentOS_BuildTag  EFI  EULA  GPL  images  isolinux  LiveOS  Packages  repodata  RPM-GPG-KEY-CentOS-7  RPM-GPG-KEY-CentOS-Testing-7  TRANS.TBL
[root@localhost ~]# cd /media/cdrom/repodata/
[root@localhost repodata]# ls
115749f609bb070c1a0524edbe39312defa896eab1b8c8ff9844f078d1efdd95-primary.xml.gz
281832be789b989fe8c543f9de47992c0b1de080a4c7f7971a587cfa64d58f86-other.sqlite.bz2
283c19e8d3c6ff8541ddc19ea36d974e6afdc2770257a04622fc0aa5280b4322-filelists.xml.gz
38b60f66d52704cffb8696750b2b6552438c1ace283bc2cf22408b0ba0e4cbfa-c7-x86_64-comps.xml
6addbbcab39d561cf037917505807e1547d0d06937b539a01ae1d55a62d2a552-other.xml.gz
9346184be1deb727caf4b1ecf4a7949155da5da74af9b92c172687b290a773df-c7-x86_64-comps.xml.gz
ce678501a07f940dbe16d3e4fcb495050fd48ec429c5e8ea955e681594f90934-filelists.sqlite.bz2
f64ccdaf79da59bd21f7cf17f252ff62f2e56ea55bce5b4de16cf8ef1d13a7c8-primary.sqlite.bz2
repomd.xml
TRANS.TBL
[root@localhost repodata]# 

挂载之后的目录repodata里面显示的就是CentOS系统提供的仓库镜像文件,只是对于版本没有更新,但大部分程序包都有。

[root@localhost ~]# cat /etc/yum.repos.d/mybase.repo 
[mybase]
name=my base repo
baseurl=file:///media/cdrom/repodata
gpgcheck=0
enable=1
[root@localhost ~]# 

这里是我写的一个简单的本地源仓库配置文件,虽然简单但是可以用,呵呵。baseurl指向的是挂载后的光盘仓库路径,如果是ftp也可以改为ftp路径,切记路径的最后指向要是repodate这个目录。

2. 网络源yum仓库即把baseurl改成网络地址即可,这里我找到国内比较快的镜像站点,aliyun,163,sohu都可以,也可指向多个镜像站点,或者指向mirrorlist。
[root@localhost ~]# 
[root@localhost ~]# cat /etc/yum.repos.d/mybase.repo
[mybase]
name=my base repo
baseurl=https://mirrors.aliyun.com/centos/7.5.1804/os/x86_64/repodata/
gpgcheck=0
enable=1
[root@localhost ~]# 

当然这里需要你查看下自己的系统版本号,来找网上对应的版本仓库镜像文件,你也可以用/$releasever/$basearch等变量引用来找对应的系统版本镜像文件。


3、简述at和crontab命令,制定 每周三凌晨三、五点10分执行某个脚本,输出当前时间,时间格式为 2017-12-28 10:00:00

at和crontab都是计划任务执行命令,未来的某个时间点执行一次某任务用at,而周期性在某个时间点执行任务用crontab。

at命令:

在未来的某一个时间点执行某一次或多次不同的任务;其at命令的作业有队列之说,用单个字母表示,可指明需要执行的任务为其他的哪个队列以表示用户的不同区别任务类型,默认都是使用a队列。

用法:at [OPTIONS] TIME

TIME时间表示法有精确表示和模糊表示两种;

精确表示:HH:MM [YYYY-mm-dd] 例如:10:10 2018-07-11 表示。如设定时间是过去的某个时间,将再下一次时间执行。

模糊表示:noon,midnight,teatimeata,tomorrow等

从当前时间开始计算表示:at now+#[unit] 这里的unit可为min,hours,days,years。例如now +1min表示从当前时间往后的1分钟之后开始执行任务。

[root@localhost ~]# 
[root@localhost ~]# at now+2min
at> ls /etc/issue
at> q
at> <EOT>
job 1 at Wed Jul 11 17:17:00 2018
Can't open /var/run/atd.pid to signal atd. No atd running?
[root@localhost ~]# 
[root@localhost ~]# at now+2min
at> cat /etc/issue       
at> cat /etc/fstab
at> <EOT>
job 2 at Wed Jul 11 17:18:00 2018
Can't open /var/run/atd.pid to signal atd. No atd running?
[root@localhost ~]# at -l
1	Wed Jul 11 17:17:00 2018 a root
2	Wed Jul 11 17:18:00 2018 a root
[root@localhost ~]# date
Wed Jul 11 17:17:20 CST 2018
[root@localhost ~]# 

以上执行at命令,后跟now+2min,表示2分钟后执行任务,那么输出的结果直接是交互式的界面,需要用户手动添加需要执行任务的命令,可以是多条执行命令,ctrl+d保存退出。可以执行一个文件,其文件内容是执行的命令,这里就需要用选项了。

其执行的结果将已邮件的形式发送给发起任务的用户,可通过mail命令来查看。

at命令选项:(at命令执行的任务是一次性的,非周期性任务,切记。)

at -l 查看队列作业,显示的是未执行的任务情况,已执行过的任务不显示,相当于atq命令;

-f /PATH/TO/SOMEFILE 从指定文件中读取作业,而不用交互式输入;用户可以把需要执行的任务命令写在一个文件当中,每行一个任务,at -f 文件名 可直接读取其内的命令,而不用与用户交互了。

-d #(作业号) 删除指定的作业,相当于atrm命令;

-c #(作业号) 查看指定作业的具体内容,其内包含的内容有环境变量的信息,执行的命令等,大家可自行查看下;

-q QUEUE 指明队列,默认的队列为a;

[root@localhost ~]# at -l
1	Wed Jul 11 17:17:00 2018 a root
2	Wed Jul 11 17:18:00 2018 a root
3	Wed Jul 11 17:44:00 2018 a root
[root@localhost ~]# at -q b
Garbled time
[root@localhost ~]# at -l
1	Wed Jul 11 17:17:00 2018 a root
2	Wed Jul 11 17:18:00 2018 a root
3	Wed Jul 11 17:44:00 2018 a root
[root@localhost ~]# at -q b now+2min
at> ls /
at> <EOT>
job 4 at Wed Jul 11 18:32:00 2018
Can't open /var/run/atd.pid to signal atd. No atd running?
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# at -l
1	Wed Jul 11 17:17:00 2018 a root
2	Wed Jul 11 17:18:00 2018 a root
3	Wed Jul 11 17:44:00 2018 a root
4	Wed Jul 11 18:32:00 2018 b root
[root@localhost ~]# at -d 2
[root@localhost ~]# 
[root@localhost ~]# at -l
1	Wed Jul 11 17:17:00 2018 a root
3	Wed Jul 11 17:44:00 2018 a root
4	Wed Jul 11 18:32:00 2018 b root
[root@localhost ~]# 
crond命令:

我们上面讲到at命令是在未来的某一个时间点一次性的执行任务,而如果想实现周期性的执行任务,就是在每个时间点都执行一次任务的话,就要用到crond命令了。

crontab任务有专门的守护进程crond,默认系统是开启的,CentOS 7 查看服务开启状态命令为:systemctl status crond.service;CentOS 6的查看服务状态命令为:service crond status;当然CentOS 7 也照样适用于此命令。

[root@localhost ~]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-07-10 10:44:50 CST; 1 day 7h ago
 Main PID: 678 (crond)
   CGroup: /system.slice/crond.service
           └─678 /usr/sbin/crond -n

Jul 10 10:44:50 localhost.localdomain systemd[1]: Started Command Scheduler.
Jul 10 10:44:50 localhost.localdomain systemd[1]: Starting Command Scheduler...
Jul 10 10:44:50 localhost.localdomain crond[678]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 8% if used.)
Jul 10 10:44:50 localhost.localdomain crond[678]: (CRON) INFO (running with inotify support)
[root@localhost ~]# 

注意:crond提交作业的方式不同于at,它需要使用专用的配置文件来定义周期性任务,此文件有固定的格式,不建议直接使用文本编辑器编辑文件,而是使用crontab命令。

crond任务可以分为两类:

1.系统crond任务,主要用于实现系统自身的维护;其方式是手动编辑配置文件,/etc/crontab文件;

2.用户crond任务,主要用于用户自定义实现周期性任务,其方式用命令crontab;用户的crond任务也有配置文件,是根据用户名所创建的相应文件,/var/spool/cron/USERNAME,比如:tom用户创建的周期性任务,其配置文件在/etc/spool/cron/tom,其此文件是需要crontab完成后才生成的;

我们可以先看下这些文件里面的参数所代表的意义:

[root@localhost ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

[root@localhost ~]# 

这个文件是系统的crond任务配置文件,用户的配置文件只是在最后一行那里少了user-name而已,其他的都一样。

其他的参数相信大家都能看得懂:

1. 其实所有的参数就最后一行是直接定义周期性任务的:

* * * * *:5个*定义了周期性的时间;

user-name:定义运行任务的用户身份;

command to be execute 所需要执行的任务命令;

2. 此处的环境变量不同于用户登录后获得的环境变量,因此,建议命令使用绝对路径,或者自定义PATH变量;

3. 执行结果邮件发送给MAILTO指定的用户;

这里主要重点讲下时间表示法,因为是周期性任务定义时间的关键点:

5个*代表的意思就是“每...”;每分钟,每小时,每天,每月,每周的星期几,这个意思,下面举例说明:

第一种: 3 * * * * 表示每小时执行一次,每小时的第3分钟执行一次;

     3 4 * * 5 表示每周执行一次,每周五的4点3分执行一次;

     5 6 7 * * 表示每月执行一次,每月的7号6点5分执行一次;

     7 8 9 10 * 表示每年执行一次,每年的10月9号8点7分执行一次;

第二种: 9 8 * * 3,7 表示每周三,周日8点9分执行一次;

              0 8,20 * * 3,7 表示每周三,周日的8点和20点整执行一次;

第三种: 0 9-18 * * 1-5 表示工作时间 每周一到周五的9点到18点 每小时 执行一次;

第四种: */5 * * * * 表示每5分钟执行一次任务

注意事项:

指定的时间点不能被步长整除时,其意义将不复存在;最小时间单位为“分钟”,想完成“秒”级任务,得需要额外借助于其他机制;定义每分钟任务,可利用脚本实现在每分钟之内,循环多次执行以达到效果。

crontab命令:

选项:-e 编辑任务

           -l 列出任务

           -r 移除所有任务,即删除用户的cron配置文件

           如果需要删除单个任务,crontab -e 编辑文件之后进入删除单行任务即可;

           -i 在使用-r移除所有任务时提示用户确认,与用户交互的选项;

           -u username  root用户可以为指定的用户定义其任务内容;

示例:每周三凌晨三、五点10分执行某个脚本,输出当前时间,时间格式为 2017-12-28 10:00:00

[root@localhost ~]# date +%F-%T
2018-07-11-20:03:44
[root@localhost ~]# ls
anaconda-ks.cfg  date.sh  zsh-5.0.2-28.el7.x86_64.rpm
[root@localhost ~]# cat date.sh 
#!/bin/bash
#
date +%F-%T
[root@localhost ~]# crontab -l
10 3,5 * * 3 ./date.sh

这里如果不太习惯写脚本,可以先用命令看下效果,例如:date +%F%T,即显示题目的时间格式,我只是在%F和%T之间加了一个-,看起来更连贯些,按照题目的要求,其脚本命令为:date +%F%T即可。

这里我已经写好了一个脚本,记得bash -x检查下语法格式,chmod +x添加执行权限,然后可以使用crontab -e编辑文件,crontab -l查看任务内容等;10(每小时的第10分钟)3,5(分别表示每天的凌晨三点和五点)* *(没有就不指名哪月的哪天)3(表示每周三),./date.sh即在这个两个时间点执行的脚本,输出格式为date的输出信息。


4、简述sed常用操作命令,并举例。

sed工具是Linux系统中文本处理三剑客其中之一,还有另外两个grep和awk。其中grep是文本过滤器,方便查找过滤;sed是流编辑器,可以进行行编辑操作而展示相关输出信息;awk是文本格式化工具,报告生成器。每个工具都有自己的应用场景,对于需要编辑操作而展示操作后的内容的可用sed,但sed不对原文件进行修改,如要修改需添加选项操作。

用法:sed [OPTIONS]...'script' [inputfile]

其中'script'包含为两段含义:地址定界(从哪到哪),编辑命令(执行什么样的操作);

先说选项:options:(这里也只说常用的选项)

-n 不输出模式空间中的内容至屏幕(这里的有模式空间和保持空间之说,模式空间我们可以认为是script匹配到的符合条件的内容存放空间,而保持空间我们可以认为是sed工具的一个缓存空间,其实这么说不精确,讲太多怕大家晕,其实我也有点晕);

-e 实现多点编辑,多个编辑命令,默认只有一个script脚本;

-f /PATH/TO/SED_SCRIPT_FILE 指定编辑命令脚本文件;脚本文件中每一行为一个编辑命令;

-r 支持使用扩展的正则表达式;地址定界里面可以有正则表达式的pattern来匹配位置;

-i 直接编辑原文件;建议不使用,如果确定使用,可先将原文件备份一份之后,再sed -i编辑查看;

再说script里的地址定界:

1. 如果为空字符,则表示对全文进行处理,编辑查看操作;

2. # (number)数字,表示单地址,指定行(这里所说的操作对象都是文本文件,故有行数之说);也可定义/pattern/被模式匹配到的每一行;

3. 地址范围定义,#,#:1,3表示第1行到第3行的内容;#,+#;#,/pattern1/;/pat1/,/pat2/;$表示最后一行;

4. 步进地址,用~表示:“1~2”表示从第一行步进2行,就是1,3,5,7,9...行数,可表示为所有奇数行;“2~2”表示从第二行步进2行,就是2,4,6,8...行数,可表示所有偶数行。

最后说下script里的地址定界后的编辑命令类型:

d 删除操作,表示地址定界模式匹配到的行做删除操作;整行删除;

p 显示模式空间中的行;一般与-n选项配合使用,但是要搞清楚逻辑是非关系,否则会很晕;

a \text 表示在行下方追加“text”内容,支持使用\n实现多行追加;

i \text 表示在行上方插入“text”内容,支持使用\n实现多行插入;

c \text 表示把匹配到的行替换为此处指定的文本“text”内容;

w /PATH/TO/SOMEFILE 保存模式空间中匹配到的行至指定文件中;

r /PATH/TO/SOMEFILE 读取指定的文件内容至当前文件被模式匹配待的行的后面,实现文件合并;

= 为模式空间匹配到的行打印行号;

! 条件取反;一般格式例如:地址定界!编辑命令 模式匹配到的行不执行什么编辑操作;

s///,s@@@,s###,查找替换,也支持vim编辑器命令行模式下的s查找替换功能,s@@@g修饰符g表示全局替换;

下面给大家举例说明,以/etc/fstab文件说明:

[root@localhost ~]# 
[root@localhost ~]# sed '1,6d' /etc/fstab 
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d8b88bd6-6098-4398-aa8e-d3180f4d579b /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# 

/etc/fstab文件里的'1,6'表示从第1行到第6行的内容执行d操作,删除操作;输出屏幕内容为未匹配到的行内容;

[root@localhost ~]# sed '/^UUID/d' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Tue Jun 26 13:23:51 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# sed '/^#/d' /etc/fstab

/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d8b88bd6-6098-4398-aa8e-d3180f4d579b /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# 

/parttern/模式匹配到的行执行d删除操作;

[root@localhost ~]# 
[root@localhost ~]# sed '1~2!d' /etc/fstab

# /etc/fstab
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
/dev/mapper/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# sed '1~2d' /etc/fstab
#
# Created by anaconda on Tue Jun 26 13:23:51 2018
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
UUID=d8b88bd6-6098-4398-aa8e-d3180f4d579b /boot                   xfs     defaults        0 0
[root@localhost ~]# 

显示奇数行,偶数行;

[root@localhost ~]# sed '3a \new line \nanother new line' /etc/fstab

#
# /etc/fstab
new line 
another new line
# Created by anaconda on Tue Jun 26 13:23:51 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d8b88bd6-6098-4398-aa8e-d3180f4d579b /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# sed '5i \new line \nanother new line' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Tue Jun 26 13:23:51 2018
new line 
another new line
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d8b88bd6-6098-4398-aa8e-d3180f4d579b /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# 

第一个是在第三行后面追加内容,注意有\n换行符;第二个是在第五行前面插入新内容;

[root@localhost ~]# sed '=' /etc/issue
1
\S
2
Kernel \r on an \m
3

[root@localhost ~]# 

这个加行号加的很郁闷,呵呵。

[root@localhost ~]# sed 's@^#[[:space:]]*@@' /etc/fstab 


/etc/fstab
Created by anaconda on Tue Jun 26 13:23:51 2018

Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d8b88bd6-6098-4398-aa8e-d3180f4d579b /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab 


/etc/fstab
Created by anaconda on Tue Jun 26 13:23:51 2018

Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

/dev/mapper/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# 

查找替换,s@parttern@@,-e多点编辑,执行多次操作;

查找fstab文件中#开头的字符替换成空,删除以UUID开头的整行;

[root@localhost ~]# 
[root@localhost ~]# sed -n '1~2p' /etc/fstab

# /etc/fstab
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
/dev/mapper/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# sed '1~2p' /etc/fstab


#
# /etc/fstab
# /etc/fstab
# Created by anaconda on Tue Jun 26 13:23:51 2018
#
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d8b88bd6-6098-4398-aa8e-d3180f4d579b /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# 

‘1~2p’表示匹配到的奇数行打印出来,而-n则表示模式空间中匹配到的内容不显示,第二个命令没有选项-n,则匹配到的行显示了两次;这就是sed的工作原理即是从指定的文件中逐行读取到自己的模式车间中进行匹配,不匹配的行也直接输出到标准输出,就是显示到屏幕,而匹配到的行根据执行编辑命令输出结果,p是打印故显示两次,如果这里是d删除的话,就直接删除不显示了。

[root@localhost ~]# sed -n '1~2d' /etc/fstab
[root@localhost ~]# sed '1~2d' /etc/fstab
#
# Created by anaconda on Tue Jun 26 13:23:51 2018
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
UUID=d8b88bd6-6098-4398-aa8e-d3180f4d579b /boot                   xfs     defaults        0 0
[root@localhost ~]# 
-n和编辑命令d一起使用就没有了其意义,而第二个命令则可理解为显示偶数行,因为模式匹配到的奇数行做删除操作了,故不符合模式匹配的行输出到屏幕,即显示偶数行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值