Linux - 基础

一. 网络配置

  • 修改配置文件
  1. nmtui
  2. 修改/etc/sysconfig/network-scripts/ifcfg-ens33配置文件

第一种修改方式:

# vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=none/static  # 网卡获取IP的方式
	# none/static-->手动配置IP地址(静态)
	# dhcp-->自动获取IP地址(动态)
ONBOOT=yes  # 是否开机自动启动网卡
	# yes-->开机启动
	# no-->开机禁用
IPADDR=10.1.1.10  # IP地址
PREFIX=16  # 子网掩码 也可以写 NETMASK=255.255.0.0
GATEWAT=10.1.0.1  # 网关
DNS1=114.114.114.114  # DNS,可以写3个

第二种修改方式:

# 修改IP
sed -i 's/IPADDR=10.1.1.10/IPADDR=10.1.1.100/g' /etc/sysconfig/network-scripts/ifcfg-ens33
sed -i 's/ONBOOT=no/ONBOOT=yes/g' /etc/sysconfig/network-scripts/ifcfg-ens33
sed -i 's/BOOTPROTO=dhcp/BOOTPROTO=none/g' /etc/sysconfig/network-scripts/ifcfg-ens33
  • 重启网卡
# 重启网卡
systemctl restart network

二. SSH连接优化

  • 关闭selinux
# vi /etc/selinux/config
SELINUX=disabled
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

修改后必须重启服务器

# 重启服务器
shutdown -r now

临时修改--> setenforce 0

  • ssh连接失败
    1. 检查ip
    2. 关闭防火墙
# 临时关闭防火墙
systemctl stop firewall
# 永久关闭防火墙
systemctl disable firewall

三. 语言支持

# 查看系统当前语言设置
echo $LANG
# 修改语言
LANG=en_US
# en_US  -->English
# zh_CN.UTD-8  -->Chinese

四. yum源(CentOS系列)

Linux的软件管理工具

# yum仓库菜单
ls /etc/yum.repos.d/
# yum仓库源
# cat /etc/yum.repos.d/CentOS-Base.repo
[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

# [base]  -->仓库名称
# name=  -->仓库描述
# mirrorlist  -->仓库镜像路径
# baseurl  -->仓库url
# enabled  -->仓库是否启用 1: 启用, 0: 关闭
# gpgcheck  -->密钥检测 1: 开启检测, 0: 关闭检测
# gpgkey -->密钥路径

国内常用开源镜像站

构建国内镜像源

  1. 备份本地镜像源
  2. 下载或替换国内镜像源
  3. 清除yum缓存
  4. 生成yum缓存
# 清除yum缓存
yum clean all
# 生成yum缓存
yum makecache
# yum命令
yum list  # 列出所有yum package
yum search + [command]  # 查找command对应的依赖包
yum install + [package]  # 安装package包
yum remove + [package]  # 卸载package包

yum grouplist  #按组
yum groupinstall
yum groupremove

yum update  # 升级yum

五. 目录结构

# tree / -L 1
/
├── bin -> usr/bin  # 所有用户可用的Linux基本命令
├── boot  # 引导加载必须用到的文件(Kernel, initramfs(initrd), grub)等
├── dev  # 特殊文件或设备文件
├── etc  # 系统程序的配置文件
├── home  # 用户的家目录
├── lib -> usr/lib  # 动态链接共享库
├── lib64 -> usr/lib64  # 
├── media  # 系统自动识别的设备, eg: U盘, DVD等
├── mnt  # 为用户提供了临时的文件挂载目录
├── opt  # 为用户提供软件安装的路径, 默认是空的
├── proc  # Linux虚拟文件系统, 内存映射(不在磁盘中)
├── root  # root用户的家目录
├── run  # 临时文件系统
├── sbin -> usr/sbin  # 系统管理使用的工具命令
├── srv  # 用来存放服务启动后需要提取的数据
├── sys  # 系统内核
├── tmp  # 为用户提供来放临时文件
├── usr  # Linux共享资源目录(重要性仅次于根目录)
└── var  # 日志文件目录

六. 开机启动流程

电源-->BIOS硬件自检-->读磁盘-->MBR主引导-->PT分区表

七. 目录管理命令

切换目录

语法:

cd [dirName]
# 选项
-p: 如果要切换到的目标目录是一个符号连接,直接切换到符号连接指向的目标目录
-L: 如果要切换的目标目录是一个符号的连接,直接切换到字符连接名代表的目录,而非符号连接所指向的目标目录。
-: 当仅实用"-"一个选项时,当前工作目录将被切换到环境变量"OLDPWD"所表示的目录。

eg:

cd + [path]  # 切换到对应路径下
cd ..  # 返回上一级目录
cd -  # 返回上一次目录
cd ~  # 切换到自己的家目录

查看文件

语法:

ls [Option] [path]
# 选项
-a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出);
-A:显示除影藏文件“.”和“..”以外的所有文件列表;
-C:多列显示输出结果。这是默认选项;
-l:与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列;
-F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。当文件为普通文件时,不输出任何标识符;
-b:将文件中的不可输出的字符以反斜线“”加字符编码的方式输出;
-c:与“-lt”选项连用时,按照文件状态时间排序输出目录内容,排序的依据是文件的索引节点中的ctime字段。与“-l”选项连用时,则排序的一句是文件的状态改变时间;
-d:仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表;
-f:此参数的效果和同时指定“aU”参数相同,并关闭“lst”参数的效果;
-i:显示文件索引节点号(inode)。一个索引节点代表一个文件;
--file-type:与“-F”选项的功能相同,但是不显示“*”;
-k:以KB(千字节)为单位显示文件大小;
-l:以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等;
-m:用“,”号区隔每个文件和目录的名称;
-n:以用户识别码和群组识别码替代其名称;
-r:以文件名反序排列并输出目录内容列表;
-s:显示文件和目录的大小,以区块为单位;
-t:用文件和目录的更改时间排序;
-L:如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录;
-R:递归处理,将指定目录下的所有文件及子目录一并处理;
--full-time:列出完整的日期与时间;
--color[=WHEN]:使用不同的颜色高亮显示不同类型的。

