七、重定向、管道符
1、重定向
1、输入输出原理
image.png进程使用称为文件描述符的编号通道来获取并发送输出。所有进程在开始时至少三个文件描述符。
标准输入(通道0)从键盘输入
标准正常输出(通道1)将标准正常输出发送到终端。
标准错误输出(通道2)将标准错误输出发送到终端。
如果程序打开连接至其它文件的单独连接,则可能要使用更大编号的文件描述符。
输入输出重定向
输出重定向:把原本要输出到屏幕的数据信息写入到指定文件中
输入重定向:是指把文件导入到命令中
格式: 命令 输出重定向/输入重定向 文件
2、输出重定向
序号 | 符号 | 作用 |
---|---|---|
1 | 命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
2 | 命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
3 | 命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
4 | 命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
5 | 命令 > /dev/null | 将正确的输出丢弃 |
6 | 命令 2> /dev/null | 将错误的输出丢弃 |
7 | 命令 &> /dev/null | 不管是正确的输出还是错误的输出全部丢弃 |
8 | 命令 > 文件 2>&1 或命令 &> 文件 | 将标准输出与错误输出共同写入到文件中 |
9 | 命令 >> 文件 2>&1 或命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
10 | 命令 2> 文件 1> 文件2 | 分别将将标准输出与错误输出到不同文件中 |
11 | 命令 2>> 文件 1>> 文件2 | 分别将将标准输出与错误输出到不同文件中(追加到原有内容的后面) |
1、[root@server1 ~]# ls > out_test
2、[root@server1 ~]# lsls 2> err_test
3、[root@server1 ~]# ls >> out_test
4、[root@server1 ~]# lsls 2>> out_test
5、[root@server1 ~]# ls > /dev/null
6、[root@server1 ~]# lsls 2> /dev/null
7、[root@server1 ~]# ls &> /dev/null
8、[root@server1 ~]# ls &> all_test
9、[root@server1 ~]# lsls &>> all_test
10、[root@server1 ~]# ls 2> error.log 1> out.log
11、[root@server1 ~]# lsls 2>> error.log 1>> out.log
3、输入重定向
序号 | 符号 | 作用 |
---|---|---|
1 | 命令 < 文件 | 将文件作为命令的标准输入 |
2 | 命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
3 | 命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
4 | cat >> 文件 << 分隔符 | 将多行文本写入一个文件当中 |
1、[root@server1 ~]# wc -l < anaconda-ks.cfg
2、[root@server1 ~]# cat << EOF
> Whatever is worth doing is worth doing well.
> Happiness is a way station between too much and too little.
> EOF
Whatever is worth doing is worth doing well.
Happiness is a way station between too much and too little.
3、[root@server1 ~]# wc -w < anaconda-ks.cfg > world
4、[root@server1 ~]# cat >> test.txt << EOF
> Whatever is worth doing is worth doing well.
> Happiness is a way station between too much and too little
> EOF
2、管道符
作用:将前一个命令的结果作为后一个命令的参数
注意:管道符是可以重叠使用的
我们来举几个例子,你就慢慢的明白它的使用方式了
[root@server1 ~]# ls | wc -w
[root@server1 ~]# ls -l | head -3
[root@server1 ~]# ps -ef | grep sshd
root 12990 1 0 03:10 ? 00:00:00 /usr/sbin/sshd -D
[root@server1 ~]# echo "hello world" >> hello.test
[root@server1 ~]# cat anaconda-ks.cfg | tr [a-z] [A-Z] > anaconda-ks.cfg.out
[root@server1 ~]# who | tr 'a-z' 'A-Z' > who.out
3、通配符
用于匹配字符,指包含这些字符的字符串“?”,“*”,“[]”,{}
? 任何一个字符
[root@server1 ~]# ls /sbin/???
/sbin/arp /sbin/lid /sbin/lvs /sbin/sln /sbin/zic
/sbin/cbq /sbin/lvm /sbin/pvs /sbin/vgs
[abcd]表示匹配中括号内任意一个字符就成立
[root@server1 ~]# ls /sbin/[abcd]rp
/sbin/arp
{}生成序列
[root@server1 ~]# touch test{1..4}
*匹配全部字符
[root@server1 ~]# ll test*
-rw-r--r-- 1 root root 284 Jun 28 04:43 test
-rw-r--r-- 1 root root 0 Jun 28 05:31 test1
-rw-r--r-- 1 root root 0 Jun 28 05:31 test2
-rw-r--r-- 1 root root 0 Jun 28 05:31 test3
-rw-r--r-- 1 root root 0 Jun 28 05:31 test4
-rw-r--r-- 1 root root 104 Jun 28 05:03 test.txt
八、软件包管理
1、分类
1、源码包
顾名思义,没有进行编译之后的包含源代码的包,系统需要编译后才能安装
优点:
开源,如果能力足够,可以修改源代码
可以自由选择所需要的功能
软件安装是编译安装,所以更加适合操作系统,更加稳定,效率更高
卸载方便
缺点:
安装过程步骤较多,尤其是在安装大型的环境,很容易出错
编译时间较长,所以安装时间较长
因为是编译安装,安装过程中出错,新手很难解决
2、二进制包
已经编译好的安装包,系统可直接进行安装。常见的二进制包有rpm包,deb包。RHEL,Centos使用rpm包;Debian,Ubuntu使用deb包。
优点:
包管理系统简单,只通过几个命令就可以实现包的安装,升级,查询,卸载
安装速度比源码包安装的快得多
缺点:
经过编译,看不到源代码
功能选择不如源代码灵活
依赖性(事实上不管二进制安装还是源码包安装都有这个问题)
功能
2、RPM包管理-rpm命令管理
1、rpm包命名规则
以mokutil-15-1.el7.centos.x86_64.rpm为例
rpm包名部分 | 含义 |
---|---|
mokutil | 软件包名 |
15 | 软件版本 |
1 | 软件发布的次数 |
el7.centos | 适合的linux平台 |
x86_64 | 适合的硬件平台 |
rpm | rpm包扩展名 |
注意 rpm包严格区分包名和包全名,以上边这个包为列
mokutil为包名,mokutil-15-1.el7.centos.x86_64.rpm为包全名
包全名:
包名:操作的包是没有安装的软件包时,使用包全名。而且需要注意看路径
包名:操作系统已经安装的软件包时,使用包名。因为查询的是/var/lib/rpm下的数据库,而不是路径
2、rpm依赖性
树形依赖:a→b→c
环形依赖:a→b→c→a
模块依赖:列如libodbc.so.2(),如果遇到类似于这种模块的,我们需要查询www.rpmfind.net安装模块所在的包
3、rpm命令使用
选项 | 作用 |
---|---|
-i (install) | 安装 |
-v (verbose) | 显示详细信息 |
-h (hash) | 显示进度 |
--nodeps | 不检查依赖性 |
-U (upgrade) | 更新 |
-e (erase) | 卸载 |
-q (query) | 查询 |
-a (all) | 全部 |
-i (information) | 信息 |
-p (package) | 包信息 |
-l (list) | 列表 |
-f (file) | 文件 |
rpm包安装
[root@server1 Packages]# rpm -ivh httpd-2.4.6-67.el7.centos.x86_64.rpm
rpm包升级
[root@server1 Packages]# rpm -Uvh httpd-2.4.6-67.el7.centos.x86_64.rpm
rpm包卸载
[root@server1 Packages]# rpm -e httpd-2.4.6-67.el7.centos.x86_64.rpm
查询包是否安装
[root@server1 Packages]# rpm -q httpd
查询软件包详细信息
[root@server1 Packages]# rpm -qi httpd
[root@server1 Packages]# rpm -qip httpd-2.4.6-67.el7.centos.x86_64.rpm
查询包中文件安装位置
[root@server1 Packages]# rpm -qi httpd
[root@server1 Packages]# rpm -qlp httpd-2.4.6-67.el7.centos.x86_64.rpm
查询系统文件属于哪个rpm包
[root@server1 Packages]# rpm -qf /usr/share/httpd/noindex/images
查询软件包的依赖性
[root@server1 Packages]# rpm -qR httpd
[root@server1 Packages]# rpm -qRp httpd-2.4.6-67.el7.centos.x86_64.rpm
3、RPM包管理-yum在线管理
yum诞生的最大原因就是解决rpm包依赖性的问题,用yum进行对一个包的操作事实上还是对rpm包操作。
1、yum命令使用
查询所有的软件包
[root@server1 ~]# yum list
搜索服务器上所包含关键字所有的包
[root@server1 ~]# yum search httpd
安装
[root@server1 ~]# yum -y install httpd
升级
[root@server1 ~]# yum update #更新所有的包,包括系统默认软件包和系统内核
[root@server1 ~]# yum update httpd #更新httpd
卸载
[root@server1 ~]# yum -y remove httpd
列出所有可用的软件组
[root@server1 ~]# yum grouplist
安装指定的软件组
[root@server1 ~]# yum -y groupinstall "General Purpose Desktop"
卸载指定的软件组
通过搜索命令来搜索软件包
[root@server1 ~]# yum provides "*/rz"
4、yum源配置
rpm软件包的来源有三种:分别是官方源,第三方源,用户自定义源。
软件仓库的提供方式有三种:分别是file,ftp,http
配置file方式使用本地源
实验环境 192.168.1.41
192.168.1.41作为rpm仓库 192.168.1.41作为使用者
[root@server1 ~]# mount /dev/sr0 /opt/
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# mkdir bak
[root@server1 yum.repos.d]# mv CentOS-* bak
[root@server1 yum.repos.d]# vim local.repo
[centos]
name=centos
baseurl=file:///opt/
enabled=1
gpgcheck=0
[root@server1 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id repo name status
centos centos 3,894
repolist: 3,89
1、挂载光盘镜像文件(做软件仓库)
2、备份网络源
3、新建repo文件
4、验证
配置ftp方式使用公司内网源
实验环境 192.168.1.41 192.168.1.42
192.168.1.41作为rpm仓库 192.168.1.42作为使用者
[root@server1 ~]# yum -y install vsftpd
[root@server1 ~]# vim /etc/vsftpd/vsftpd.conf
anon_root=/opt/
[root@server1 ~]# systemctl start vsftpd
[root@client1 ~]# cd /etc/yum.repos.d/
[root@client1 yum.repos.d]# mkdir bak
[root@client1 yum.repos.d]# mv CentOS-* bak/
[root@client1 yum.repos.d]# vim ftp.repo
[centos]
name=centos
baseurl=ftp://192.168.1.41
enabled=1
gpgcheck=0
[root@client1 yum.repos.d]# yum repolist
repo id repo name status
centos centos 3,894
repolist: 3,894
1、在1.41节点安装vsftpd
2、修改配置文件,vsftpd默认工作目录为/opt
3、在1.42节点配置repo文件
4、验证
配置http方式使用公司内网源
实验环境 192.168.1.41 192.168.1.42
192.168.1.41作为rpm仓库 192.168.1.42作为使用者
[root@server1 ~]# yum -y install httpd
[root@server1 ~]# systemctl start vsftpd
[root@server1 ~]# mkdir /var/www/html/centos
[root@server1 ~]# mount /dev/sr0 /var/www/html/centos/
[root@client1 yum.repos.d]# vim httpd.repo
[centos]
name=centos
baseurl=http://192.168.1.41/centos
enabled=1
gpgcheck=0
[root@client1 yum.repos.d]# yum repolist
repo id repo name status
centos centos 3,894
repolist: 3,894
1、在1.41节点安装httpd,启动
2、卸载之前的挂载,重新挂载在http工作目录下centos目录(http工作目录/var/www/html,挂载前建立好centos目录)
3、在1.42节点配置repo文件(删除之前的repo文件)
4、验证
九、用户和用户组管理
1、用户配置文件
用户信息文件/etc/password
字段 | 含义 |
---|---|
第1字段 | 用户名称 |
第2字段 | 密码标识位 |
第3字段 | UID(用户ID,1:超级用户,1-499:系统用户,500-65535:普通用户) |
第4字段 | GID(用户初始组ID) |
第5字段 | 用户说明 |
第6字段 | 家目录(用户的工作目录),普通用户:/home/用户名,超级用户:/root/ |
第7字段 | 登陆之后的shell |
影子文件/etc/shadow
字段 | 含义 |
---|---|
第1字段 | 用户名 |
第2字段 | 加密密码SHA512散列加密算法,!!或*代表没有密码 |
第3字段 | 最后一次修改时间,使用时间戳表示 |
第4字段 | 两次密码的修改间隔时间 |
第5字段 | 密码有效期 |
第6字段 | 密码修改到期前的警告天数 |
第7字段 | 密码过期后的宽限天数 |
第8字段 | 账号失效时间,时间戳表示 |
第9字段 | 保留 |
时间戳与时间的互相替换
[root@server1 ~]# date -d "1970-01-01 18811 days" #时间戳替换为时间
Sat Jul 3 00:00:00 EDT 2021
[root@server1 ~]# echo $(($(date --date="2021/07/05" +%s)/86400+1))
18814 #时间替换为时间
组信息文件/etc/group
字段 | 含义 |
---|---|
第1字段 | 组名 |
第2字段 | 组密码标识位 |
第3字段 | GID |
第4字段 | 组中附加用户 |
组密码文件/etc/gshadow
字段 | 含义 |
---|---|
第1字段 | 组名 |
第2字段 | 密码 |
第3字段 | 组管理员用户名 |
第4字段 | 组中附加用户 |
除此之外还有
用户的家目录
普通用户:/home/用户名/
超级用户:/root/
用户的邮箱
/var/spool/mail
用户的模板
/etc/skel
用户默认值文件
/etc/default/useradd
/etc/login.defs
2、用户管理命令
useradd
添加用户
选项 | 含义 |
---|---|
-c | 加上备注文字。备注文字会保存在passwd的备注栏位中 |
-d | 指定用户登入时的起始目录 |
-g | 指定用户所属的群组 |
-G | 指定用户所属的附加群组 |
-s | 指定用户登入后所使用的shell |
-u | 指定用户ID |
[root@server1 ~]# useradd test1 #直接创建用户test1
[root@server1 ~]# useradd -u 510 -g test -G root test2 -d /test2 -c "test2 user" -s /bin/bash #创建用户test2,uid为510,初始组为test,附加组为root,家目录为/test2,描述为“test2 user”,登陆终端为test2
passwd
设置用户密码
[root@server1 ~]# passwd #设置当前登陆用户的密码
[root@server1 ~]# passwd user1 #设置用户user1的密码(只有root管理员才可以为其他用户设置密码)
[root@server1 ~]# passwd -S user1 #查询user1的密码状态
[root@server1 ~]# passwd -l user1 #暂时锁定用户user1
[root@server1 ~]# passwd -u user1 #解锁用户user1
[root@server1 ~]# echo "000000" | passwd --stdin user1 #使用字符串作为user1用户的密码
usermod
修改用户信息
选项 | 含义 |
---|---|
-c | 修改备注文字。备注文字会保存在passwd的备注栏位中 |
-G | 修改用户所属的附加群组 |
-u | 指定用户ID |
-L | 临时锁定用户 |
-U | 解锁用户锁定 |
[root@server1 ~]# usermod -c "lamp user" user1
[root@server1 ~]# usermod -G test user1
[root@server1 ~]# usermod -L user1
[root@server1 ~]# usermod -U user1
userdel
删除用户
[root@server1 ~]# userdel -r test1 #删除用户test1
[root@server1 ~]# userdel -r test2 #删除用户test2的同时删除user2的家目录
su
切换用户
[test@server1 ~]$ su root #只是切换了root身份,但Shell环境仍然是普通用户的Shell
[test@server1 ~]$ su - root #连用户和Shell环境一起切换成root身份
3、用户组管理命令
groupadd
添加用户组
[root@server1 ~]# groupadd mark #添加用户组mark
[root@server1 ~]# groupadd -g 550 marktest #添加用户组marktest并且设置组ID
groupmod
修改用户组信息
[root@server1 ~]# groupmod -g 551 marktest #修改marktest的组ID为551
[root@server1 ~]# groupmod -n testmark marktest #将marktest的用户组名修改为testmark
groupdel
删除用户组
[root@server1 ~]# groupdel testmark #删除用户组testmark
网友评论