admin 管理员组文章数量: 1184232
一、openEuler与Linux的发展史
操作系统的重要作用(核心定义)
- 识别和管理硬件资源
- 可以给软件提供一个可供运行的环境
操作系统也是一个软件,将这个软件称为基础软件(当下国产基础软件的替换方案就是所谓操作系统的替换方案)
1. 欧拉的起源
EulerOS 华为企业级操作系统 付费版本
openEuler 完全社区运营的企业级操作系统
1.1 openEuler是不是复刻的CentOS/RHEL???
为什么Euler和RHEL的使用很类似?
a. openEuler使用了RPM作为操作系统的软件包管理器(RPM是红帽开源的包管理器)
b. openEuler也使用了anaconda工具(红帽开源的操作系统安装工具),因此安装系统时看起来一样
c. openEuler也是基于BASHE SHELL作为默认的命令行程序来使用
1.2 为什么欧拉要大量使用红帽开源项目???
为了能够让生态变的更容易被大家接受(用户已经习惯了CentOS/RHEL)
openEuler没有复刻CentOS,它和CentOS一样也是基于上游社区(kernel)来做的发行版本
kernel(Linux内核社区)社区网址:https://www.kernel/
2. Linux的起源
2.1 Linux 的发展历程中,有三个核心人物和关键事件起到了决定性作用,分别是
2.2 肯・汤普森(Ken Thompson)、理查德・斯托曼(Richard Stallman)、林纳斯・托瓦兹(Linus Torvalds)、
Ken Thompson:
1970年发布Unix ——> 1982解体,Unix失去维护。
商业公司开始自行支持Unix的更新和维护,发行自己的Unix版本AIX、HP-UX
购买商业公司硬件,才能使用指定的Unix的版本
Richard Stallman:
1984年发起GNU运动,成立GNU自由软件基金会,提出 “自由软件四大自由”:
自由研究:你可以得到软件的源码,随意更改,随意运行
自由分发:可以将修改后源码或程序打包,提供给他人运行
自由运行:无论以任何目的都可以运行,不管是商业还是个人使用
自由改进:可以通过社区发行你的个人版本,可以接受社区的建议,或自行盈利,也就是可以接受社区的捐赠
斯托曼曾邀请安德鲁・坦嫩鲍姆(Andrew S. Tanenbaum,荷兰阿姆斯特丹自由大学教授) 加入 GNU 项目,希望基于其开发的教学用系统Minix(类 Unix 系统) 打造自由操作系统,但因 Minix 的商业授权问题被拒绝。
Linus Torvalds:
1991年在校园网的BBS上第一次发布自己写的Linux(内核)
斯托曼邀请托瓦兹加入GNU,1992年托瓦兹加入GNU
以Linus Torvalds名称来命名这跟项目,并且是在整个基金会维持这跟项目
Linus Torvalds只解决了操作系统的内核问题,并没有完美解决一整个操作系统所需的条件。
一个完整的操作系统: Linux Kernel(内核) + 用户(空间)的应用程序 = Linux的发行版
GNU/Linux才是完整的Linux的名称拼写,或者Linux也行,linux是错误的拼写
[root@openEuler ~]# uname -sro
Linux 5.10.0-153.12.0.92.oe2203sp2.x86_64 GNU/Linux
3. 开源如何得到保障
开源并不是无条件、无限制开源,条件和限制指的是: 开源许可证(开源协议)
开源软件在开源的同时,需要附上开源许可证,也就是通过什么许可证开源
GPL 协议——> GNU 公共许可证
如果A软件以GPL协议开源,那么任何基于A软件二次开发的软件都必须强制开源(因此将这个协议称为强开源协议)
Apache 许可证 ——> 比较有名的商用协议httpd...允许,软件进行商业销售
BSD 协议 ——> 伯克利软件协议 也允许商业销售
MIT 协议 ——> 麻省理工软件协议(MIT是目前限制最少的协议,只要求使用者保留原作者的版权信息)
木兰宽松许可证 v2——> 是中国第一个得到国际社会承认的开源许可证,openEuler基于此许可证开源,中国移动的BCLinux 也是该协议开源
木兰宽松协议存放路径(条款中明确在openEuler中做的二次开发和修改都必须使用木兰开源)
4. Linux的版本发行
基于Linux的内核产生的商业发行版本:
红帽的Linux Linux内核+红帽开发的软件=红帽的发行版本
ubuntu的Linux Linux内核+社区发开的软件=ubuntu的发行版本
华为的Linux Linux内核+社区开发的软件=openEuler的发行版
查看内核版本网站 https://www.kernel/
内核的发行特点:6.6.8
第一位: 内核的主版本号
第二位: 次版本号,用来区别开发版和稳定版,偶数表示稳定版本,奇数是开发板
第三位: 错误修订的次数
目前主流的社区或商业发行版都是使用稳定内核,openEuler使用5.x内核(商业、社区版通常不会使用最新的内核,而是使用修订次数较为完整的稳定版内核,也就是商业版或者社区版内核通常比较会滞后)
openEuler的发行特点:
openEuler一共有两个版本:
稳定版(长期支持版LTS): 用来长期支持业务使用(商业公司使用),每隔两年发布一版,通常每年3月份发布
创新版(开发版): 用来快速的更新新的功能(开发者使用),每隔六个月就发布一次,通常在每年9月份发布
SP:服务包,服务包通常是厂商或者是社区做的一次集中的更新或者说bug的修复,社区将所遇到的问题,统一在服务包中进行更新,因此一个sp的版本就是一个最新的完整安装介质
其他Linux的发行特点:
以为RHEL和CentOS为例:
红帽的三个主流版本:
RHEL:红帽的企业级操作系统——> RedHat Enterprise Linux 付费商业版
Fedora:红帽的个人版操作系统——>社区的开发者使用,免费的开源版
CentOS Linux: 红帽的社区级企业操作系统——>社区的用户使用,可以商用的免费开源版(已经停产,最后一版7.9,结束与2024.6.30)
CentOS Stream:红帽的社区级滚动更新版——>用来替代CentOS Linux
红帽的发行顺序:
2019年之前:先发行Fedora——>再发行RHEL——>最后发行CentOS Linux
将Fedora称为红帽的试验田,软件在Fedora上测试通过,下一个版本的RHEL就会使用这个软件,CentOS接着抄RHEL
2019年之后:先发行Fedora——>再发行CentOS Stream——>最后发行RHEL
将CentOS Stream称之为第二实验田
转换CentOS到RHEL或者是openEuler的方式:
1.将CentOS转换成红帽的RHEL——>使用红帽convert2rhel转换工具进行原地升级或者迁移。——>可以学习红帽的RH174课程
2.将CentOS转换成openEuler——>使用社区开发的x2openEuler,支持将CentOS、Oracle Linux、rocky等Linux转换成openEuler
转换指的是原地可以直接将软件包升级成openEuler、迁移可以将现有的操作系统上的软件和数据向新操作系统迁移
二、下载并安装openEuler操作系统
1.openEuler下载介绍
安装介质:指的是操作系统的安装包(ISO的镜像文件)
openEuler官网下载得到安装介质
社区发行版:指的是openEuler社区自己开发的原生的openEuler
商业发行版:指的是商业公司通过openEuler二次开发的商业版
架构:指的是处理器的类型
x86_64:AMD、inter下载该类型
aarch64:kungpeng arm 类型的处理器下载该类型
场景:所谓的场景就是根据用户使用用途,封装了很多不同的安装介质
服务器:标准的安装介质DVD ISO
Standard 标准安装介质:涵盖了操作系统安装所需的文件以及常用的软件包,安装介质大小适中,主流发行版本通常在4GB左右,生产中推荐下载
Everything 全量的安装介质:涵盖了操作系统安装所需的文件以外还涵盖了该发行版所有官方开发用到的软件包,因此该安装介质最大,通常在10GB以上,生产上不推荐下载(如果公司是离线的网络环境,后期没法联网装包,可以使用)
Network Install 仅携带启动安装介质: 该类型的安装介质,不能安装操作系统,只能启动安装程序,所有安装的软件包都需要联网下载,因此该介质最小通常只有上百MB,在批量部署中推荐下载。
边缘计算:仅包含该应用场景中所需要的一些特定软件
云计算:是一个虚拟机的模板文件,是一个kvm的qcow2的虚拟镜像(是一个已经安装好的操作系统)
嵌入式:专门给嵌入式设备用的安装包,特别精简,占资源少。像工业控制设备、家里智能小硬件、物联网传感器这些就用它,根据设备处理器和功能需求,选对应的架构版本,能让设备跑得又快又稳。
硬件设备:
操作系统需要安装在硬件之上,因此需要为操作系统准备一套硬件的环境,在现有的操作系统之上来构建一套虚拟的硬件,这套虚拟的硬件用来安装openEuler的操作系统用于学习。
将这套虚拟的硬件称为虚拟机——>虚拟计算机
虚拟机使用虚拟软件来实现:vmware workstations、VirtualBox...
2.vmware 安装openEuler的操作系统(环境搭建)
2.1 下载并安装vmware的虚拟机软件
https://www.vmware/products/desktop-hypervisor/workstation-and-fusion
ps:VMware Workstation Pro 目前对个人进行了免费,可以查查百度注册个账号下载即可。
2.2.通过vmware的虚拟机软件创建虚拟硬件(也就是虚拟机)
a. 自定义高级(自定义虚拟硬件)
b. 硬件的兼容性(相当于挑选主机的主板,也就是主板支持的硬件型号),保持默认
c. 稍后安装操作系统,虚拟机为才创建一个空白的硬盘
通过安装程序光盘来安装操作系统,这个需要openEuler的光盘来安装
第二种方式,通过虚拟光驱来帮我们安装就是通过映像文件(所谓映像文件就是ISO文件)
假设我们选择Redhat9(国外还没有兼容openEuler,因此如果选择openEuler,无法识别),那么vmware就根据版本号自动检测帮我们自动进行简易安装,因此我们在安装过程中就没办法体验到安装流程,适合熟练的操作系统的、希望快速得到一个操作系统的人员,因此我们选择第三个,稍后安装操作系统
d. 选择客户机操作系统(是vmware在为该操作系统适配虚拟硬件)
这一步就是让硬件适配操作系统,选择哪个操作系统接下来vmware就会推荐适合运行这个操作系统的虚拟硬件、驱动配置,Linux和windows的驱动配置不一样,因此不能乱选,而vmware也没有对openEuler的适配选项,那么我们可以选择如下,因为openEuler22.03用的内核是5.10
e. 为虚拟机创建文件保存位置并为虚拟机命名
f. 处理器
处理器数量:是插槽的数量,也就是主板上有多少块物理CPU;
内核数量:就是你单个CPU有几核心,欧拉学习中一个CPU两核就行了
g. 内存的配置建议4GB及以上即可
h. 网络模式配置选择NAT模式,也就是网络地址转换模式
i. 选择I/O控制器类型:硬盘控制器,选择推荐SCSI磁盘的控制器LSI logic(L)
I/O 控制器类型(SCSI)管理虚拟磁盘与虚拟机之间数据传输的硬件模拟组件,让虚拟机能够识别、读写 SCSI 虚拟磁盘,实现存储 I/O 的虚拟化管理,类比物理机的磁盘控制器,协调存储设备的输入输出操作
BusLogic(U):仅适用于一些老旧的 32 位操作系统,现在实际使用中很少选择。
LSI Logic (L)(推荐):兼容性极佳,是 VMware 默认推荐的 SCSI 控制器类型,支持绝大多数主流操作系统(如 Windows、Linux 等),适合大多数常规虚拟机场景。
LSI Logic SAS(S):专门针对 **SAS(串行连接 SCSI)** 协议的控制器仿真,适用于需要模拟 SAS 设备接口的场景,例如部分服务器级操作系统或对存储协议有特殊要求的应用。
准虚拟化 SCSI (P)(PVSCSI)性能优先,适用于高 I/O 负载的业务(如数据库服务器、大数据分析节点等),但需要客户机操作系统安装 VMware Tools 以支持 PVSCSI 驱动。
j. 选择虚拟硬盘的接口类型
IDE硬盘又叫并口硬盘
SCSI/SATA又叫串口硬盘、固态硬盘
NVME又叫M.2的硬盘,一般叫固态卡
j. 虚拟硬盘选择:创建新的虚拟硬盘
k. 指定磁盘容量:建议最少20G,不要勾选立即分配,存储为单个文件
m. 指定磁盘文件:保存文件名不变,点击下一步完成虚拟机(学习环境)创建,而后点击完成
2.3.在虚拟机安装openEuler的操作系统
a. 在虚拟机中添加ISO的镜像文件
b. 光盘的启动界面 选择第二项测试并安装openEuler
立即安装openEuler 22.03LTS-SP3
测试并安装openEuler 22.03LTS-SP3
维护模式
c. 第一个语言:安装过程中看到的语言,默认中文
d. 键盘布局:保持默认 在生产中,如果是英文选美式英语
e. 安装源:通过光盘进行安装(默认方式)
f. 分区:
/boot 启动引导分区 红帽建议512M或以上,openEuler建议1G
boot分区不会存放业务数据,也不会随意改动文件,不需要分特别大
boot分区中存放都是启动引导文件 内核就存在这个分区中
swap 内存交换分区(虚拟内存),让系统将硬盘上的一部分空间作为内存来使用,记住是作为内存使用,而不是将其当作真正的内存使用
早期的时候,swap应该是物理内存的两倍
建议: 推荐设置为2G
/ 根分区 将剩余的空间全部给到根分区,因此根的容量设置时保留为空白
g. 语言支持(第二个语言,):系统安装后的语言,添加中文语言支持,同时保留英文的语言支持
h. 安装方式
最小化安装,仅安装操作系统的核心功能(学习过程中不建议该安装方式;在生产上需要快速批量部署时建议,因为该项安装所耗费的时间最短)选择系统安装的软件:minimal install 最小化安装
服务器选项 可以快速部署服务,安装系统自动安装对应的服务
虚拟化选项,自动安装一个精简版的KVM的操作系统,用来运行虚拟机,通常该模式虚拟机作为云计算或者虚拟化的计算节点时使用
图形化安装 目前openEuler没有自携带的图形化环境,只能使用第三方开发的桌面环境,因此openEuler在安装时无法安装桌面的图形化安装(而图形化正是学习所需要的)
i. 配置网络:需要打开网卡的开关,让其通过DHCP获得地址,而后配置一个主机名为,我这里配置的主机名为openEuler.example(进入系统后主机名只显示openEuler)
j. 时区:保持默认,默认就是亚洲上海,不用设置
k. 用户:
root用户:
openEuler默认锁定root用户,也就是root是用不了的,需要手动开启
root的密码有复杂性要求,推荐学习使用Huawei@123
sm3是紧凑型加密算法,国产商业密码(商密),算法和实现都是由我们国家独立自主完成的
普通用户:
ps:如果root用户被禁用(不表示root不能使用,只是不能直接使用),则创建的普通用户必须打开提权的按钮选项,也就是要加入到管理员的组中,可以通过sudo -i 直接提权到root
3.登录的操作系统的方式
3.1 控制台登录(6个控制台 f1 - f6 ):
文本控制台(也就是字符界面):f2-f6
图形化控制台:f1(在其他Linux发行版中,f1和f2都是图形化)
切换控制台的方式 ctrl+alt +f1~f6进行切换(如果有fn键需要同时按)
目前openEuler默认没有自带的图形化桌面,可以使用支持的第三方桌面 dde(统信)、ukui(麒麟)、gnome(红帽默认的桌面)
ukui麒麟的桌面(只允许普通用户登录)
1. yum install ukui -y 安装ukui
2. systemctl set-default graphical.target 设置系统通过图形化启动
3. reboot 重启
dde 统信的桌面
1. yum install dde -y 安装ukui
2. systemctl set-default graphical.target 设置系统通过图形化启动
3. reboot 重启验证
gnome GNOME社区的桌面
在安装dde的桌面时,会自动安装gnome;因为dde中有一些gnome的依赖,因此装完dde可以选择dde的桌面也可以选择gnome的桌面
为什么需要那么多控制台呢?
避免其中一个控制台卡死导致无法操作,比如我们可以在f2中ping或者其他原因导致卡住了,无法操作做其他事情了,那么我们可以打开一个终端窗口切换到其他控制台对ping进程杀死,再返回f2控制台
3.2 WEB登录
支持cockpit 进行web管理
1. yum instal cockpit -y 安装cockpit
2. system enable --now cockpit.socket
3. ipaddr 查询IP地址
4. 浏览器登录
3.3 远程登录
直接通过ssh来进行登录
使用ssh的工具进行登录,如果是win10以上的操作系统的使用cmd或者是powershell都可以,如果是win10以下的操作系统,可以安装第三方支持ssh协议的工具来进行使用(我这里安装的是xshell家庭版免费的:家庭/学校免费 – NetSarang Website)
4. 命令行设置主机名
临时设置,重启系统后恢复原主机名
hostname ——>查看主机名
hostname 新主机名 ——>临时配置主机名
[root@openEuler ~]# hostname
openEuler.example
[root@openEuler ~]# hostname Huawei
[root@openEuler ~]# hostname
Huawei
[root@openEuler ~]# exit#重新登陆后
[root@Huawei ~]#
永久设置
1.通过hostnamectl配置
hostnamectl set-hostname 新主机名 ——>永久配置主机名
[root@openEuler ~]# hostnamectl set-hostname Huawei-node1
[root@openEuler ~]# hostname
Huawei-node1#执行以上命令后会自动同步修改/etc/hostname配置文件
[root@openEuler ~]# cat /etc/hostname
Huawei-node1
2.直接手动修改/etc/hostname配置文件方式(需 root 权限)
[root@openEuler ~]# vi /etc/hostname
Huawei-node2 #修改主机名为Huwei-node2
:wq
[root@Huawei-node1 ~]# hostname
Huawei-node2
3. 调整系统中的语言
查询当前支持的字符集
localectl list-locales
临时生效:
#欧拉
[root@openEuler ~]# echo $LANG #查询当前系统使用的语言
en_US.UTF-8
[root@openEuler ~]# LANG=en_US.UTF-8 #设置为英文
[root@openEuler ~]# LANG=zh_CN.UTF-8 #设置为中文#红帽
export LANG=en_US.UTF-8
export LANG=zh_CN.UTF-8
3.bash shell的命令提示符介绍永久有效:
#欧拉和红帽
[root@openEuler ~]# vi /etc/locale.conf #修改系统语言配置文件
LANG=zh_CN.UTF-8#如果不希望通过重启来生效执行如下命令:
source /etc/locale.conf #当前立即生效#红帽方法2
localectl set-locale LANG="en_US.UTF-8"
localectl set-locale LANG="zh_CN.UTF-8"
5. passwd命令修改密码
passwd 用户名 ——> 修改指定用户的密码
passwd ——>修改当前用户的密码
passwd -l student 锁定用户(原理是在/etc/shadow文件中指定用户的密码前面!!,改乱用户密码使其密码错误无法登录)
passwd -u student 解锁用户(原理就是把前面的两个感叹号去掉,密码恢复回来正确)
验证:
#锁定前、 [root@openEuler ~]# cat /etc/shadow | grep student student:$sm3$Rh4/niRqcozJ7R7/$iAI98uzv9SZn1PlAfqSOz9U244sTKkHKtcuzr/BT98D::0:99999:7:::
#锁定后 [root@openEuler ~]# passwd -l student Locking password for user student. passwd: Success [root@openEuler ~]# cat /etc/shadow | grep student student:!!$sm3$Rh4/niRqcozJ7R7/$iAI98uzv9SZn1PlAfqSOz9U244sTKkHKtcuzr/BT98D::0:99999:7:::
#解锁后 [root@openEuler ~]# passwd -u student Unlocking password for user student. passwd: Success [root@openEuler ~]# cat /etc/shadow | grep student student:$sm3$Rh4/niRqcozJ7R7/$iAI98uzv9SZn1PlAfqSOz9U244sTKkHKtcuzr/BT98D::0:99999:7::
注意:
1.当管理员使用时可以给任何用户修改密码,修改自己包括任何用户密码时无需验证旧密码,因此root用户在生产中通常用来给其他用户重置密码
[root@openEuler ~]# passwd
Changing password for user root.
New password: #直接可以输入新密码
[root@openEuler ~]# passwd student
Changing password for user student.
New password:
2.普通用户使用时只能给自己修改密码,修改密码时需要验证旧密码,修改后的密码与以往的密码不能重复
[student@openEuler ~]$ passwd
Changing password for user student.
Changing password for student.
Current password: #需要先验证旧密码
在openEuler中普通用户严格受到密码规则的制约,所修改的密码,必须包含特殊字符,大小写字母以及数字,由复杂的组合形成密码,而root用户不受到密码规则的制约。
openEuler系统默认在输入密码时不会显示密码,而且也不会用任何字符进行位数反馈。
6. su 切换用户
su - 用户名 ——>切换到指定的用户
root可以切换到任意的用户
普通用户不能su - root 切换到root ,会提示 su:Permission denied
普通用户只能通过sudo切换到root
root 使用su切换到任意用户都不需要验证密码,而普通用户切换到普通用户需要验证用户密码(但是在openEuler中普通之间不能su进行切换,即使输对密码也会提示:su:Permission denied,我们可以通过ssh登录的方式实现普通用户切换,但是在其他发行版中是可以切换的,如红帽、CentOS...)
7. id 查看用户ID信息
id ——>仅查看当前用户的信息
id 用户名 ——>查看指定用户的信息
[root@openEuler ~]# id uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@openEuler ~]# id student uid=1000(student) gid=1000(student) groups=1000(student)
三、openEuler命令行初始体验与快捷键
1. bash shell的命令提示符介绍
[root@openEuler ~]#
root 指的是当前系统登录的用户
@ 是用户名和主机的连接符号
openEuler指的是主机名,如果是一个域名,则此处仅显示主机部分(域名的开头部分openEuler.example)
~ 当前用户所处的位置,我们称其为工作目录(当用户在自己家目录时候,显示" ~ ",在其他位置显示目录名)
# 特权提示符
#号表示当前用户是一个超级管理员(特殊用户)
$号表示当前用户是一个普通用户
2. 命令格式及获取命令帮助的方式
一条完整的Linux命令的组成
命令 [-选项] [参数]
命令:通常指的是某一类一个具体的功能
例如:passwd——>修改密码的功能
选项:选项是对命令功能的补充,对命令的补充
passwd -l 、-u ...
参数:所有一切你要操作的对象都是你的参数
id student ——>那么stduent就是参数
cat /etc/resolv.conf ——>那么/etc/resolv.conf就是参数
2.1 一条命令的格式
命令 选项 参数 之间使用空格分隔(空格做来分隔符)
1.没有参数,命令和选项使用空格分隔 例如: ls -l
2.没有选项,命令和参数使用空格分隔 例如: ls /etc/resolv.conf
3.选项和选项之间使用空格分隔 例如: ls -l -a
4.参数与参数之间也使用空格来分隔 例如:ls /opt/ /var/ /tmp/
5.命令和命令之间使用 ";"分号来分隔,可以一次性执行多条命令
[root@Huawei-node1 ~]# ls -ld /etc/passwd;ls -ld /etc/hostname
-rw-r--r--. 1 root root 1293 Oct 14 09:35 /etc/passwd
-rw-r--r--. 1 root root 13 Oct 25 18:19 /etc/hostname
2.2 命令的选项
-
命令的选项根据写法的不同(格式的不同),我们将其分为两类
-
选项的短格式——> 以"-"开头的格式 (例如:-l -u -k -m -s)
-
选项的长格式——> 以"--" 开头的格式(例如--size --all)
-
-
通常选项的短格式是长格式的缩写,长格式表示一个完整的含义而短格式仅进行缩写,便于命令的执行,但并非所有短格式都有长格式
-
选项的短格式可以通过一个"-"缩写在一起,而长格式不可以
[root@openEuler ~]# ls -a
. .. anaconda-ks.cfg .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc
[root@openEuler ~]# ls --all
. .. anaconda-ks.cfg .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc#验证:选项的短格式可以通过一个"-"缩写在一起,而长格式不可以
[root@openEuler ~]# ls -as
total 36
4 . 4 .. 4 anaconda-ks.cfg 4 .bash_history 4 .bash_logout 4 .bash_profile 4 .bashrc 4 .cshrc 4 .tcshrc
[root@openEuler ~]# ls --allsize
ls: unrecognized option '--allsize'
Try 'ls --help' for more information.
3. bash shell的快捷键
TAB键——>
bash shell重要功能键,tab键可以帮助用户补齐命令、参数、目录、用户名等等各种命令中需要的字符
当第一次按下TAB,没有马上不全说明命令是不唯一的
tab键补齐命令时,尽量找到命令的唯一关键字
上下方向键——>通过上下键可以翻出历史执行过的命令,重复执行
历史记录——>histroy记录曾经执行过的历史命令
! 历史记录的条目——>执行指定的历史记录
[root@openEuler ~]# !2
ls anaconda-ks.cfg
history 2 ——>查看最近的两条历史记录
[root@openEuler ~]# history 2
35 ls
36 history 2
!!(常用) ——>执行上一条历史记录
[root@openEuler ~]# !!
history 2
35 ls
36 history 2
!-3 ——>执行最近的第四条历史记录
[root@Huawei-node1 ~]# !-3
ll
total 8
-rw-------. 1 root root 1083 Sep 27 00:40 anaconda-ks.cfg
-rw-r--r--. 1 root root 42 Oct 14 21:59 file1.txt
!$或esc + . (常用)——>引用上一条命令的最后一个参数
[root@Huawei-node1 ~]# ls -ld /etc/passwd
-rw-r--r--. 1 root root 1293 Oct 14 09:35 /etc/passwd[root@Huawei-node1 ~]# ls -ld !$
ls -ld /etc/passwd
-rw-r--r--. 1 root root 1293 Oct 14 09:35 /etc/passwd
history -c 清除历史记录(注:仅当前终端清除,打开另一个终端窗口又可以查到,并不是永久清除)
命令行行尾和行首的跳转
home或者ctrl+a 跳到行首
end或ctrl+e跳到行尾
清屏的方式
ctrl+l 快捷键快速清屏
clear 命令清屏
4. 获取命令帮助的方式
对于命令永远不要去硬记,那么我们如何知道这个命令的作用和选项如何使用?
4.1 使用whatis 查询一条未知命令的作用
whatis的使用依赖man帮助手册页,而man帮助在openEuler上是不会自动安装的(在其他发行版中,如果你装上对应的工具或是软件,则相应的man的帮助包会自动安装,而openEuler中软件和软件包的帮助包是分开)
以vsftpd的软件为例,在openEuler上
yum install vsftpd -y 安装vsftpd的软件时(如果是其他Linux发行版则会自动安装帮助包)
yum install vsftpd-help -y openEuler 需要再额外单独安装vsftpd的帮助包
如何在openEuler上把所有未知的命令帮助找到?
以一条未知的命令为例 rm:
1. 使用which rm 查询rm命令来自于哪一个文件
[root@openEuler ~]# which rm
/usr/bin/rm2.查询文件路径来自于哪一个软件包
[root@openEuler ~]# rpm -qf /usr/bin/rm
coreutils-9.0-10.oe2203sp2.x86_643.在包名后加上-help就可以得到帮助包名称,就可以使用yum安装该软件包的帮助包
[root@openEuler ~]# yum install coreutils-help -y4.最后就可以用whatis查询rm的作用
[root@openEuler ~]# whatis rm
rm (1) - remove files or directories
4.2 通过帮助文档查询选项及参数的使用与格式
help文档
命令 --help 查询命令本身的帮助信息,可以获取到选项
--help通常是软件的开发者所写的帮助文档
[root@openEuler ~]# ls --help
Usage: ls [OPTION]... [FILE]...——> [] 选项或者是参数使用[]中括号括起来表示该项是可选,非必选
[root@openEuler ~]# useradd --help
Usage: useradd [options] LOGIN——> 大写字母(如上述的LOGIN),参数如果是大写字母(没有中括号)表示一个必选项,参数不能省略
[root@openEuler ~]# passwd --help
Usage: passwd [OPTION...] <accountName>... ——> 表示一个列表,所谓的列表就是可以接多个参数或者是选项
<> ——> 表示一个变量,是必选项,当没有给定所需要的值时,会使用默认值
[root@openEuler ~]# date --help
Usage: date [OPTION]... [+FORMAT]
or: date [-u|--utc|
[+FORMAT] ——> 表示其是一个固定格式,如果是固定格式,一定在帮组文档中有段落解释该格式如何使用
注意:+FORMAT只需要一个固定的加号后续不需要,后面的则为拼接符号,且不能用空格分隔
A|B|C ——> 表示多选一,在列表中选择一个
[MMDDhhmm[[CC]YY][.ss]]——> 固定格式写法,需要借助info查询
man 文档
man是Linux系统的帮助手册页,将常用的指令和帮助信息收纳在man的首页中,man一共有九章
man的手册页位置保存在/usr/share/man
第一章 用户指令 第五章 文件格式 第八章 管理员指令,这三章使用的频率是最高的
一般在help查询不到关键字的使用说明我们才需要去查询man
man的用法
man 指定命令 ——>可以查询指定的命令帮助,按q退出帮助页面
man 编号 指定命令 ——>查询第一章的date
man -f date ——> 查询命令的作用(与whatis一样)
man -k data ——> 根据关键字搜索所在的章节
man的结构解释
[root@openEuler ~]# LANG=zh_CN.UTF-8 #可以临时改成中文便于查看 [root@openEuler ~]# man man 下表显示了手册的章节号及其包含的手册页类型。 1 可执行程序或 shell 命令 #用户相关的命令 2 系统调用(内核提供的函数) 3 库调用(程序库中的函数) #系统支持库函数的帮助 4 特殊文件(通常位于 /dev) #设备的信息帮助 5 文件格式和规范,如 /etc/passwd 6 游戏 7 杂项(包括宏包和规范), 如 man(7),groff(7), man-pages(7) 8 系统管理命令(通常只针对 root 用户) #管理员的命令帮助 9 内核例程 #zh_CN中文翻译章节只有1、5、8,高频使用章节 [root@openEuler ~]# ls /usr/share/man/zh_CN/ man1 man5 man8 #我们使用whatis 查询命令时,输出的编号就是指出了man的那一章 [root@openEuler ~]# whatis date date (1) - print or set the system date and time #可以指定章节号去查指定命令帮组 [root@openEuler ~]# man 1 date
查询帮助练习
以使用date去设置时间为例
[root@Huawei-node1 ~]# date --help
Usage: date [OPTION]... [+FORMAT]
-s, --set=STRING set time described by STRING
#得到设置时间的选项后,继续往下翻查找STRING格式会发现没有说明格式是什么是,年/月/日 ? 还是日/月/年?因此我们就需要去查看man文档
[root@openEuler ~]# man date
#使用man查询date的帮助得到date 设置时间的参数格式
-s, --set=STRING <——可以看到选项后面的参数名称是大写的(建议不要开中文看,否则无法看到单词的大小写),那么通常参数为大写的,man内就一定会有一段解释是说明该参数的格式#往下翻得到我们想要的参数格式说明
DATE STRING
The --date=STRING is a mostly free format human readable date string such
as "Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42" or even
"next Thursday". A date string may contain items indicating calendar
date, time of day, time zone, day of week, relative time, relative date,
and numbers. An empty string indicates the beginning of the day. The
date string format is more complex than is easily documented here but is
fully described in the info documentation.
#对于英文不是很精通的小伙伴们觉得是否可以临时改系统语言为中文看呢?
#设置完成语言后我们使用man date查看发现仍然是英文,那是因为 /usr/share/man/zh_CN/man1中没有date翻译
[root@openEuler ~]# ls /usr/share/man/zh_CN/man1
apropos.1.gz man.1.gz manpath.1.gz whatis.1.gz
lexgrog.1.gz manconv.1.gz man-recode.1.gz zsoelim.1.gz#因此我们只能通过英文去看,只看格式即可,可以看到设置的格式
"Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42"
"Sun, 29 Feb 2004 16:21:42 -0800" #为英文设置格式
"2004-02-29 16:21:42" #中文设置格式#最终成功设置时间
[root@openEuler ~]# date -s "2025-9-27 17:45:00"
Sat Sep 27 05:45:00 PM CST 2025
[root@openEuler ~]# date
Sat Sep 27 05:45:03 PM CST 2025#当我们希望查看时间时,用[+FORMAT]来指定格式,那么[+FORMAT]如何使用?
#通过 man date 可以翻到从如下位置开始
FORMAT controls the output. Interpreted sequences are:[root@openEuler ~]# date +%Y-%m-%d
#而当我们要按照格式:2025-09-27 18:09:05 输出则会报错,因为[+FORMAT]后面没有...不能配置多个参数,没办法用空格分开,必须要合并为一个整体
[root@openEuler ~]# date +%Y-%m-%d %H:%M:%S
date: extra operand ‘%H:%M:%S’#使用“”双引号或者‘’单引号合并为一个整体(也可包括+符号,只要参数是一个整体就可以执行成功)
[root@openEuler ~]# date +"%Y-%m-%d %H:%M:%S"
2025-09-27 18:11:23
info查询
info 是扩展的手册页,里面收纳了常见和不常见的命令帮助,比man更详细,那为什么不直接使用info? 在openEuler中info的帮助较少(未完全开发),目前大部分是man,因此info的帮助查询得到的内容和man是一致的,如果确实是要查询info,需要去其他系统查询比如CentOS
4.3 查询软件的产品文档或者是欧拉的知识库或第三方社区的知识库
如果通过4.1 与4.2 的方法仍然无法了解某个未知命令的使用则可以考虑通过如下方法:
查询产品的文档 /usr/share/doc/软件包名称,可以查询开发者写的文档,目前openEuler帮助较少,红帽比较多
第三方知识库 (查询在线文档或者案例)
红帽的知识库 access.redhat
openEuler的知识库 https://docs.openeuler.openatom
四、文件系统的结构和基础管理操作
1.文件系统结构的对比
windows称为多根多树状的文件系统结构、
在windows中我们将一个盘符(分区)称为一棵目录树,在这个目录树上会产生很多的枝叶,枝叶指的就是各种文件的目录,因此我们将文件系统称为树状的文件系统,将windows称为多根多树状的文件系统结构,是因为在windows中每一个分区都是独立的,也就是每一个分区都是一颗单独的目录树。
Linux称为单根倒树状的文件系统结构
在Linux中根分区有且仅有一个,根( “ / ” 称为根目录或者是根分区 )目录是所有文件开始的目录(是最顶层的层级结构),因此将Linux的文件系统结构称为单根倒树状
/ 即是Linux中的根目录(根分区);也可以是Linux中路径的分隔符
cd /etc/sysconfig/network-scripts
/ 根分区 是文件最开始的位置
/ 路径分隔符
2.Linux中文件系统目录的作用
/root 表示超级管理员root用户的家目录,存放用户相关的数据,例如用户的桌面文件、下载文件,以及自定义的软件配置文件
/home/username 表示普通用户的家目录,以用户名命名,例如/home/zhangsan 表示张三的家目录
/usr 共享的库(.so,类似windows的dll,不要乱删),依赖的文件、自定义安装的软件都存放在该目录下
/usr/bin 存放用户的指令,例如/usr/bin/id student与id student执行的结果是一样的
/usr/sbin 存放管理员的指令,比如useradd
/usr/local 自定义安装软件的位置/etc 所有系统相关的配置绝大多数都存放在该目录(类似于C盘下的windows目录),包括常用发服务配置文件如网卡配置、主机名...
/var 服务的数据和系统的日志就保存在该目录下
/var/log 安装软件包日志、系统开机日志...
/tmp 系统的临时目录,所有的用户都可以将自己的临时文件都可以存放在该路径下,而不用担心权限不够/boot 系统的内核和启动引导文件都存放在这个目录下,
vmlinuz-5.10.0-153.12.0.92.oe2203sp2.x86_64就是托瓦兹写的内核
/boot/grub2 就是启动引导程序的配置目录/dev 系统中所有设备接口(帮助我们调度设备的接口文件)文件都存放在该目录
/proc 存放的是系统的进程的运行状态(以进程号命名的文件目录) 不要存放业务数据(重启时会删除)
/sys 存放系统的运行状态 不要存放业务数据(重启时会删除)
3.Linux文件系统的约束
1.文件和目录的命名不要超过255个字符
2.除了路径分隔符(/)以外,所有的字符都可以作为文件名,但不建议将特殊字符作为文件名
# 如果非要使用字符命名,需要用单引号引起来(去掉字符的特殊意义)
[root@openEuler ~]# touch '*'
[root@openEuler ~]# ll
total 4
-rw-r--r--. 1 root root 0 Sep 28 20:37 '*'
3.在Linux中文件和目录的名称严格区分大小写(同时Linux的命令也是严格区分大小写的)
windows文件和目录以及命令都不区分大小写
4.文件的路径
在系统中找到文件有两个方式
相对路径:
相对到底是相对谁而言?
相对路径是相对当前目录而言,所要访问的目录是当前目录的子目录,因此可以不用以根开头
1.不以根开头的路径,我们称为相对路径
2.相对路径只能在特定位置被使用或是访问到文件
3.相对于当前工作目录的子目录路径
绝对路径(初学者建议使用绝对路径):
1.必须以/根开头的路径,称为绝对路径
2.绝对路径在系统的任意位置都可以访问到文件(或是引用文件)
3.同时绝对路径是文件的全路径
5.文件管理的基本命令
cd 改变工作目录
pwd 打印当前的工作目录
用于当前工作目录层次较多、需要复制路径,bash shell的命令提示符只显示当前工作目录名称而不显示所有层级
cd /etc ——>进入到相对或者绝对的工作的目录中
cd/cd ~ ——> 不接任何路径,返回当前用户的家目录
cd .. ——>回退到上一级目录
cd - ——> 回退到上一次目录
cd ~ username ——> 接上指定用户名,直接回退到指定用户的家目录
[root@openEuler ~]# cd /etc/sysconfig/network-scripts/
[root@openEuler network-scripts]# cd ..
[root@openEuler sysconfig]# cd -
/etc/sysconfig/network-scripts
[root@openEuler network-scripts]#
ls 列出当前目录下的文件和子目录
ls ——>列出当前目录下的文件和子目录
ls /var ——>列出指定目录下的文件和子目录
ls -a ——>列出当前目录下的文件和子目录包括隐藏文件
ls -l ——>查看文件的长格式(详细信息)
ls -ld /var ——>查看指定目录本身的长格式(详细信息)
ls -R ——>以目录树的形式查看目录的层级结构(递归)
ls -lh ——>以kB、MB、GB单位显示文件内容大小(必须要结合-l使用)
[root@openEuler ~]# ls /var/
adm crash empty games lib lock mail opt run tmp
cache db ftp kerberos local log nis preserve spool yp
[root@openEuler ~]# ls
anaconda-ks.cfg
[root@openEuler ~]# ls -l
total 4
-rw-------. 1 root root 1083 Sep 27 00:40 anaconda-ks.cfg
[root@openEuler ~]# ls /var/
adm crash empty games lib lock mail opt run tmp
cache db ftp kerberos local log nis preserve spool yp
[root@openEuler ~]# ls -a
. anaconda-ks.cfg .bash_logout .bashrc .lesshst
.. .bash_history .bash_profile .cshrc .tcshrc
[root@openEuler etc]# ls -ld /etc/
drwxr-xr-x. 82 root root 4096 Sep 28 00:52 /etc/
[root@openEuler etc]# ls -R /home/
/home/:
student/home/student:
[root@openEuler etc]# ls -lh /var/
total 68K
drwxr-xr-x. 2 root root 4.0K May 27 2023 adm
cp 拷贝文件和目录
cp 源文件 目标文件
源文件拷贝到目标路径时,如果目标路径下不存在该文件则直接拷贝
源文件拷贝到目标路径时,如果目标路径下存在该文件则会提示是否覆盖,按Y则覆盖(危险)
源文件拷贝到目标文件时,目标路径下指定的文件名不存在,且指定了文件名,则拷贝时拷贝文件并重命名
cp -r ——>拷贝目录(不加-r,直接则提示:cp: -r not specified; omitting directory 'xxx')
cp -a ——>拷贝文件包括属性、同文件的权限一并拷贝(建议在生产环境中备份配置文件时使用)
cp -p ——>拷贝文件时,仅拷贝权限
[root@Huawei-node2 ~]# ll
total 16
-rw-------. 1 root root 1083 Sep 27 00:40 anaconda-ks.cfg
-rw-r--r--. 1 root root 42 Oct 14 21:59 file1.txt
drwxr-xr-x. 2 root root 4096 Oct 27 21:08 files
drwxr-xr-x. 2 root root 4096 Oct 27 21:09 files2
[root@Huawei-node2 ~]# cp files file2
cp: -r not specified; omitting directory 'files'#查看bob文件,可以看到文件的所属用户及组都是bob
[root@Huawei-node2 tmp]# ll | grep bob
-rw-rw-r--. 1 bob bob 0 Oct 27 21:22 bob.txt#如果我们不加任何选项进行拷贝,可以看到文件的所属用户和组就更改为了root,也就是权限进行了变动
[root@Huawei-node2 tmp]# cp bob.txt bob.txt.bak
[root@Huawei-node2 tmp]# ll | grep bob
-rw-rw-r--. 1 bob bob 0 Oct 27 21:22 bob.txt
-rw-r--r--. 1 root root 0 Oct 27 21:24 bob.txt.bak#而如果我们加上了选项 -a ,则保持权限一同进行拷贝/备份,因此我们一般在生产环境如果要对某个用户的文件进行备份,记得要加上-a选项
[root@Huawei-node2 tmp]# cp -a bob.txt bob2.txt.bak
[root@Huawei-node2 tmp]# ll | grep bob
-rw-rw-r--. 1 bob bob 0 Oct 27 21:22 bob2.txt.bak
-rw-rw-r--. 1 bob bob 0 Oct 27 21:22 bob.txt
-rw-r--r--. 1 root root 0 Oct 27 21:24 bob.txt.bak
mv 移动文件目录或者重命名
mv 源文件 目标文件
如果目标文件不存在,则源文件直接移动到目标文件位置
如果目标文件存在,则提示是否覆盖,按Y则覆盖(危险)
如果目标文件不存在,但是用户指定了文件、目录名则拷贝文件或目录并重命名
mv 什么时候移动文件?,什么时候重命名?
如果源文件和目标在同一个路径下,则是重命名,反正是移动文件
touch 创建文件
touch 文件名或路径+文件名
当touch后的文件名不存在,则创建一个空白文件
[root@Huawei-node2 ~]# touch a.txt
[root@Huawei-node2 ~]# ll
total 4
-rw-------. 1 root root 1083 Sep 27 00:40 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 Oct 27 21:44 a.txt
当文件存在时,则更新时间戳
touch -ad ——>修改A时间戳
touch -md ——>修改M时间戳
文件的时间戳:
注意:openEuler会记录文件的创建时间(其他发行版系统不会),在tmp目录下创建文件不会记录
#文件在操作系统中通常有四个时间
[root@openEuler ~]# stat nhh
File: nhh
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 8,3 Inode: 131083 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2025-09-28 22:42:29.371561320 +0800
Modify: 2025-09-28 22:42:29.371561320 +0800
Change: 2025-09-28 22:42:29.371561320 +0800
Birth: 2025-09-28 22:42:29.371561320 +0800Access Time ——>文件最后一次被访问的时间
Modify Time ——>文件最后一次被修改(内容)的时间
Change Time ——>文件最后一次被改变(属性)的时间
Birth Time ——>文件的创建时间一般来讲修改了文件内容,M和C time都会改变,M改变的是内容,C改变的是文件大小
时间戳的应用:
文件防篡改,Aide入侵检测就是通过时间戳来实现的
文件自动备份,第一次可以做全量备份,而后通过shell脚本去判断时间戳自动的实现增量备份。
rm 删除文件或目录
rm 删除文件
注意:在Linux中没有回收站机制,文件删除是无法被找回的(危险)
rm filename 删除指定文件,执行rm 默认等同于执行rm -i
rm -i filename 在删除文件时会询问用户是否确认删除(推荐初学者使用,以免删错)
rm -f filename 强制删除且不会提示,通常不建议对单个文件使用,而是批量删除时使用
rm -r dir name 递归删除目录(先将目录中的内容删除,然后再删除目录本身,前提目录内是空白的)
rm -rf 递归强制删除(非常危险,使用不当可以将系统删除,慎用!!! 删除时一定要看清楚,确保文件无用再删除)
rmdir 专门用来删除目录,特别安全,只能删除空白目录
mkdir 创建目录
mkdir 目录的路径 ——>直接创建目录
mkdir -p ——> 有层级的目录路径 递归创建目录(当上一级目录不存在时,直接创建完整的目录结构)
file 查看文件的类型
file filename——>查看指定对象类型
在Linux中文件的类型是不由文件的后缀名决定,文件的后缀名在Linux中没有意义
同时在Linux中以 . 点开头的文件都是隐藏文件
五、用户与用户组的管理
1.Linux的用户管理
用户的分类的依据:1.是根据用户的用途 、2.根据用户的UID
超级管理员用户(特权用户) uid 为0-200的用户
系统的内置用户(服务用户) uid 201-999是服务用户
人为创建的用户(普通用户) uid 1000-60000(创建用户的上限)是普通用户#参考文件路径
[root@openEuler ~]# cat /etc/login.defs
2.用户的UID与用户名的映射文件
/etc/passwd 保存用户名与UID的映射关系,每一行就是一个用户信息,因此我们也可以通过行数得知该系统有多少个用户
#/etc/passwd文件中以root信息这一行举例
root:x:0:0:root:/root:/bin/bash
root: 表示的是用户名
X: 密码占位符,占位符指的是在该用户登录的时候是否需要验证密码,如果x不存在则不验证密码直接可以登录
0: 第一个0表示的是该用户的UID,也就是user id
0: 第二个0表示的是该用户的GID,也就是所属的组(私有组)的group id
root: 指的是用户的描述信息,通常在GUI界面上欢迎屏幕上显示
/root: 指的是用户的家目录
/bin/bash: 指的是用户登录操作系统后执行的第一个程序,通常是shell程序,因此也称该栏位为登录shell, 如果该项是/bin/bash 表示该用户可以登录,如果该项是/sbin/nologin表示该用户不能登录.
在操作系统中,用户不能登录不代表不能用;该用户无法登录操作系统,可以作为服务的运行用户,举例vsftpd的服务,可以交给ftp的用户来运行,如果将来该服务发生缺陷导致被入侵攻击,攻击者也只会拿到ftp这个用户的权限,而不会得到root用户的权限,无法登录则无法操作,因此通过服务用户来运行服务,可以极大的保证服务的运行安全。
3.用户组
在系统中每一个用户在创建之初都需要指定一个用户组,如果创建用户时,没有指定组,则系统创建与用户名同名的组,并将该用户加入到该组。
在Linux中组的分类:
私有组(属组):私有组是用户必须存在且唯一可以拥有一个的组;也就是在创建用户时指定的组。
附加组(公共组):用户可以加入到多个附加组,继承组的权限,但是仅能有一个私有组
组与GID的映射文件保存在/etc/group文件中(每一行都是一个组信息)
root:x:0:
root: 组名
x: 组的密码在占位符(组登录时是否验证密码)
0:组的GID
最后一个栏位:表示组内的用户(不是空白;如果某个组是用户的私有组,则该用户不会出现在组内,因此在组内的用户都是将该组作为用户的附加组)
只有root在该组内,因此显示空白[root@openEuler ~]# id root
uid=0(root) gid=0(root) groups=0(root)
gid显示的是用户的私有组
group显示的是用户的附加组
gpasswd 组名 ——> 给组设置密码
newgrp 组名 ——>切换到指定的组,如果给组设置了密码,那么切换组则需要输入密码
4.用户的密码
用户的密码保存在/etc/shadow文件中
root:$6$Ib/qK3sFl8NdWc.F$..5iFrim2/u6Y.3JBpc77jkCxKyUv6.Y8H6rpd8bgjLjgX52KacVewuu46yhGQuwnaV5g.ew38LcTNju7me5q.:20360:0:99999:7:2:19998:
root 用户名
$6$Ib/qK3sF... 用户密码(密文)
$6$ 加密方式
$6$表示使用sha512算法进行加密(主流发行版本默认使用该方式)
$5$表示使用sha256算法进行加密
$1$使用MD5加密
$sm3$或$y$ 使用sm3进行加密
!/* 表示用户从来没有设置过密码
20360:用户上一次修改密码的时间,表示的是从1970-01-01经过20360的日期
0 : 密码的最短有效期,0表示没有时间限制,最少密码可以使用多少天
99999:密码的最长有效期,99999表示没有限制,一直有效,最长密码可以使用多少天,通常我们只会设置(设最短或最长有效期),设置密码的最长有效期时间
7:表示密码到期前的提醒天数(警告天数)
2:密码到期后的锁定天数(密码到期后多给两天的缓冲期,如果仍然不改则无法登录,这两天内登录系统都会强制改密码)
19998:密码的失效时间,指定也是从1970-01-01经过19998天的日期
可以通过openssl passwd [选项] 的方式生成密码
[root@openEuler ~]# openssl passwd -5 Huawei@123
$5$NbHvVGmo83AV4SWS$gc0L/iUwIR70FC3oQSKmf/DEVHYLih019obLGy7jnF9
前面提到如果密码的前面有!表示该用户已被锁定,在Linux中所谓的锁定用户就是将用户密码改得不正确,因此用户不能登录成功;但仍然可以通过root使用su 切换到该用户(因为root切换到任何用户是不需要验证密码的)
[root@openEuler ~]# usermod -L alice
[root@openEuler ~]# cat /etc/shadow |grep alice
alice:!$6$N44XgsGerSq/KSSt$xvKy77.CjkKvRrKJ6WUbvUFLH1d5ZTlyQ6NEly.3MtL73AOE57IrEDAfGL.FfGNVVfkkWdejZv2qUM1ABW4ab1:20360:0:99999:7:::[root@openEuler ~]# su alice
Welcome to 5.10.0-153.12.0.92.oe2203sp2.x86_64System information as of time: Mon Sep 29 09:56:16 PM CST 2025
System load: 0.00
Processes: 194
Memory used: 6.1%
Swap used: 0%
Usage On: 9%
IP address: 192.168.180.133
Users online: 2
To run a command as administrator(user "root"),use "sudo <command>".
[alice@openEuler root]$
我们可以使用date计算/etc/shadow涉及的密码时间,如计算出上一次修改密码的时间
date +%F -d '1970-01-01 20360days'
#计算并显示 “1970 年 1 月 1 日加上 20360 天” 之后的日期
[root@openEuler ~]# date +%F -d '1970-01-01 20360days'
2025-09-29
5.用户与组的常用管理方式
5.1 用户的管理命令
创建用户 useradd
useradd --help ——>通过帮助文档查看useradd选项
useradd -u ——>给用户设置uid
useradd -g ——>给用户设置gid(私有组)
useradd -G ——>设置groupsid(附加组)
useradd -c "XXX" ——>设置描述信息
useradd -d ——>设置用户的家目录
useradd -s ——>指定登录的shell
思考:
在/etc/passwd文件中用户的UID能否重复?
uid 可以重复,永远记住在Linux中用户的名字就是代号,系统不看用户名;而是根据UID来识别用户,因此如果两个用户使用同一个UID,则两个用户是同一个人
-o 在创建用户时允许用户UID重复
在/etc/passwd文件中用户的UID是如何分配?
根据/etc/passwd文件中,最大的UID进行累加,也就是passwd文件中的已经跳过的UID,不会被使用,例如UID为2000,则下一个UID为2001
1.系统中有很多服务保留用户,而这些保留用户的文件都是设置的固定UID,那么此时就会出现一个很严重的安全问题:
a.假设我们给某个文件设置了权限只能提供给user1用户使用,而该用户的UID为3005
b.将来我们安装了某一个软件或服务,而服务会自动创建服务运行用户,UID是固定的正好与3005重复,那么该服务创建的用户就可以完全接管user1的所有权限。
2.在生产中需要保证,已经分配出去的UID;无论该UID对应的用户是否已经删除,都尽量不要将该UID再次分配出去
a.又或者user1创建的时候UID3005,那么只要文件所属用户是user1的,那么UID都是3005,而如果user1用户被删除了,UID回收,但是属于user1的文件没有被删除,此时创建user2,那么根据UID分配原则,user2分配到UID是3005,那么就可以接管原来user1所有的文件,因此不要把分配过的UID再次分配出去
#我们配置user2的uid与user1重复
[root@openEuler ~]# usermod -o -u 2000 user2
[root@openEuler ~]# grep user /etc/passwd
user1:x:2000:2000::/home/student/:/sbin/nologin
user2:x:2000:2002::/home/user2:/bin/bash#此时我们切换到user2发现切换的是user1,是因为由于UID重复了,但是Linux在读取/etc/passwd时,是按照从上到下顺序读取,当读取到2000第一次,正好是user1,因此切换的是user1,那么由此我们得出结论,Linux只认UID,不认用户名,并且存在安全隐患
[root@openEuler ~]# su user2
Welcome to 5.10.0-153.12.0.92.oe2203sp2.x86_64System information as of time: Mon Sep 29 11:33:48 PM CST 2025
System load: 0.00
Processes: 192
Memory used: 6.1%
Swap used: 0%
Usage On: 9%
IP address: 192.168.180.133
Users online: 2
To run a command as administrator(user "root"),use "sudo <command>".
[user1@openEuler root]$#我们删除user3后,创建user4分配到了user3曾经分配到的uid,如果删除user3时,未删除干净,比如保留了家目录,那么我们知道Linux只认uid,此时user4这个用户就可以获得user3的家目录的权限
[root@openEuler ~]# useradd user3
[root@openEuler ~]# grep user3 /etc/passwd
user3:x:1002:1002::/home/user3:/bin/bash
[root@openEuler ~]# userdel user3
[root@openEuler ~]# useradd user4
[root@openEuler ~]# grep user4 /etc/passwd
user4:x:1002:1002::/home/user4:/bin/bash#我们可以看到user3创建用户时自动创建的目录对于其他人是没有权限的,但是由于user4与user3的UID相同,那么user4就可以继承user3的权限进入到user3的家目录,因此存在安全隐患
[user4@Huawei-node2 home]$ ll
total 12
drwx------. 2 bob bob 4096 Oct 27 21:19 bob
drwx------. 2 user4 user4 4096 Oct 30 20:43 user3[user4@Huawei-node2 user3]$ pwd
/home/user3
[user4@Huawei-node2 user3]$ ll
total 0
-rw-r--r--. 1 user4 user4 0 Oct 30 20:43 hello.txt
修改用户 usermod
usermod --help ——> 通过帮助文档查看选项
usermod -l ——> 修改用户名(用户名只是给代号因此可以修改)
usermod -u ——> 修改uid
usermod -g ——> 修改私有组gid
usermod -G ——> 修改附加组groupsid
usermod -c ——> 修改描述信息
usermod -md ——> 修改用户家目录(-d是修改配置文件,-m是移动文件,因此通常是-md一起使用)
usermod -s ——> 修改登录shell
usermod -p ——> 设置/修改用户密码
#usermod仅配置文件内的家目录栏修改,实际上未改变家目录
[root@openEuler /]# usermod -d /home/zhangsan alice
[root@openEuler /]# grep alice /etc/passwd
alice:x:1001:2001:I am alice:/home/zhangsan:/bin/bash#去用ls验证,/etc/passwd配置文件中显示的zhangsan家目录是/home/zhangsan,实际上是没有张三的这个家目录,同时在原本的alice家目录也是有文件的我们修改配置文件没有把家目录的文件一起进行移动,因此我们验证出usermod -d 只是修改了配置文件。
[root@openEuler /]# ls /home/
alice student user1 user2 user3 user4#恢复回原本的家目录
[root@openEuler /]# usermod -d /home/alice alice
[root@openEuler /]# grep alice /etc/passwd
alice:x:1001:2001:I am alice:/home/alice:/bin/bash#这回我们加上-m再进行验证就可以原本alice的家目录下的隐藏文件也一并移动到了修改后的指定家目录
[root@openEuler /]# usermod -md /home/zhangsan alice
[root@openEuler /]# grep alice /etc/passwd
alice:x:1001:2001:I am alice:/home/zhangsan:/bin/bash
[root@openEuler /]# ls -a /home/zhangsan/
. .. .bash_history .bash_logout .bash_profile .bashrc
#修改密码补充:设置密码时一定要加密后的密文形式,否则无法登录成功(进行登录时即使密码输入正确依然无法登录)
[root@openEuler ~]# usermod -p 'Huawei@123' bob
[root@openEuler ~]# grep bob /etc/shadow
bob:Huawei@123:20364:0:99999:7:::#可以通过openssl去对明文进行加密而后再设置用户密码
[root@openEuler ~]# openssl passwd -6 Huawei@123
$6$QAD7tnAH8l0pK2RE$0t10aHzVkNHqXgPoEgkMsacnWNODEmLst26XR4Paj01wqWi8CwkMGUSCD5XnyfWNDZvW2DSxmQPKi.XjsuNzL1
[root@openEuler ~]# usermod -p '$6$QAD7tnAH8l0pK2RE$0t10aHzVkNHqXgPoEgkMsacnWNODEmLst26XR4Paj01wqWi8CwkMGUSCD5XnyfWNDZvW2DSxmQPKi.XjsuNzL1' bob
[root@openEuler ~]# grep bob /etc/shadow
bob:$6$QAD7tnAH8l0pK2RE$0t10aHzVkNHqXgPoEgkMsacnWNODEmLst26XR4Paj01wqWi8CwkMGUSCD5XnyfWNDZvW2DSxmQPKi.XjsuNzL1:20364:0:99999:7:::
删除用户 userdel
userdel 用户名
与用户相关的文件(当创建用户时会自动生成以下文件):
/etc/passwd 用户的UID与用户名的映射关系文件
/etc/shadow 用户的密码文件
/etc/group 用户组文件
/etc/gshadow/ 用户组密码文件
/home/username 用户的加目录
/vat/spool/mail/username 用户的邮箱文件
我们去使用userdel 用户名 去删除用户,仅删掉在配置文件passwd、shadow、group、gshadowm中关于用户的信息,用户的家目录和邮箱文件是没有被删除的,因此使用userdel 删除用户后再创建同名的用户,会导致用户的家目录和邮箱文件冲突
还会导致前面提到的UID重复发生安全隐患的问题,假设我们误删错了用户UID 1000,用户的家目录没有删掉,那么当我们使用useradd 创建回该用户后UID重新分配,那原本的家目录UID与恢复后的用户的UID不一致,就会导致恢复后的用户无权限访问家目录。
userdel -r 用户名 ——> 干净的删除用户,连同用户家目录和邮箱一并删除
5.2 组的管理命令
创建组 groupadd
groupadd 组名 ——>创建组
groupadd -g ——> 指定组的gid
[root@openEuler ~]# groupadd itgroup
[root@openEuler ~]# grep itgroup /etc/group
itgroup:x:2002:[root@openEuler ~]# groupadd -g 5008 sagroup
[root@openEuler ~]# grep sagroup /etc/group
sagroup:x:5008:
修改组 groupmod
groupmod -g ——>修改组的gid
groupmod -n newgroupname oldgroupname ——> 修改组的名称
groupmod -p ——>设置组密码
[root@openEuler ~]# groupmod -g 5009 sagroup
[root@openEuler ~]# grep sagroup /etc/group
sagroup:x:5009:[root@openEuler ~]# groupmod -n cloudgroup sagroup
[root@openEuler ~]# grep cloudgroup /etc/group
cloudgroup:x:5009:#注意:与用户设置密码一样,组密码需要指定的密码是加密后的才行,如果传入的密码是明文的,当用户希望切换当前自身的生效组去继承权限时,即使密码输入正确也会提示:Invalid password.
[root@openEuler ~]# groupmod -p openEuler cloudgroup
[root@openEuler ~]# grep cloudgroup /etc/gshadow
cloudgroup:openEuler::验证:
1.尝试切换当前用户的有效组
[bob@Huawei-node2 ~]$ newgrp cloudgroup
Password:
Invalid password.2.使用密文设置密码
[root@openEuler ~]# openssl passwd -6 openEuler
$6$WD9deCpGehqQ3HUe$bEwdzkqegRZ4gOfpRvNohL5ffmjMNZhaV93HZ/zUKJm4PdXk/9yyoagibCDpqQS6JN6henNsB8zWzWabNVQmn/
[root@openEuler ~]# groupmod -p '$6$WD9deCpGehqQ3HUe$bEwdzkqegRZ4gOfpRvNohL5ffmjMNZhaV93HZ/zUKJm4PdXk/9yyoagibCDpqQS6JN6henNsB8zWzWabNVQmn/' cloudgroup
[root@openEuler ~]# grep cloudgroup /etc/gshadow
cloudgroup:$6$WD9deCpGehqQ3HUe$bEwdzkqegRZ4gOfpRvNohL5ffmjMNZhaV93HZ/zUKJm4PdXk/9yyoagibCDpqQS6JN6henNsB8zWzWabNVQmn/::3.可以看到已经切换成功,此时bob就可以继承cloudgroup组权限
[bob@Huawei-node2 root]$ newgrp cloudgroup
Password:
Welcome to 5.10.0-153.12.0.92.oe2203sp2.x86_64System information as of time: Thu Nov 6 10:38:00 PM CST 2025
System load: 0.00
Processes: 195
Memory used: 5.8%
Swap used: 0%
Usage On: 10%
IP address: 192.168.180.136
Users online: 1
To run a command as administrator(user "root"),use "sudo <command>".
[bob@Huawei-node2 root]$ id
uid=1000(bob) gid=1005(cloudgroup) groups=1005(cloudgroup),1000(bob) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
删除组 groupdel
groupdel 组名 ——>删除组
注意:删除组时,如果该组作为某些用户的私有组,要先清空组内的用户,才可以被删除
#由于当前it01这个组作为bob的私有组,因此无法删除该组
[root@openEuler ~]# id bob
uid=1000(bob) gid=1001(it01) groups=1001(it01),0(root)
[root@openEuler ~]# groupdel it01
groupdel: cannot remove the primary group of user 'bob'#依然存在
[root@Huawei-node2 ~]# grep it01 /etc/group
it01:x:1004:
#我们更改bob的私有组为bob(也就是将it01这个组中名为bob用户移除),该组才可以被删除
[root@openEuler ~]# usermod -g bob bob
[root@openEuler ~]# id bob
uid=1000(bob) gid=1000(bob) groups=1000(bob),0(root)[root@Huawei-node2 ~]# groupdel it01
#可以看到etc/group文件中已经没有了it01组,删除成功
[root@Huawei-node2 ~]# grep it01 /etc/group
[root@Huawei-node2 ~]#
5.3 用户与组的管理命令
groupmems 管理组内的用户(仅root使用)
-a ——> 向组内添加用户(只能添加单个用户,不支持批量添加)
-g ——> 指定组名
-d ——> 删除用户
-l ——> 列出组内用户
#向it01组添加user01-03
[root@openEuler ~]# groupmems -a user01 -g it01
[root@openEuler ~]# groupmems -a user02 -g it01
[root@openEuler ~]# groupmems -a user03 -g it01
[root@openEuler ~]# groupmems -l -g it01
user01 user02 user03#从it01组中移除user01
[root@openEuler ~]# groupmems -d user01 -g it01
[root@openEuler ~]# groupmems -l -g it01
user02 user03
gpasswd 管理组(root和非root使用)
-M ——> 指定用户列表(可实现批量添加用户)
-a ——> 向组内添加用户(单个添加)
-d ——> 向组内删除用户(单个添加)
-A ——> 设置组的管理员(组的管理员可以将用户加入到组)
#向it01组批量添加用户user01-03
[root@openEuler ~]# gpasswd -M user02,user03 it01
[root@openEuler ~]# groupmems -l -g it01
user02 user03
[root@openEuler ~]# gpasswd -d user02 it01
Removing user user02 from group it01
[root@openEuler ~]# gpasswd -d user03 it01
Removing user user03 from group it01
[root@openEuler ~]# groupmems -l -g it01
[root@openEuler ~]#
chage 设置用户密码信息
-m ——> 设置最短有效期
-M ——> 最长有效期
-W ——> 警告天数
[root@openEuler ~]# chage user01
Changing the aging information for user01
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: 3 #密码最短
Maximum Password Age [99999]: 50
Last Password Change (YYYY-MM-DD) [2025-10-03]:
Password Expiration Warning [7]: 5
Password Inactive [-1]: 3
Account Expiration Date (YYYY-MM-DD) [-1]:
#最小密码使用期限(Minimum Password Age):设置密码创建后至少需使用多久才能修改(默认 0 天表示可随时修改)。
#最大密码使用期限(Maximum Password Age):设置密码有效期,到期后必须修改(默认 99999 天表示几乎永久有效)。
#上次密码修改时间:系统记录的密码最近一次修改日期,按回车键会沿用默认值。
#密码过期警告时间(Password Expiration Warning):密码到期前多久开始提醒用户修改(默认 7 天)。
#密码失效时间(Password Inactive):密码过期后,账户仍可登录的宽限期(默认 -1 表示密码过期后账户立即锁定)。
#账户过期日期(Account Expiration Date):设置账户整体失效的日期(默认 -1 表示账户永久有效,需按 YYYY-MM-DD 格式输入日期)。[root@openEuler ~]# grep user01 /etc/shadow
user01:!:20364:3:50:5:3::
六、文件的权限
在Linux中每个文件都有一个UID和GID,用户根据文件的UID和GID来判断自己是否有相应的访问权限,系统是根据文件的UID和GID以及用户的UID和GID来决定用户的访问权限
1.文件权限的匹配原则
假设一个文件的UID为1000,GID为2000,则用户访问文件时按照如下顺序匹配:
1.用户的UID匹配文件的UID——>则以文件的UID身份(文件的拥有人)的权限进行访问
2.用户的GID匹配文件的GID(UID匹配不成功)——>则以文件的GID身份(文件的拥有组)的权限进行访问。
3.用户的UID和GID均无法匹配到文件的UID和GID,则以文件拥有人和拥有组之外other的身份(其他人的权限)进行访问
UID——> GID——> other
因此在系统中,查看文件的权限要看文件的UID、GID、other
UID——> 文件的拥有人(如果UID与系统中用户的UID一致,则显示用户名,否则显示UID,因此称为拥有人)
GID——> 文件的拥有组(文件的GID与系统中组的GID一致,则显示为组名,否则显示GID,称为拥有组)
Other——>UID和GID与当前登录用户都不符合,则称为other(其他人)
以uid验证验证:
#如果UID与系统中用户的UID一致
[root@openEuler ~]# ll
-rw-r--r--. 1 root root 0 Nov 12 16:47 hello#如果UID与系统中用户的UID不一致显示UID
[root@openEuler ~]# chown 1003:0 hello
[root@openEuler ~]# ll
-rw-r--r--. 1 1003 root 0 Nov 12 16:47 hello
查看文件权限方法:
ls -l 文件名 ——> 查看文件
ls -d 目录名 ——> 查看目录
[root@openEuler opt]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 4 02:19 zhangsan.txt
-:(第一个横杠) 表示文件的类型
-:表示普通文件
d:表示目录文件
l:字符文件
b:块设备文件
......
rw-:文件的拥有人权限
r--:文件的拥有组权限
r--:文件的其他人权限
.: seLinux的安全标记,表示文件受到seLinux的保护
1: 表示文件的硬链接数,指定是相同的数据内容(inode)的文件在系统中有多少份(即使文件名不一样,但是内容一样)
root:文件的UID,也就是拥有人(如果UID与系统中用户的UID一致,则显示用户名否则显示UID数)
root:文件的GID,也就是拥有组(文件的GID与系统中组的GID一致,则显示为组名否则显示GID数)
0:表示文件的大小,如果为0表示空文件
Oct 4 02:29: 文件最后一次被修改的时间
zhangsan.txt:文件名
2.文件权限详解
权限对文件和目录的作用:
| 权限类型 | 文件 | 目录 |
| R 读 | 可以读取文件内容 | 可以查看目录下的文件和子目录 |
| W 写 | 修改或编辑文件的内容 | 可以在目录下创建、删除文件和子目录(不包括进入到目录) |
| X 执行 | 可以将文件作为命令、脚本执行 | 可以进入到目录下 |
| - 无权限 | 无权限 | 无权限 |
注意:在Linux中,一个目录要想有意义,最少需要有rx的权限,x表示目录可以进入到该目录下,而如果只有rw的权限是没办法进入到目录下,无法进入到目录下也就无法创建文件
3.文件赋权的方式
通过chmod修改文件或目录的权限
3.1字符的方式赋权
拥有人——>u,拥有组——>g,其他人——>o,u+g+o=a(all)
加减赋权(推荐工作使用):
chmod u+r/w/x u-r/w/x filename
chmod u+r,g+w,o+x filename
chmod ugo+r filename
chmod a+r filename
chmod +r filename (r和x默认给所有人加,而w仅给拥有人加,如果给所有人加则任何人都可以修改该文件是不安全的)
chmod u-w,g-x,o-r filename
chmod -R 递归设置权限
#练习:初始hello文件没有任何权限
[root@openEuler opt]# ll
total 0
----------. 1 root root 0 Nov 24 10:34 hello.txt
#给文件拥有人增加读写权限、
[root@openEuler opt]# chmod u+rw hello.txt
[root@openEuler opt]# ll
total 0
-rw-------. 1 root root 0 Nov 24 10:34 hello.txt#同时给文件的拥有组与其他人增加读写权限
[root@openEuler opt]# chmod go+rw hello.txt
[root@openEuler opt]# ll
total 0
-rw-rw-rw-. 1 root root 0 Nov 24 10:34 hello.txt
#同时给拥有人、拥有组、其他人增加执行权限
[root@openEuler opt]# chmod a+x hello.txt
[root@openEuler opt]# ll
total 0
-rwxrwxrwx. 1 root root 0 Nov 24 10:34 hello.txt
#给拥有人减执行权限,给拥有组和其他人减掉写和执行权限
[root@openEuler opt]# chmod u-x,go-wx hello.txt
[root@openEuler opt]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 24 10:34 hello.txt
精确赋权:
chmod u=r,g=w,o=x filename
精确赋权会覆盖权限,一旦权限设置错误,则很难找回,因此“=”号是精确指定每个栏位的权限
+/-都是在原文件权限基础上追加或减少权限,如果权限设置错误,则可以通过加减的方式还原。
3.2数字的方式赋权
R(4)、W(2)、X(1)——>由二进制转换为十进制得来
在对应栏位上为1则表示有权限,0为无权限
| R | W | X | |
| 1 | 0 | 0 | 4 |
| 0 | 1 | 0 | 2 |
| 0 | 0 | 1 | 1 |
文件的权限数字 4+2+1(u读写执行权限) 4+2+1(g读写执行权限) 4+2+1(o读写执行权限)——>通常使用3位数字来表示
文件的权限777,第一位文件拥有人R+W+X的和,第二位是拥有组R+W+X的和,第三位是其他人R+W+X
命令:chmod 653 filename
例子:
#给文件拥有人赋读写权限,拥有组与其他人五任何权限,因此二进制为1(R) 1(W) 0(X),十进制为6,拥有组与其他人都是0
[root@openEuler opt]# chmod 600 hello.txt
[root@openEuler opt]# ll
total 0
-rw-------. 1 root root 0 Nov 24 10:34 hello.txt
#给拥有组与其他人设置读权限,拥有人权限保留不变
[root@openEuler opt]# chmod 644 hello.txt
[root@openEuler opt]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 24 10:34 hello.txt
注意:数字的方式也是会对权限造成覆盖,因此数字的方式赋权,要注意原来文件的权限,一旦设置错误要能够还原(不推荐在生产环境使用)
4.调整文件的拥有人或拥有组
需求:需要设置01.txt该文件,被bob可以读写,但是不能让其他人访问,除了bob以外的人都不能读写,此时仅仅依靠chmod就无法做到。
chown 修改文件的拥有人和拥有组
chown username filename ——>直接修改文件的拥有人
chown username:groupname finame ——>修改文件的拥有人和拥有组
chown :groupname filename ——>修改文件的拥有组
chown -R username:groupname finame ——>递归设置目录及目录下的文件和子目录的拥有人及拥有组
chgrp -R filename ——>仅修改文件的拥有组
1.如果当前用户作为文件的拥有人,即使文件的拥有人栏位权限是---,该用户依然可以调整属于自己文件的权限,并且可以编辑使用wq!强制保存,编辑的内容只有root用户才能看到,普通用户自己看不到(除非给自己赋权),因此调整文件的权限并不是仅root才能调整
2.chown修改文件的拥有人和拥有组仅root才能操作,普通用户无法修改。
3.删除文件或者目录,不是根据文件本身的权限来决定的,而是由文件所在目录的权限确定
例如user1创建的目录A,root在目录A创建了一些文件或者目录,那么root创建的这些文件目录拥有人是root,其他用户权限都设置为---,user1依然可以去删除这些文件
什么时候看文件权限什么时候看目录的权限?
当一个文件进行修改/编辑,操作文件本身时——>依据文件的权限
创建一个文件/删除一个文件也包括重命名、移动文件——>依据文件所在目录的权限
七、I/O和管道
I/O
I/O在Linux中通常指的是系统的输入输出设备,其中I指的是input,O指的是output
I:input 键盘——>称为Linux的标准输入设备(默认输入设备)
O:output 显示器——>称为Linux的标准输出设备(默认输出设备)
在Linux中有很多的场景需要改变I/O的方向,例如我们想将一个原本输出在显示器上的内容输出到文件中进行保存,一个程序原本应该读取键盘的输入信息,但是在脚本中我们希望从文件读取内容,此时就需要对I/O进行重定向
Linux的重定向符号
输出重定向
标准正确输出重定向
就是将原本输出在屏幕上的正确信息重定向保存到文件中
> 表示重定向覆盖输出
应用场景:
echo hello,openEuler > /tmp/euler.txt 创建新的文件
echo > /tmp/euler.txt 清空文件
id user1 > /opt/user1.txt 复制输出的用户ID信息到指定文件保存
ip a > /opt/ip.txt 复制输出的IP地址信息到指定文件保存
>> 表示追加重定向,在文件的末尾追加内容,而不是覆盖文件本身的内容
错误信息则无法输入到文件中
标准的错误输出重定向
将原本输出在屏幕上的错误信息,重定向到文件中去
2> 错误输出重定向的覆盖符号
[root@openEuler tmp]# id user1
id: ‘user1’: no such user
[root@openEuler tmp]# id user1 2> user.info
[root@openEuler tmp]# cat user.info
id: ‘user1’: no such user
应用场景:在脚本中或者是日常的命令中,需要在命令行屏蔽一些错误信息,可以通过错误输出重定向,将不需要的信息丢到/dev/null的空设备中
/dev/null是Linux中的空设备(垃圾桶,黑洞文件...),所有重定向到该设备的信息,系统都会丢弃,是不会保存的。
#如果正确则输出到屏幕,错误则丢到/dev/null且不显示
[root@openEuler tmp]# id bob 2> /dev/null
uid=1000(bob) gid=1000(bob) groups=1000(bob),0(root)
[root@openEuler tmp]# id tom 2> /dev/null
2>> 错误输出重定向追加符号
全部输出重定向
> + 2> = &> 全部输出重定向符号(不管是正确还是错误都输出到指定文件)
&> 全部输出重定向覆盖
&>> 全部输出重定向追加
版权声明:本文标题:基础到精通 openEuler 学习笔记(持续更新) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1765547726a3391561.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论