eg:

ls  # 显示非隐藏文件
ls -a  # 显示全部文件(包括隐藏文件)
ls -l  # 以长格式显示文件内容(非隐藏文件)

创建目录

语法:

mkdir [Option] [Parameter] [path]
# 选项:
-Z:设置安全上下文,当使用SELinux时有效;
-m<目标属性>或--mode<目标属性>建立目录的同时设置目录的权限;
-p或--parents 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录;
--version 显示版本信息。

eg:

mkdir /root/newFolder  # 找root下新建立一个newFolder的文件夹
mkdir /opt/new/Folder  # 在opt/new下创建Folder, 如果opt下没有new文件夹则创建new文件夹在创建就Folder文件夹

创建文件

语法:

touch [path/touchName]
# 选项
a 改变档案的读取时间记录。
m 改变档案的修改时间记录。
c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
f 不使用,是为了与其他 unix 系统的相容性而保留。
r 使用参考档的时间记录,与 --file 的效果一样。
d 设定时间与日期,可以使用各种不同的格式。
t 设定档案的时间记录,格式与 date 指令相同。
--no-create 不会建立新档案。
--help 列出指令格式。
--version 列出版本讯息。

eg:

touch /root/newFile.config  # 在root下创建一个名为newFile.config的文件
touch /root/newFolder/newFile.config{1..10}  # 在/root/newFolder下创建文件

文件时间

语法:

stat [fileName]

eg:

stat /etc/sysconfig/network-sctipts/ifcfg-ens33

stat

文件复制

语法:

cp [Option] [path/fileName] [newPath/newFileName]
# 选项
-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
-d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
-f:覆盖已经存在的目标文件而不给出提示。
-i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答 y 时目标文件将被覆盖。
-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-l:不复制文件,只是生成链接文件。

eg:

cp /root/1 /tmp  # 把文件1复制到tmp目录下,文件权限继承tmp
cp -p /root/1 /tmp  # 把文件1复制到tmp目录下并继承源文件的权限
cp -r /root /tmp  # 把文件夹root所有的文件以及文件夹复制到tmp
# 文件备份
cp -v /etc/hosts /ect/hosts.bak
cp -v /etc/{hosts,hosts.bak}
cp -v /etc/hosts{,.bak}

文件剪切

语法:

mv [Option][FileName]
# 选项
-b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
-i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。
-f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
-n: 不要覆盖任何已存在的文件或目录。
-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

eg:

mv 1 1.bak  # 把1文件保存为1.bak,之前的文件会覆盖

文件删除

语法:

rm [Option] [FileName]
# 参数
-i 删除前逐一询问确认。
-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
-r 将目录及以下之档案亦逐一删除。

谨慎操作

八. 文件管理命令

文件查看命令

  1. cat
  2. more
  3. less
  4. head
  5. tail
  • cat
# 直接查看,显示所有内容
cat /etc/hosts  # 查看hosts文件
# 覆盖内容
cat >/etc/1.txt<<EOF
	1
	EOF
# 追加内容
cat >>/etc/1.txt<<EOF
	1
	2
	EOF
  • more
# 分页浏览
more /etc/hosts
# space -->向下滚动一页
# enter -->向下滚动一行
  • less
# 分页浏览(可以反复浏览)
less /etc/hosts
# pageup -->向上滚动一页
# pagedown -->向下滚动一页
# q -->退出浏览模式
  • head

从头部开始看,默认看10行

# 看hosts文件的前10行
head /etc/hosts
# -n 看前n行
head -n /etc/hosts
  • tail

从文件的末尾看倒数10行

# 看hosts文件的倒数10行
tail ./etc/hosts
# -n: 看倒数n行
# -f: 跟踪文件  ctrl+C退出

九. 文件查找

  1. locate
  2. which
  3. whereis
  • locate
# 安装依赖
yum install mlocate
# 更新数据locate数据库(不更新可能找不到在PATH之外的文件)
updatedb
locate /etc/sh  # 搜索/etc下所有以sh开头的文件
locate -i /etc/sh  # 搜索/etc/下所有以sh开头的文件,不区分大小写
  • which
which ls  # 查看ls命令所在的位置(绝对路径)
# 所有的which只能查询在系统PATH中的命令
  • whereis
whereis ls  # 查找文件索引中的命令,源文件,man文件等,非PATH也可查找

十. 字符处理命令

语法:

sort [Option]...[File]
	-r: 倒序
	-n: 按照数字排序
	-t: 指定分隔符, 默认空格
	-k: 指定第几列, 第几个字符

eg:

创建示例文件

cat >>sore.txt<<EOF
	b:3
	c:2
	a:4
	e:5
	f:11
	EOF

排序

sort sort.txt  # 默认升序
sort -r sort.txt  # 使用降序(倒序)排序
sort -t ':' -k2 sort.txt  # 以':'为分隔符(':'之前的为第一列), 按照第二列进行默认排序 对比: sort -t ':' -k2 -n sort.txt

十一. Linux终端概述

终端切换-->Ctrl+Alt+F1...F6

十二. Linux系统界面

  1. 字符型
  2. 图形化
  • 字符型:
    • shell
      • bash(默认)
      • echo $SHELL
  • 图形化:gnome/kde

十三. Bash快捷键

Ctrl+A // 光标移至首部
Ctrl+E // 光标移至尾部
Ctrl+C // 结束前台程序
Ctrl+D // 退出当前shell
Ctrl+Z // 任务挂到后台
Ctrl+L // 清屏
Ctrl+K // 删除光标到末行的所有字符
Ctrl+U // 删除光标到首行的所有字符
Ctrl+R // 搜索历史,安装关键字

十四. 命令流程

  1. 判断命令是否通过绝对路径执行
  2. 判断命令是否存在别名
  3. 判断用户输入的是内部命令还是外部命令
  4. 内部命令直接执行, 外部命令检测是否存在缓存
  5. 检测PATH路径, 有执行, 没有报错

内部命令: 在shell中自带

外部命令: 在系统PATH之外的某个路径下的可执行命令

十五. 转义字符

  1. 反斜杠(\) : 使反斜杠后的一个变量为字符串
  2. 单引号(' ') : 使其中所有的变量为单纯的字符串
  3. 双引号(" ") : 保留变量属性,不进行转义
  4. 反引号(` `) : 把反引号中的命令执行后返回结果

十六. VIM编辑器

1. vim基本介绍

vi和vim命令是linux中强大的文本编辑器,由于Linux一切皆文件,而系统配置一个服务就是在修改配置文件的参数.vim编辑器是运维工程师必须掌握的一个工具

vi和vim的区别

  1. vi不显示高亮语法
  2. vim显示高亮语法

vi和vim功能上没有什么区别,用vi还是vim取决于个人习惯

没有vim使用yum安装

yum install -y vim

2. vim模式介绍

vim中一共有3种编辑模式:

  1. 命令模式
  2. 编辑模式
  3. 末行模式
  • 命令模式

控制光标移动, 可对文本进行复制, 粘贴, 删除等工作, 使用 vim打开一个文件时, 默认就是命令模式

  • 编辑模式

从命令模式进入编辑模式, 按下(i, I, a, A, o, O, r, R), 进入到编辑模式在屏幕的左下方会显示'insert'的字样,按下ESC键可返回到命令模式

  • 末行模式

在命令模式下输入冒号(:)/或者斜杠(/)即可进入末行模式, 在该模式下可以进行的操作有:

  1. 显示行号
  2. 搜索
  3. 替换
  4. 保存
  5. 退出

vim编辑器配置文件流程

  1. 默认打开文件处于命令模式
  2. 需要从命令模式切换至编辑模式
  3. 编辑模式修改后, 返回命令模式
  4. 通过命令模式切换到末行模式进行保存或退出

***在vim中,无法直接从编辑模式到末行模式

2.1. 命令模式

命令模式: 默认打开文件进入命令

# 命令光标移动
G  # 跳转到光标末端
gg  # 跳转到光标顶端
Ngg  # 跳转到当前文件的22行
$  # 将光标移动到所在行的尾部
^  # 将光标移动到所在行的首部

# 翻页
ctrl + f  # 向下翻页
ctrl + b  # 向上翻页

# 复制
yy  # 复制所在行
6yy  # 复制所在行以及向下5行

# 粘贴
P  # 粘贴在光标下一行
p  # 粘贴在光标上一行

# 删除
dd  # 删除光标所在行
3dd  # 删除光标以及以下2行
d0  # 删除光标以后的所有行
D  # 删除光标后到行尾
x  # 删除当前光标记住后的字符
X  # 删除当前光标记住前的字符

# 剪切
先删除,在粘贴

# 撤销
u  # 撤销上一步的操作

# 替换
r  # 替换当前光标标记的单个字符
R  # 进入REPLACE模式,连续替换,ESC结束

2.2.编辑模式

# 以下模式都为编辑模式
i  # 光标不会做任何处理
I  # 光标跳转到首行
a  # 光标往后移一位
A  # 光标跳转到末行
o  # 在光标下一行添加空白行
O  # 在光标上一行插入空白行

2.3. 末行模式

:w  # 保存当前状态
:w!  # 强制保存当前状态
:q  # 退出不保存
:q!  # 强制退出不保存
:wq  # 先保存在退出
:wq!  # 强制保存并退出
:x  # 先保存在退出
ZZ-->shift+zz  # 保存退出
:number  # 跳转到对应行号

# 复制
:ny  # 复制单行
:m,ny  # 从m行复制到n行
:%y  # 复制所有

# 删除
:nd  # 删除单行
:m,nd  # 删除m到n行
:%d  # 删除文件说有内容

# 查找
/string  # 需要查找的内容
	n  # 向下查找
	N  # 向上查找

# 替换
:s#sbin#bin  # 替换光标所在行的第一个匹配项
:1,5s#sbin#bin#g  # 替换1-5行的所有匹配项
:%s#sbin#bin#g  # 替换文档中所有满足条件的匹配项
:%s#sbin#bin#gc  # 替换内容时提示是否需要替换

# 另存为
:w /DIR  # 将文件所有内容替换到DIR

# 读入
:r /DIR  # 将DIR的文件读入到当前光标后

2.4.视图模式

ctrl + v 进入VISUAL BLOCK 选中需要注释的行(可视化模块)
	1.插入: shift + i 进入编辑模式, ESC退出
	2.删除: 选中内容后按x或者d进行删除
	3.替换: 选中要替换的内容, 按下r ,然后输入要替换的内容

shift + v 进入VISUAL LINE 选中行内容(可视化模块)
	1.复制: 选中行内容后按y进行复制
	2.删除: 选中行内容后按d进行删除

3. 环境变量

环境变量临时生效

# 临时生效
:set nu  # 显示行号
:set ic  # 忽略大小写
:set ai  # 自动缩进
:set list  # 显示制表位(空格和tab)
:set no[nu|ic|ai]  # 取消临时设置的变量

环境变量永久生效

vi ~/.vimrc  # 个人环境变量(优先级高) /etc/vimrc 全解环境变量

# ~/.vimrc
set nu
set ic

十七. Linux系统文件属性

1. 系统文件类型

长格式下的第一个字符

格式说明
-普通文件
d目录文件
b设备文件(块设备)存储设备硬盘/dev/sda, /dev/sda1
c设备文件(字符设备)打印机,终端/dev/tty1, /dev/zero
s套接字文件, 进程间的通讯
p管道文件
l链接文件
ls -dl /etc/hosts /tmp /bin/ls /dev/sda /dev/tty1 /etc/grub2.cfg  /dev/log /run/systemd/initctl/fifo

ls -ld

2. 系统链接文件

  1. 软连接

类似Windows下的.lnk(快捷方式)文件

# 创建链接文件语法
ln -s [源文件] [目标文件]
# 软链接源文件要用绝对路径
  1. 硬链接

硬链接是为了给文件添加一个入口, 防止把该文件误删除

硬链接和软链接的区别:

1.硬链接是别名,软链接是快捷方式
2.硬链接和源链接指向同一个i节点,软链接不同
3.硬链接不能跨文件系统,而软链接可以
4.删除硬链接和软链接都不会影响原链接
5.硬链接只能针对文件,软链接可以针对文件和目录

3. 压缩包

  • windows:

    • rar
    • zip
  • Linux

    • zip
    • tar.gz
    • tar.bz
    • tar.xz

压缩的好处:

节省磁盘空间占用率
节省网络传输带宽消耗
网络传输更加快捷

Linux常见的压缩名以及压缩工具

.gz  gzip
.bz2  bzip2
tar  tar  # tar没有压缩功能, 只是把一个目录合并成一个文件
tar.gz  # 先用tar打包, 在用gz压缩
tar.bz2  # 先用tar打包, 在用bz2压缩
# Linux下压缩文件通常以tar.gz的文件包
# Linux下压缩文件必须到后缀名

3.1. zip压缩工具

zip是压缩工具, unzip是解压工具

# 安装unzip工具包
yum install -y unzip
# zip选项
# 	-q: 不执行指令过程
# 	-m: 把文件压缩并删除源文件
# 	-r: 递归, 将指定目录下的所有文件和子目录一起处理

# unzip选项
# 	-d[DIR]: 指定文件解压后要存储的目录
# 	-q: 不显示执行过程

# eg:
# zip File.zip file
# zip -r DIR.zip /DIR/
# unzip File.zip

3.2. tar文件归档管理

原始含义是归档,没有压缩功能

tar是Linux下最常用的压缩和解压缩, 支持文件和目录的压缩

# 语法
tar [Option] [FileName]
# [Option]
c: 文件归档
x: 对归档的文件解压
t: 列出归档文件列表
v: 显示归档或解包过程
f: 指定文件命,一般写在最后
z: 使用tar.gz归档后的文件(tar.gz)
j: 使用bzip2归档后的文件(tar.bz2)
J: 使用xz归档后的文件(tar.xz)
X: 排除多个文件(需要写入排除的文件名)
h: 打包软链接

# 常用的打包组合
zcvf  # 打包tar.gz
zxvf  # 解压tar.gz

cjf  # 打包tar.bz2
xjf  # 解压tar.bz2

xf  # 自动选择解压模式

tf  # 查看压缩包内容

十八. Linux系统用户管理

用户存在的意义:

  1. 系统上的每一个进程都需要特定的用户运行
  2. 每一个文件都有特定的用户拥有
  3. 访问文件或目录受到用户的限制
  4. 进程能够以何种方式访问某一个文件或目录, 与进程所关联的用户有关

查看当前用户信息

[root@AliceServer ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

==UID的分类:==

UID用户
0超级管理员
1-200系统用户,由系统分配给系统进程使用
201-999系统用户,用来运行服务的账户,不需要登陆,动态分配
1000+常规用户

*在Linux7之前的惯例是, UID1-499用于系统用户. 而UID500+则用于普通用户

==组类别==

基本组: 优先使用基本组, 用户只能属于一个基本组, 用户默认基本组
附加组: 基本组不能满足授权要求, 创建附加组, 用户可以属于多个附加组
私有组: 创建用户时如果没有指定基本组, 系统会创建和用户名相同的组名

1. 用户管理

账户信息存放在/etc/passwd, 账户密码密码信息保存在/etc/shadow, 这两个文件是linux系统中最重要的文件之一, 如果没有这两个文件或者文件出现问题, 会导致无法正常登录linux系统

==/etc/passwd==

>head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash

由':'分隔成7段

  1. 用户名称
  2. 密码占位符
  3. 用户的UID
  4. 用户的基本组GID
  5. 用户注释
  6. 用户家目录
  7. 用户登陆shell

==/etc/shadow==

>cat /etc/shadow | grep root
root:$6$Eof4RgKtYZksm5nN$uwfZfTBzsxmloBms4Xc5LJ4tTbVBkJ/s40k.Ke40gcXLVU/iO0sEtgb6lbJ7ThSjcOlHndck5jHJkB/edrMRa0::0:99999:7:::

由':'分隔成9段

  1. 用户登录名
  2. 加密后的密码
  3. 最近一次修改密码的时间
  4. 密码最少使用几天
  5. 密码最多使用几天
  6. 密码到期前警告期限
  7. 密码到期后保持活动的天数
  8. 账户到期时间
  9. 标志

密码格式

$a$b$c

  • a 加密算法
  • b salt随机加密值
  • c 加密后的值

使用chage更改用户密码的使用情况

-d	设置最近一次更改密码的时间,设置0为下次登录强制修改密码
-m	设置用户2次密码使用的最小天数
-M	设置用户2次密码使用的最大天数
-W	设置用户密码的警告过期天数
-I	设置密码过期天数后,密码为失效状态
-E	设置用户过期时间,账号失效后无法登录
-l	显示线上

eg:

# 添加用户
useradd user1
tail -1 /etc/passwd
>>>user1:x:1000:1000::/home/user1:/bin/bash
# 更改密码
echo 123 | passwd --stdin user1
tail -1 /etc/shadow
>>>user1:$6$BQfGfOJg$DePPzuE96zlUZo9T0zHLfRQpDMFM7x9bX3tOnHfY.QXU2ksTzzJZC6xqnhZQFaTQ9kBdZUn8wchXH5Yh22NKb.:18882:0:99999:7:::
# 查看密码详情
chage -l user1
最近一次密码修改时间					:9月 12, 2021
密码过期时间					:从不
密码失效时间					:从不
帐户过期时间						:从不
两次改变密码之间相距的最小天数		:0
两次改变密码之间相距的最大天数		:99999
在密码过期之前警告的天数	:7
## 设置最近一次修改密码的时间
chage -d '2020-02-20' user1
## 设置最短密码使用的时间
chage -m 2 user1
#查看密码表
tail -1 /etc/shadow
>>>user1:$6$BQfGfOJg$DePPzuE96zlUZo9T0zHLfRQpDMFM7x9bX3tOnHfY.QXU2ksTzzJZC6xqnhZQFaTQ9kBdZUn8wchXH5Yh22NKb.:18312:2:99999:7:::
## 设置最长密码使用时间
chagre -M 15 user1
## 设置密码过期警告
chage -W 6 user1
## 设置密码过期时间
chage -I 5 user1
## 设置用户过期时间
chage -E '2099-12-31' user1

2. 用户命令

添加用户前需要确认

  • 用户的默认组是否有特殊要求
  • 用户是否允许登陆
  • 用户的密码策略
  • 用户的有效期
  • 用户的UID是否有特殊要求
    1. 使用useradd命令新增用户
    2. adduser软链接是指向useradd

创建用户

# 创建用户参数
-u	指定用户的UID(不能和现有的冲突)
-g	指定用户默认基本组
-G	指定用户附加组,用逗号隔开添加多个附加组
-d	指定用户家目录
-c	指定用户的注释信息
-M	不建立家目录
-s	指定用户默认shell
-r	创建系统账户,没有家目录

eg:创建user用户,指定UID5001,基本组student,附加组sa,dba,注释信息:'new student',shell:bash

# 创建用户组
groupadd sa
groupadd dba
groupadd student
# 创建用户
useradd -u 5001 -g student -G sa,dba -c "new student" -d /home/user -s /bin/bash user
# 查看用户信息
tail -1 /etc/passwd
>>>user:x:5001:1003:new student:/home/user:/bin/bash
# 创建系统用户
useradd -M -s /sbin/nologin mysql
useradd -r -s/sbin/nologin dba

更改用户组

使用usermod修改

# usermod参数
-u	修改用户的UID
-g	修改用户所属的基本组GID
-G	修改用户的附加组,使用逗号隔开,覆盖原有附加组
-a	追加更多的附加组和-G一起使用 -aG:追加附加组
-md	家目录迁移, 和-d一起使用
-d	指定用户家目录的位置
-c	修改用户注释信息
-s	更改用户使用的shell
-l	更改用户的登录名
-L	锁定用户
-U	解锁用户

使用finger命令查看用户

yum install -y finger
finger root

3. 用户创建

用户创建原理: ==Linux用户创建会默认读取/etc/default/useradd的配置文件, 如果指定参数,使用指定的参数, 如果不指定参数会默认使用/etc/default/useradd的参数, 当使用useradd时, 用户的家目录会产生.bash_*的文件, 这些文件默认都是从/etc/skel目录复制, 如需变更环境拷贝目录站点可修改/etc/default/useradd的文件

如果执行useradd,指向了参数, 就会覆盖/etc/defaults/useradd的默认配置

# 和chage -l user1看到的一样,只不过是不一样的形式
egrep -v "^#|^$" /etc/login.defs

/etc/default/useradd文件解释

cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home  # 用户的家目录建在/home
INACTIVE=-1  # 是否启用账号过期, -1表示不启用
EXPIRE=  # 账号终止日期, 不设置表示不启用
SHELL=/bin/bash  # 新用户默认使用的shell类型
SKEL=/etc/skel  # 配置用户家目录的默认文件存放路径
CREATE_MAIL_SPOOL=yes  # 创建mail文件

4. 密码管理

创建完账户后, 默认的没有密码的, 所以该账户无法登录操作系统, 只有在passwd中设置号密码才可以登录

密码策略

  1. 长度大于10
  2. 密码中应该包含大写,小写以及特殊符号(!, @, #)等
  3. 不规则性

==Be Carefu==

  1. 普通用户只能更改自己的密码
  2. 管理员root可以修改任何人的密码
  3. 在使用passwd修改密码时, 不指定用户名, 则修改当前用户的密码

随机密码生成工具

  1. 系统内置
  2. mkpasswd密码生成工具
# 系统内置
echo $RANDOM | md5sum | cut -c 1-10
# mkpasswd工具
# 安装扩展包
yum install -y expect
# 生成密码
mkpasswd -l 15 -d 3 -C 5  # -l: 密码位数(默认7位), -d: 数字, -c: 小写字母, -C: 大写字母

5. 组命令管理

*组账户信息保存在/etc/group

/etc/group被':'分割为4个部分

  1. 组名称
  2. 密码占位符 -->组密码
  3. 组管理员
  4. 组成员 -->只显示附加成员, 不会显示基本成员

==修改组信息==

使用groupmod

# 修改组名称
groupmod -n [NewGroupName] [OldGroupName]
# Option
-g <群组识别码>  设置欲使用的群组识别码。
-o 重复使用群组识别码。
-n <新群组名称>  设置欲使用的群组名称。

6. 身份切换

shell分类

  1. 交互式shell 等在用户输入命令,exit退出

  2. 非交互式shell 执行shell脚本, 脚本执行结束后自动退出shell

  3. 登录shell 需要用户名密码 eg: su

  4. 非登录shell 不需要用户名密码 eg: sh /bash

==个人配置文件==: ~/.bash_profile, ~/.bashrc
==全局配置文件==: /etc/profile, /etc/profile.d/*, /etc/bashrc

  • profile类

    设置环境变量, 登录前运行的脚本和命令

  • bashec类

    设置本地变量,定义命令别名

配置文件执行顺序

登录式shell

  1. /etc/profile
  2. etc/profile.d/*.sh
  3. ~/.bash_profile
  4. ~/.bashrc
  5. /etc/bashrc

非登录式shell

  1. ~/.bashrc
  2. etc/bashrc
  3. /etc/profile.d/*.sh

6.1. su 用户切换

su - [user]
su  # 切换到root

7. sudo提升权限

7.1. Centos提权方法

usermod -G whell [UserName]
  • 日志审计
sudo tail -f /var/log/secure
# 使用vi编辑/etc/sudoers配置文件

十九. Linux用户权限

1. 基本权限

  1. 权限修改命令chmod
  2. 属主属组修改命令chown

Linux中的文件或目录的权限和用户以及用户组的关联很大,Linux中每个文件或目录都有一组9个基础权位,每三个字符分成一组,分别为属主权限位(User),属组权限位(Group),其他用户权限位(Other)

eg: rwxr-xr-x

文件权限对应表

字母含义对应权限对应二进制
r(read)4100
w(write)2010
x(execute)执行1001
-0000
# 修改用户权限
chmod [-R] 755 FileName/FolderName
# 修改所属主
chown root [-R] FileName/FolderName
# 修改属组
chown .root [-R] FileName/FolderName
# 修改所属主和所属组
chown root.root [-R] FileName/FolderName

2. 系统ACL

User

  • getfacl [File] 查看详细权限
  • setfacl -{u/g/o:uName/gName:[r/w/x]} [File] 设置权限

二十. Linux启动过程

Linux的系统组成

内核+跟文件系统

内核实现的功能

进程管理, 内存管理, 网络协议栈, 文件系统, 安全功能, 驱动程序
内核是linux的整个核心, 内核即是linux, 其他程序都是通过调度内核来实现的

运行中系统环境分层

内核空间+用户空间
内核空间: 由内核代码组成, 拥有系统级别权限, 可直接更改硬件
用户空间: 由各种引用程序组成, 通过调度内核来完成各种复杂的功能任务

1. CentOS6的启动流程

先来上个图(新标签打开图)

Linux init

  • 硬件启动

Linuxinit

简单说一下这一步的流程:打开电源;POST自检;BIOS逐一排查设备启动顺序;如果是硬盘启动,读取硬盘的MBR的BootLoader。(这里默认MBR分区,暂不考虑GPT分区)

这里主要有三个需要了解的地方BIOS启动顺序、MBR和BootLoader。BIOS启动顺序大部分人应该都知道,我就不赘述了。

  1. MBR
    MBR(Main Boot Record),是硬盘的0柱面,0磁道、1扇区(第一个扇区),称为主引导扇区,也称为主引导记录。它由三部分组成:主引导程序(BootLoader)、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。
    注:硬盘默认一个扇区大小为512字节。
    第一部分,主引导程序(BootLoader)占446个字节,负责从活动分区中装载,并运行系统引导程序。
    第二部分,硬盘分区表DPT占64个字节,有4个分区表项,每个分区表项占16个字节,硬盘中分区有多少以及每一个分区的大小都记录在其中。
    第三部分,硬盘有效标志,占2个字节,固定为55AA。如果这个标志位0xAA55,就认为这个是MBR。
  2. BootLoader
    不同的系统有不同的主引导程序(BootLoader)。Windows使用的是NTLDR(NT Loader,Windows NT系列操作系统)、Bootmgr(Boot Manager,Windows Vista,7,8,10),Linux一般使用的是grub(也叫grub legacy)和grub2。

CentOS6一般使用的是grub。GRUB(GRand Unified Bootloader)是一个来自GNU项目的多操作系统启动程序。

  • Grub引导菜单

Linux init

简单说一下这一步的流程:GRUB程序加载执行并引导kernel(内核)程序,其中有三个阶段。

grub引导阶段的文件都在/boot/grub/目录下

  1. Stage1阶段
    这一阶段其实执行的就是系统安装时预先写入到MBR的Bootloader程序。它的任务仅是读取(加载)硬盘的0柱面,0磁道,2扇区的内容(/boot/grub/stage1)并执行。
[root@CentOS6 ~]# ll /boot/grub/stage1
-rw-r--r--. 1 root root 512 Mar 13  2018 /boot/grub/stage1

这一阶段,使硬件初始化,为Stage2准备RAM空间(内存空间),读取Stage2到RAM空间(应该涉及到了Stage1.5阶段)。就是Stage1.5阶段或Stage2阶段的入口,引导进入Stage1.5阶段或Stage2阶段。

另外,这一阶段并没有识别文件系统的能力。  

  1. Stage1.5阶段
    这一阶段是Stage1阶段和Stage2阶段的桥梁,具有识别分区文件系统的能力,此后grub程序便有能力去访问/boot/grub/stage2,并将其读取到内存执行。
[root@CentOS6 ~]# ll -h /boot/grub/stage2  //大于512字节了
-rw-r--r--. 1 root root 124K Mar 21  2018 /boot/grub/stage2
[root@CentOS6 ~]# ls /boot/grub/*stage1_5  //有各种文件系统格式
/boot/grub/e2fs_stage1_5     /boot/grub/minix_stage1_5
/boot/grub/fat_stage1_5      /boot/grub/reiserfs_stage1_5
/boot/grub/ffs_stage1_5      /boot/grub/ufs2_stage1_5
/boot/grub/iso9660_stage1_5  /boot/grub/vstafs_stage1_5
/boot/grub/jfs_stage1_5      /boot/grub/xfs_stage1_5
  1. Stage2阶段
    这一阶段会(初始化本阶段需要用到的硬件,检测系统的内存映像,)解析grub的配置文件/boot/grub/grub.cnf,根据配置文件加载内核镜像到内存中,通过initrd程序建立虚拟根文件系统,最后调用(转交)内核
[root@CentOS6 ~]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/mapper/vg_centos6-lv_root
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0  //设置默认启动项为第一个内核
timeout=5  //菜单项等待选项时间为5秒
splashimage=(hd0,0)/grub/splash.xpm.gz  //菜单背景图片
hiddenmenu  //隐藏菜单
//这里有时候会有passwrod参数,意思是进入急救模式(单用户模式)的密码是多少,可以是明文密码,可以是加密密码
//例如password --md5 $1$1S9Xy$1MuGZSoPc2vAtkW.jvz0X/,这代表进入急救模式的password经过MD5加密,加密密码为$1$1S9Xy$1MuGZSoPc2vAtkW.jvz0X/
title CentOS 6 (2.6.32-642.el6.x86_64)  //菜单项名称
root (hd0,0)  //grub查找stage2文件及kernel文件所在设备分区,grub的根。第一块硬盘的第一个分区
//启动的内核
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/vg_centos6-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=vg_centos6/lv_swap crashkernel=128M LANG=zh_CN.UTF-8 rd_LVM_LV=vg_centos6/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-642.el6.x86_64.img  //内核匹配的ramfs文件,img是镜像文件
  • kernel内核引导

Linux init

通过内存中的虚拟根文件系统,加载驱动,然后切换到真正的根文件系统,并执行/sbin/init程序。

  • 初始化系统进程

Linux init

/sbin/init程序会读取/etc/inittab文件确认运行级别,然后执行/etc/rc.d/rc脚本,根据确认的运行级别启动对应/etc/rc.d/rc#.d/目录下的服务(#为0~6),与此同时执行系统初始化脚本/etc/rc.sysinit(软链接,指向/etc/rc.d/rc.sysinit),还会加载/etc/rc.local(软链接,指向/etc/rc.d/rc.local文件)用户自定义服务(脚本)。

这里有个有意思的地方,/etc/rc.d/目录下的文件几乎在上一次都有相应的软链接(也就是/etc/目录下),唯一没有的/etc/rc.d/init.d/目录又似乎与/etc/init.d/目录完全相同

[root@CentOS6 ~]# ls -ld /etc/rc*
lrwxrwxrwx.  1 root root    7 Mar 13  2018 /etc/rc -> rc.d/rc
lrwxrwxrwx.  1 root root   10 Mar 13  2018 /etc/rc0.d -> rc.d/rc0.d
lrwxrwxrwx.  1 root root   10 Mar 13  2018 /etc/rc1.d -> rc.d/rc1.d
lrwxrwxrwx.  1 root root   10 Mar 13  2018 /etc/rc2.d -> rc.d/rc2.d
lrwxrwxrwx.  1 root root   10 Mar 13  2018 /etc/rc3.d -> rc.d/rc3.d
lrwxrwxrwx.  1 root root   10 Mar 13  2018 /etc/rc4.d -> rc.d/rc4.d
lrwxrwxrwx.  1 root root   10 Mar 13  2018 /etc/rc5.d -> rc.d/rc5.d
lrwxrwxrwx.  1 root root   10 Mar 13  2018 /etc/rc6.d -> rc.d/rc6.d
drwxr-xr-x. 10 root root 4096 Feb 18 02:17 /etc/rc.d
lrwxrwxrwx.  1 root root   13 Mar 13  2018 /etc/rc.local -> rc.d/rc.local
lrwxrwxrwx.  1 root root   15 Mar 13  2018 /etc/rc.sysinit -> rc.d/rc.sysinit
[root@CentOS6 ~]# ls /etc/rc.d/
init.d  rc0.d  rc2.d  rc4.d  rc6.d     rc.sysinit
rc      rc1.d  rc3.d  rc5.d  rc.local
[root@CentOS6 ~]# diff -ruNa /etc/rc.d/init.d/ /etc/init.d/

/etc/inittab文件

[root@CentOS6 ~]# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

这个文件直接看最后一行的那个数字就好了,我这里是5,就代表启动级别是5。
另外,还需要了解下系统的启动级别:
0  关机
1  单用户模式、维护模式、急救模式,都可以
2  多用户模式,但没有网络
3  完整的多用户模式
4  预留级别,暂时没用,不用考虑
5  图形界面,XWindows
6  重启

/etc/rc.d/rc#.d/目录
在启动时执行的/etc/rc.d/rc脚本,会调用/etc/rc.d/rc#.d/目录下的文件

[root@CentOS6 ~]# ls /etc/rc.d/rc5.d/
K01smartd        K50dnsmasq     K73winbind         K88sssd          S01sysstat       S12rsyslog         S24nfslock           S26udev-post       S82abrt-ccpp
K02oddjobd       K50xinetd      K74ntpd            K89netconsole    S02lvm2-monitor  S13cpuspeed        S24rpcgssd           S28autofs          S82abrtd
K05wdaemon       K60nfs         K75ntpdate         K89rdisc         S08ip6tables     S13irqbalance      S25blk-availability  S50bluetooth       S90crond
K10psacct        K61nfs-rdma    K75quota_nld       K92pppoe-server  S08iptables      S13rpcbind         S25cups              S50kdump           S95atd
K10saslauthd     K69rpcsvcgssd  K76ypbind          K95firstboot     S10network       S15mdmonitor       S25netfs             S55sshd            S99certmonger
K15htcacheclean  K71cgred       K84wpa_supplicant  K95rdma          S11auditd        S22messagebus      S26acpid             S70spice-vdagentd  S99local
K15httpd         K72cgconfig    K87restorecond     K99rngd          S11portreserve   S23NetworkManager  S26haldaemon         S80postfix

K开头的文件:要停止的服务(脚本),从01开始关闭,数字越小越优先关闭
S开头的文件:要启动的服务(脚本),从01开始启动,数字越小越优先启动
这些文件其实都是软链接,指向的都是/etc/rc.d/init.d/目录下的文件

[root@CentOS6 ~]# ll /etc/rc.d/rc5.d/K01smartd
lrwxrwxrwx. 1 root root 16 Mar 13  2018 /etc/rc.d/rc5.d/K01smartd -> ../init.d/smartd
  • 初始化成功登录shell终端

Linux init

用户登录