Linux学习笔记

一、常用命令

1.1 文件操作命令

查看当前路径下的文件
ls  显示当前路径下的所有文件,蓝色代表文件夹,白色代表文件
ls -a 显示所有文件,包括隐藏文件,(.xxx的文件)都是隐藏文件
ls -lh 前四个对应 文件修改次数 + 文件所有人 + 文件所属组 + 文件大小
ls *.txt 显示当前路径下 所有txt文件
ls 1*  显示当前路径下 所有以1开头的文件

创建文件和文件夹
touch test.txt  当前目录创建文件
mkdir cc    当前目录创建文件夹
mkdir -p /tmp/Chinese/liudehua  同时创建多级文件夹,-p递归创建

复制文件,cp命令原文件不删除
cp -rp /etc/grub2.cfg /tmp  复制文件,-r是递归,-p是保留源文件的属性(包括所有者、所属组、权限等)
cp -r aa/bb .  复制文件夹,复制到当前路径(.)

移动文件,mv命令是删除原文件的,可以用来重命名
mv Chinese/aa.txt /home/hebe/Desktop/cc   移动文件
mv /tmp/grub2.cfg /tmp/grub3.cfg  文件重命名

删除文件和文件夹
rm -f /tmp/grub3.cfg   删除文件
rm -rf /tmp/cc        删除文件夹      -f 强制删除 -r 循环递归删除

查看文件和日志内容
cat -n test.txt   查看文件,-n前面加上行号,看着更清楚
more test.txt  查看文件,空格翻页,回车下一行。q退出
less test.txt  查看文件,空格翻页,回车下一行 比如想搜索serve  就输入/serve 输入n 就查找下一个 q退出
head -10 /etc/services  查看这个文件的前十行,改数字即可
tail -10f /etc/services  查看这个文件的最后十行  加入-f可以动态显示文件,ctrl+C退出

创建软链接,后者指向前者,软链接相当于windows的快捷方式,所有权限都为rwxrwxrwx
link -s /etc/issue /tmp/issue.soft  
创建硬链接,后者指向前者,相当于拷贝加上同步更新(同步更新是因为i节点相同)
link /etc/issue /tmp/issue.hard  

1.2 文件搜索命令

1. 在/etc下,搜索文件名为init的,-iname就是不区分大小写,换成/就是整个系统查找一遍
find /etc -name init  

2. 在etc下,搜索文件名包含init的
find /etc -name *init*  

3. 在根目录下查找大于100MB的文件,单位0.5KB,100MB=102400KB=204800
find / -size +204800  

4. 在/etc下查找大于80MB且小于100MB的文件,-a 是两个条件同时满足  -o 是满足任意一个即可
find /etc -size +163840 -a -size -204800 

5. 在/home下查找所有者是cccc的文件
find /home -user cccc  

6. 在/home下查找所属组为cccc的文件
find /home -group cccc  

7. 在/etc下查找5分钟内被修改过属性的文件和目录
find /etc -cmin -5  

8. 在/etc下查找30分钟内被修改过内容的文件和目录
find /etc -mmin -30 

9.搜索文件名=inittab,加入参数-i 不区分大小写

locate inittab 
updatedb 升级文件资料库 

它是在文件资料库查找文件,所以查找速度非常快,但是刚创建的文件查找不到,还有就是/tmp下创建文件,也查找不到,因为tmp下不在文件资料库收录范围

10. 在/etc/passwd文件内容里查找root

grep -n --color=auto "root" /etc/passwd 

--color=auto  搜索出来的root加红 
-i 忽略大小写  -n 显示行号  -v 反向查找 

1.3 查看登录用户命令

1. 显示当前用户信息 tty是本地终端就是VM虚拟机,pts是远程终端,也就是Securecrt连接工具
who 

2. 显示当前用户详细信息,第一行up表示服务器运行多长时间,users表示几个用户,load average表示负载均衡 
w 

3. 查看当前登录用户
whoami  

4. 显示当前路径
pwd  

5. 获取命令的绝对路径
whereis ifconfig

1.4 压缩解压命令

.tar.gz格式
tar -zcf ccc.tar.gz ccc  打包并压缩成ccc.tar.gz
tar -zxf ccc.tar.gz    解压缩

.tar.bz2格式
tar -cjf ccc.tar.bz2 ccc  	打包并压缩成ccc.tar.bz2
tar -xjf ccc.tar.bz2 	 解压缩

.zip格式 
zip aaa.zip aaa    压缩文件
zip -r aaa.zip aaa     压缩文件夹
unzip /home/ccc.zip -d /etc  把/home下的ccc.zip解压到/etc里

1.5 网络相关命令

1. ping命令,与windows不同,这个ping不指定4个,会一直ping下去
ping -c 4 www.baidu.com   

2. 暂时性更改内网ip,重启就失效
ifconfig ens33 192.168.8.250 

3. 追踪路由,显示数据包到百度间的访问路径
traceroute www.baidu.com

4. 查看过去和现在登陆服务器系统的人员信息
last 

5. 查看root用户最后一次登录信息
lastlog -u root  

6. 显示网络相关信息
netstat -tlun 查看本机监听的端口
netstat -an  查看本机所有的网络连接
netstat -rn  查看本机路由表

7. 输入命令setup,这里配置网络,这是永久配置

1.6 关机重启命令

shutdown -h now  关机
shutdown -r now  重启
logout			 退出登陆,即SecureCRT断开连接 

1.7 vim编辑器

vim aaa.txt  

1. 插入命令
Esc键 + 输入“a” + 在光标所在字符后插入内容

2. 设置行号命令
Esc键 + 输入“:set nu”设置行号 + 输入“:set nonu”取消行号

3. 删除命令
Esc键 + 输入“:9,12d” 	删除9-12行

4. 复制命令
Esc键 输入“4yy” 复制当前行以下4行 
输入“p”   粘贴到光标所在行下面

5. 剪切命令
Esc键 输入“4dd” 剪切当前行以下4行  
输入“p”   粘贴到光标所在行下面

6. 撤销操作
Esc键 输入“u”

7. 查找关键字
Esc键 输入“/str”  搜索str关键字 输入“n” 下一个出现位置  

8. 替换关键字
Esc键 输入“:1,10s/ftp/yangmi/g” 在1-10行,只要有ftp的地方都删掉换成yangmi
Esc键 输入“:%s/ftp/yangmi/g”  全文替换,只要有ftp的地方都删掉换成yangmi

9. 保存修改退出命令
Esc键 输入“:w /tmp/ccc.txt” 另存为
Esc键 输入“:wq” 保存修改并退出
Esc键 输入“:q!” 不保存修改并退出

10. 把其他文件内容或命令执行结果,导入vim
Esc键 输入“:r /etc/aaa.txt” 把该路径下的txt文件内容导入到当前vim光标处
Esc键 输入“:r !date” 把该命令执行结果导入到当前vim光标处

二、用户和用户组管理

2.1 用户配置文件

  1. 在Linux中,主要是通过用户配置文件来查看和修改用户信息

  2. 后面的用户和用户组管理命令,实质就是修改这些配置文件里的信息

  3. 在影子文件中保存的是真正加密的密码串

1. 用户信息文件
vim /etc/passwd   查看配置文件,可以看到有7个字段
第1个字段:用户名称
第2个字段:密码标志,x代表用户有密码
第3个字段:UID就是用户id,0代表超级用户,1-499代表系统用户,500以上代表普通用户,uid改成0,用户变成root
第4个字段:GID,用户初始组ID,初始组一开始就有的权限,与之对应附加组,是后来添加的权限
第5个字段:用户说明
第6个字段:家目录(用户初始登陆目录)  普通用户:/home/hebe   超级用户:/root
第7个字段:登陆之后的shell

2. 用户信息影子文件
vim /etc/shadow   查看配置文件,可以看到有9个字段
第1个字段:用户名
第2个字段:加密密码,SHA512散列加密算法,如果为“!!”或“*”代表没有密码,不能登录
第3个字段:密码最后一次修改日期,以1970.1.1作为起始日期,显示出来的是过了多少天
第4个字段:两次密码的修改间隔,如果是10,意味着第一天修改密码,过10天,才能再次改密码
========================================================================
时间戳换算日期:date -d "1970-01-01 16066 days"
日期换算时间戳:echo $(($(date --date="2021/10/28" +%s)/86400+1)) 
例子:如果第五个字段是90,第六个字段是7,第七个字段是5
意思是90天后密码到期,要更换密码,提前7天发送警告信息,警告用户要换密码了,超出90天密码还能用,到第95天,正式密码失效
========================================================================
第5个字段:密码有效期,99999代表永久生效
第6个字段:密码到期前的警告信息,马上要改密码了
第7个字段:密码到期后的宽限天数,0代表密码到期后立即失效,-1代表永远不会失效
第8个字段:账号失效时间,要用时间戳-数字,这个是账号失效,不是密码失效
第9个字段:保留字段,这个暂时没有用

3. 组信息文件
vim /etc/group   查看配置文件,可以看到有4个字段
第1个字段:组名,默认组名和用户名一样
第2个字段:组密码标志,x代表组有密码,不推荐去设置
第3个字段:GID,组ID
第4个字段:组中附加用户

4.组信息影子文件
vim /etc/gshadow   查看配置文件,可以看到有4个字段
第1个字段:组名
第2个字段:组密码
第3个字段:组管理员用户名
第4个字段:组中附加用户

2.2 用户管理命令

1.添加用户命令:useradd
useradd tfz
passwd tfz  
参数:-u 指定uid||-d 指定家目录||-c 指定用户说明||-g 指定初始组||-G 指定附加组||-s 指定用户登录shell

2.修改用户密码:passwd
passwd tfz  给tfz用户设置密码,只有root才可以给别人设密码
passwd 回车   是当前用户给自己设密码
-S (只能root)查看密码状态 用户名||密码设定时间||密码修改间隔时间||密码有效期||警告时间||密码不失效
-l (只能root)锁定用户 
-u 解锁用户

3.修改用户信息:usermod  修改用户密码状态:chage
usermod tfz  对tfz用户进行修改用户信息
参数:-u 修改uid||-c 修改用户说明||-G 修改附加组||-L 临时锁定用户||-U 解锁用户

chage tfz  对tfz用户进行修改用户密码状态
参数:-l 列出用户密码的详细状态
chage -d 0 tfz  这个命令把密码修改日期归零了,这样用户一登录就要修改密码

4.删除用户:userdel 查看用户id:id 用户名   用户切换命令:su
userdel -r tfz  一般都要加-r,在删除用户同时删除用户家目录
su - root   一般都是加-这么用,-代表连带用户环境变量一起切换,就是切换成root用户
su - root -c "useradd user3" 不切换root用户,只是借用root身份,执行添加用户的命令,还是需要root密码

2.3 用户组管理命令

1.添加用户组
groupadd 组名

2.修改用户组(一般不去改,都是直接删掉新建一个组)
groupmod -n 新组名 旧组名 把旧组名改成新组名
参数:-g GID 修改组id      -n 新组名  修改组名

3.删除用户组
groupdel 组名
注意:如果组里有初始用户,先删掉用户再删掉用户组,如果是附加用户就不影响组的删除

4.把用户加入组或从组中删除
gpasswd -a user1 root  把用户user1加入root组,加入后user1属于附加用户
gpasswd -d lamp1 root  把用户lamp1从root组中删除

三、权限管理

3.1 文件权限命令

r=4,w=2,x=1    rwxrw-r-- 对应764  三个对应所有人|所属组|其他人权限
改变文件权限,只有两个人可以,root+文件所有者

1. 查看文件的权限
ls -lh yum.log  
 
2. 修改文件的权限
chmod 764 yum.log  

3. 递归修改文件夹的权限
chmod -R 777 /tmp/cc   

4. 改文件所有者,把abcd文件夹文件所有者改为root
chown root /home/Chinese/abcd  

5. 改文件所属组,把abcd文件夹文件所属组改为root
chgrp root /home/Chinese/abcd   

6. 查看创建文件夹给的默认权限,创建文件会少个x,因为x代表可执行,所以x都变成-,不让他执行,确保安全
umask -S  

3.2 ACL权限

类似于windows中,右键属性,直接给用户,分配读写权限

ACL权限开启方法,Linux默认都是开启的
1.查看系统有哪些分区:df -h 
2.查询指定分区详细文件系统信息的命令:dumpe2fs -h /dev/sda1  
3.临时开启分区ACL权限(重启失效):mount -o remount,acl /   重新挂载根分区,并挂载加入acl权限
4.永久开启分区ACL权限:vi /etc/fstab  加入acl  然后 mount -o remount /

1.查看ACL权限
getfacl /project/   查看project目录的ACL权限

2.给用户或组,设定ACL权限
setfacl -m u:tfz:rx /project/  给用户tfz设定对project目录的rx读写权限
setfacl -m g:group1:rwx /project/  给组group1设定对project目录的rwx读写执行权限

3.最大有效权限mask
如果我给用户赋予了ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限
setfacl -m m:rx /project/  这样mask=r-x,除了初始用户,其他人就没有w写的权限了

4.删除ACL权限
setfacl -x u:tfz /project/  给用户tfz删除权限
setfacl -x g:group2 /project/  给组group2删除权限
setfacl -b /project/   把目录下所有ACL都删除,就回到原始的默认权限了

5.递归ACL权限
递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限
setfacl -m u:tfz:rx -R /project/  给目录下的所有文件都有ACL权限

6.默认ACL权限
如果给父目录设定默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限
setfacl -m d:u:tfz:rx /project/  给目录下新出现的文件都有ACL权限

setfacl 参数:-m 设定ACL权限||-x 删除指定的ACL权限||-b 删除所有的ACL权限||-d 设定默认ACL权限||-k 删除默认ACL权限||-R 递归设定ACL权限

3.3 SUID与SGID权限

SetUID,简称SUID,只针对文件
(1)只有可以执行的二进制程序才能设定SUID权限
(2)命令执行者要对该程序拥有x(执行)权限
(3)主要作用:命令执行者在执行该程序时获得该程序文件所有者的身份,比如从普通用户变成root
(4)SetUID权限只在该程序执行过程中有效

设定SetUID的方法:chmod 4755 文件名 或者  chmod u+s 文件名
取消SetUID的方法:chmod 755 文件名 或者  chmod u-s 文件名

SUID是一个非常不安全的命令,除了系统默认拥有的SUID命令之外,常见的比如passwd,我们尽量不要给程序赋予SUID
SetGID,简称SGID,针对文件
(1)只有可以执行的二进制程序才能设定SGID权限
(2)命令执行者要对该程序拥有x(执行)权限
(3)主要作用:命令执行者在执行该程序时,组身份升级为该程序文件的所属组,即组身份改变
(4)SetGID权限只在该程序执行过程中有效

针对目录
(1)普通用户必须对此目录拥有r和x权限,才能进入此目录
(2)普通用户在此目录中的有效组会变成此目录的所属组
(3)若普通用户对此目录拥有w权限时,新建的文件的默认所属组是这个目录的所属组

设定SetGID的方法:chmod 2755 文件名 或者  chmod g+s 文件名
取消SetGID的方法:chmod 755 文件名 或者  chmod g-s 文件名

SGID是一个非常不安全的命令,除了系统默认拥有的SGID命令之外,常见的比如locate,我们尽量不要给程序赋予SGID
Sticky BIT,简称SBIT粘着位,只针对目录有效
(1)普通用户对该目录拥有w和x权限
(2)如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件

设置SBIT粘着位的方法:chmod 1755 目录名 或者  chmod o+t 目录名
取消SBIT粘着位的方法:chmod 777 目录名 或者  chmod o-t 目录名

常见的比如tmp目录

3.4 chattr权限

chattr [+-=] [选项] 文件或目录名   该命令主要用于防止文件的误操作
+:增加权限 -:删除权限 =:赋予某权限

选项i:如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据,相当于把文件锁起来了,对root用户也是不能操作文件;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。
选项a:如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据,即现有数据不能改,但可以增加新数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除

查看文件系统属性
lsattr 选项 文件名     要用该对应的命令,传统ls不行
选项a:显示所有文件和目录
选项d: 若目标是目录,仅列出目录本身的属性,而不是子文件的

3.5 sudo权限

(1)授权sc用户可以重启服务器
visudo sc ALL=/sbin/shutdown -r now

(2)切换sc用户
su - sc

(3)sc用户查看可用的sudo命令
sudo -l

(4)sc用户执行被root赋予的命令  这边可以用whereis查看命令的绝对路径
sudo /sbin/shutdown -r now

实际工作环境下,root不要给普通用户授予vim命令,这是很危险的操作

四、文件系统管理

4.1 文件系统常用命令

文件系统查看命令df
df -a  显示所有的文件系统信息,包括隐藏的特殊文件系统
df -h  正常显示容量单位,这个常用

统计目录大小du
du -h /etc/  查看etc子目录大小
du -sh /etc/  查看etc目录总大小,这个常用

显示磁盘状态命令dumpe2fs
dumpe2fs 分区设备文件名

挂载命令mount
mount [-t 文件系统][-L 卷标名][-o 特殊选项] 设备文件名 挂载点
说明:挂载点相当于windows的c盘d盘,在linux中,用空目录即可;挂载就是把设备文件名和挂载点连接起来

4.2 挂载光盘和U盘

挂载光盘
(1)建立挂载点
mkdir /mnt/cdrom/
(2)真实放入光盘
(3)挂载光盘
mount -t iso9660 /dev/cdrom /mnt/cdrom/
(4)查看光盘内容
cd /mnt/cdrom/
ls

卸载光盘
(5)卸载命令
cd    先退出挂载点
umount /mnt/cdrom
挂载U盘
(1)建立挂载点
mkdir /mnt/usb/
(2)真实放入U盘
(3)挂载U盘
mount -t vfat /dev/sdb1 /mnt/usb/
(4)查看光盘内容
cd /mnt/usb/
ls

卸载U盘
(5)卸载命令
cd    先退出挂载点
umount /dev/sdb1

4.3 自动挂载

dumpe2fs -h /dev/sdb1  查看对应的UUID

(1)vim /etc/fstab   自动挂载实质,就是修改文本
(2)按照格式输入以下内容
/dev/sdb1               /disk1                  ext4    defaults        1 2
(3)再退出vim
(4)输入mount -a  如果没有报错,说明文件没写错

第一字段:分区设备文件名或UUID(硬盘通用唯一识别码)
第二字段:挂载点
第三字段:文件系统名称
第四字段:挂载参数
第五字段:指定分区是否被dump备份,o代表不备份,1代表每天备份,2代表不定期备份
第六字段:指定分区是否被fsck检测,0代表不检测,其他数字代表检测的优先级,那么当然1的优先级比2高

五、Shell编程

5.1 shell脚本的执行方式

1.mkdir sh    建立sh目录,以后脚本都放这里面
2.cd sh/

3.vim hello.sh   新建hello.sh文件

4.               输入脚本文件代码
#!/bin/bash
#tys
echo "hello world"

5.:wq         保存退出

6.chmod 755 hello.sh   

7.执行 ./hello.sh  

5.2 Bash的基本功能

历史命令与命令补全:

history [选项][历史命令保存文件]    
直接history命令也可以
-c 清空历史命令  -w 将缓存中的历史命令写入保存文件(~/.bash_history)

历史命令默认保存1000条,可以在环境变量配置文件/etc/profile中进行修改
上下箭头,tab键自动补全
alias 别名='原命令'
# 设定命令别名

alias 
# 查询命令别名

vim /root/.bashrc
# 让别名永久生效

unalias 别名 
# 删除别名

ctrl+C 强制终止当前命令
ctrl+L 清屏,相当于clear
ctrl+U 剪切之前命令
ctrl+Y 粘贴ctrl+U剪切的内容
ctrl+D 退出当前终端,logout
输出重定向
命令 > abc 2>&1
# 把正确命令的输出结果或错误命令的报错信息,覆盖进abc文件里

命令 >> abc 2>&1
# 把正确命令的输出结果或错误命令的报错信息,追加进abc文件里 

命令 >> abc 2>>bcd
# 把正确命令的输出结果追加到abc文件,错误命令的报错信息追加进bcd文件里 

输入重定向
wc < 文件名
比如 wc < anaconda-ks.cfg  查看安装日志cfg的,行数+单词数+字符数
多命令执行符 格式 作用
; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1&&命令2 当命令1正确执行,则命令2才会执行;当命令1执行不正确,则命令2不会执行
|| 命令1||命令2 当命令1正确执行,则命令2不会执行;当命令1执行不正确,则命令2才会执行
date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date

dd 命令【选项】 一般用来复制硬盘分区
if=输入文件  指定源文件或源设备
of=输出文件  指定目标文件或目标设备
bs=字节数 	  指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数  指定输入/输出多少个数据块

命令 && echo yes || echo no  
#看命令是否正确执行

管道符|  逻辑或|| 

命令1 | 命令2
#命令1的正确输出作为命令2的操作对象
netstat -an | grep ESTABLISHED   查看当前服务器有几个远程连接
通配符 作用
? 匹配一个字符
* 匹配所有内容
[] 匹配括号中的任意一个字符,比如[abc]代表匹配a或b或c
[-] 比如[a-z]代表匹配所有小写字母
[^] 逻辑非,比如[^0-9]代表匹配一个不是数字的字符

5.3 Bash的变量

==============================================================================
用户自定义变量,即本地变量

name="shen chao"
#自定义变量

echo $name
#变量调用

set
#变量查看

unset name
#变量删除
==============================================================================
设置环境变量

export 变量名=变量值
#申明变量

env
#查询环境变量

unset 变量名
#删除变量
==============================================================================
位置参数变量
$n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
$* 代表命令行中所有的参数,把所有的参数看成一个整体
$@ 代表命令行中所有的参数,不过把每个参数区分对待
$# 代表命令行中所有参数的个数
==============================================================================
预定义变量
$? 最后一次执行的命令的返回状态,如果为0证明上一个命令正确执行
$$ 当前进程的进程号
$! 后台运行的最后一个进程的进程号
==============================================================================
读取键盘输入
read [选项][变量名]
-p "输出信息":在等待read输入时,输出提示信息
-t 秒数:指定等待时间
-n 字符数:read命令只接受指定的字符数
-s: 隐藏输入的数据

5.4 Bash的运算符

declare声明变量类型

在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修改指定变量类型为数值型

declare [+/-] [选项] 变量名
-:给变量设定类型属性
+:取消变量的类型属性
-i:将变量声明为整数型
-x:将变量声明为环境变量
-p:显示指定变量的被声明的类型
====================================================================================
数值运算
aa=11
bb=22
ff=$(($aa+$bb))      ff=aa+bb 

5.5 环境变量配置文件

source 配置文件
#让修改的配置文件生效

/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc

~/.bash_logout  注销时生效的环境变量配置文件
~/bash_history  history命令的文件
/etc/issue      本地终端欢迎信息  
/etc/issue.net  远程终端欢迎信息  

5.6 正则表达式

正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配
通配符是用来匹配符合条件的文件名,通配符是完全匹配

grep "aa*" test.txt
匹配至少包含有一个a的行,a*代表匹配0次或任意多次,在linux没有任何意义

grep "s..d" test.txt   
匹配出来said soid 类似这样
grep "s.*d" test.txt   
和*作用一样,s和d中间可以有任意个字符
grep ".*" test.txt   
匹配所有内容,

grep "^M" test.txt
匹配以大写M开头的行
grep "n$" test.txt
匹配以小写n结尾的行
grep -n "^$" test.txt
匹配空白行

\{n\}表示前面的字符恰好出现n次   [0-9]\{4\}匹配4位数字
\{n,\}表示前面的字符出现不少于n次   [0-9]\{2,\}匹配2位及以上的数字
\{n,m\}表示前面的字符至少出现n次,最多出现m次   [a-z]\{6,8\}匹配6-8位的小写字母

5.7 字符命令

cut [选项] 文件名    grep看行 cut看列
-f 列号 提取第几列
-d 分隔符 按照指定分隔符分割列

printf '%s %s %s\n' 1 2 3 4 5 6 
输出123  换行 456

awk命令可以截取空格
举例:df -h | awk '{print $1 "\t" $5 "\t" $6}'

awk 可以加入BEGIN,END,  先执行begin内容,打印test!!,再输出第二列
awk 'BEGIN{print "test!!"} {print $2 "\t" $5}' student.txt

因为/etc/passwd文件,是冒号分隔开,awk只认空格或tab,所以要加入FS内置变量
awk '{FS=":"}{print $1 "\t" $3}' /etc/passwd

sed是轻量级流编辑器,主要是用来将数据进行选取,替换,删除,新增
-a 追加  -c 行替换 -i 插入,或直接修改文件 -d 删除 -p 打印 -s 字符串替换 -n默认sed会输出所有内容,-n输出指定内容
sed -n '2p' student.txt  输出第二行
sed '2,4d' student.txt   删除第二到第四行,只改变输出不改变文件本身内容

排序命令sort
sort [选项] 文件名  一般直接sort 文件名,
-f 忽略大小写
-r 反向排序

统计命令wc
wc [选项] 文件名 
-l 只统计行数
-w 只统计单词数
-m 只统计字符数

5.8 条件判断

按照文件类型进行判断

测试选项 作用
-b 文件 判断该文件是否存在,并且是否为块设备文件
-c 文件 判断该文件是否存在,并且是否为字符设备文件
-d 文件 判断该文件是否存在,并且是否为目录文件
-e 文件 判断该文件是否存在
-f 文件 判断该文件是否存在,并且是否为普通文件
-L 文件 判断该文件是否存在,并且是否为符号链接文件
-p 文件 判断该文件是否存在,并且是否为管道文件
-s 文件 判断该文件是否存在,并且是否为非空
-S 文件 判断该文件是否存在,并且是否为套接字文件

======================================================================================

按照文件权限进行判断

测试选项 作用
-r 文件 判断该文件是否存在,并且是否该文件拥有读权限
-w 文件 判断该文件是否存在,并且是否该文件拥有写权限
-x 文件 判断该文件是否存在,并且是否该文件拥有执行权限
-u 文件 判断该文件是否存在,并且是否该文件拥有SUID权限
-g 文件 判断该文件是否存在,并且是否该文件拥有SGID权限
-k 文件 判断该文件是否存在,并且是否该文件拥有SBit权限

======================================================================================

两个文件之间进行比较

测试选项 作用
文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新
文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧
文件1 -ef 文件2 判断文件1和文件2是否是同一个文件,通过Incode号判断

======================================================================================

两个整数之间进行比较

测试选项 作用
整数1 -eq 整数2 判断整数1是否和整数2相等
整数1 -ne 整数2 判断整数1是否和整数2不相等
整数1 -gt 整数2 判断整数1是否大于整数2
整数1 -lt 整数2 判断整数1是否小于整数2
整数1 -ge 整数2 判断整数1是否大于等于整数2
整数1 -le 整数2 判断整数1是否小于等于整数2

======================================================================================

字符串的判断

测试选项 作用
-z 字符串 判断字符串是否为空
-n 字符串 判断字符串是否为非空
字符串1 == 字符串2 判断字符串1是否和字符串2相等
字符串1 != 字符串2 判断字符串1是否和字符串2不相等
两种判断格式
test -e /root/install.log && echo yes || echo no  
[ -e /root/install.log ] && echo yes || echo no  

5.9 流程控制

if语句
if [条件判断式1]
  then 
  	条件1成立时,执行程序
elif [条件判断式2]
  then
    条件2成立时,执行程序
else
  条件不成立时,执行程序
fi
======================================================================================
case语句
case $cho in
	"yes")
		echo "你选择yes"
		;;
	"no")
		echo "你选择no"
		;;
	*)
		echo "你选择error"
		;;
esac
======================================================================================
for语句
s=0
for((i=1;i<=100;i=i+1))
	do
		s=$(($s+$i))
	done
echo "The sum of 1+2+..+100 is:$s"

for i in 1,2,3,4   这种for循环也可以
======================================================================================
while语句
#从1加到100,如果i小于等于100,则执行循环
i=1
s=0
while [ $i -le 100]
	do
		s=$(( $s+$i ))
		i=$(( $i+1 ))
	done
echo "The sum is:$s"
======================================================================================
until语句    while是符合循环条件执行循环,until是到循环条件停止循环
#从1加到100,如果i大于100,则停止循环
i=1
s=0
until [ $i -gt 100]
	do
		s=$(( $s+$i ))
		i=$(( $i+1 ))
	done
echo "The sum is:$s"

六、系统管理

6.1 top命令

top   #查看系统健康状态
直接输入字母P/M/N/q
P:以CPU使用率排序,默认此选项
M:以内存的使用率排序
N:以PID排序
q:退出top

top命令第一行信息为任务队列信息

内容 说明
12:26:46 系统当前时间
up 1 day,13:32 系统运行时间,本机已经运行1天13小时32分
2 users 当前登陆了2个用户
load average:0.00,0.01,0.05 系统在之前1分钟,5分钟,15分钟的平均负载。一般认为小于1时,负载较小,大于1,超出负载

top命令第二行信息为进程信息

内容 说明
Tasks:95 total 系统中的进程总数
1 running 正在运行的进程数
94 sleeping 睡眠的进程
0 stopped 正在停止的进程
0 zombie 僵尸进程。如果不是0,需要手工检查僵尸进程

top命令第三行信息为CPU信息

内容 说明
%Cpu(s):0.0us 用户模式占用的CPU百分比
0.3sy 系统模式占用的CPU百分比
0.0ni 改变过优先级的用户进程占用的CPU百分比
100.0id 空闲CPU的CPU百分比
0.0wa 等待输入/输出的进程的占用CPU百分比
0.0hi 硬中断请求服务占用的CPU百分比
0.0si 软中断请求服务占用的CPU百分比
0.0st st虚拟时间百分比,就是当有虚拟机时,虚拟CPU等待实际CPU的时间百分比

top命令第四行信息为物理内存信息

内容 说明
Mem:997956 total 物理内存的总量,单位KB
472100 free 空闲的物理内存数量
190672 used 已经使用的物理内存数量
335772 buff/cache 作为缓冲的内存数量

top命令第五行信息为交换分区信息

内容 说明
Swap:1023996 total 交换分区(虚拟内存)的总大小
472100 free 空闲交换分区的大小
0 used 已经使用的交互分区的大小
610212 avail Mem 作为缓存的交互分区的大小

6.2 进程命令

ps aux  #查看系统所有进程

USER:该进程是由哪个用户产生的;
PID:进程的ID号;
%CPU:该进程占用CPU资源的百分比,占用越高,进程越耗费资源;
%MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源;
VSZ:该进程占用虚拟内存的大小,单位KB;
RSS:该进程占用实际物理内存的大小,单位KB;
TTY:该进程是在哪个终端中运行的。其中tty1-tty7代表本地控制台终端,tty1-tty6是本地的字符界面终端,tty7是图形终端。pts/0-255代表虚拟终端。?是指内核直接产生的
STAT:进程状态。常见的状态有:R:运行、S:睡眠、T:停止状态、s:包含子进程、+:位于后台
START:该进程的启动时间
TIME:该进程占用CPU的运算时间,注意不是系统时间
COMMAND:产生此进程的命令名
=======================================================================================
yum install psmisc   先安装pstree
pstree [选项]
-p 显示进程的pid
-u 显示进程的所属用户
pstree -p  #查看对应服务的id号
=======================================================================================
kill -1 进程id号    #重启进程
kill -9 进程id号    #强制杀死进程
==================================================================================
killall -9 httpd     killall + 服务名
==================================================================================
pkill命令一般用来,按照终端号踢出用户
w  #查询本机已经登录的用户
pkill -t -9 pts/1   #强制杀死从pts/1虚拟终端登录的进程

6.3 系统信息查看

vmstat 1 3   #监控系统资源,该命令整合了top命令,每隔1秒刷新一次,总共刷新3次

dmesg  #开机时内核检测信息
比如 dmesg | grep CPU

free  #查看内存使用状态
比如 free -m   按照MB查看内存情况

cat /proc/cpuinfo     #查看CPU信息

uname -a    #查看系统与内核相关信息

file /bin/ls    #查看系统的位数

cat /etc/redhat-release    #查看系统的发行版本

lsof [选项]    #列出进程打开或使用的文件信息
-c 字符串:只列出以字符串开头的进程打开的文件
-u 用户名:只列出某个用户的进程打开的文件
-p pid:列出某个pid进程打开的文件

6.4 系统定时任务

1.
crond服务管理与访问控制  #默认情况下crond直接就是启动的也是自启动的
service crond restart  #启动命令
chkconfig crond on   #设置成自启动命令

2.
crontab -l   #查询crontab任务
crontab -r   #删除所有的crontab任务

3.
crontab -e   #进入编辑界面  写定时任务
45 22 * * * /root/sh/auto.sh   每天22点45分定时执行脚本
项目 含义 范围
第一个" * " 一小时当中的第几分钟 0-59
第二个" * " 一天当中的第几小时 0-23
第三个" * " 一个月当中的第几天 1-31
第四个" * " 一年当中的第几月 1-12
第五个" * " 一周当中的星期几 0-7,0和7都代表星期日
时间 含义
45 22 * * * 命令 在22点45分执行命令
0 17 * * 1 命令 每周一的17点00分执行命令
0 5 1,15 * * 命令 每月1号和15号的05点00分执行命令
40 4 * * 1-5 命令 周一到周五的04点40分执行命令
*/10 4 * * * 命令 每天凌晨四点,每隔10分钟执行一次命令
0 0 1,15 * 1 命令 每月1号和15号,每周一的00点00分都会执行命令

七、日志管理

7.1 日志文件

日志文件 说明
/var/log/cron 记录了系统定时任务相关的日志。
/var/log/cups 记录打印信息的日志
/var/log/dmesg 记录了系统在开机时内核自检的信息。也可以使用dmesg命令直接查看内核自检信息。
/var/log/btmp 记录错误登录的日志。这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog 记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/mailog 记录邮件信息
/var/log/message 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件。
/var/log/secure 记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录。比如说系统的登录,ssh的登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中。
/var/log/wtmp 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
/var/run/utmp 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w, who,users等命令来查询。

7.2 rsyslogd服务

1.日志文件格式
基本日志格式包含以下四列:
>事件发生的时间
>发生事件的服务器的主机名
>产生事件的服务名或程序名
>事件的具体信息

2./etc/rsyslog.conf配置文件
cat /etc/rsyslog.conf  随便复制了一行举例
authpriv.*                  /var/log/secure
服务名称+连接符号+日志等级       日志记录位置
服务名称 说明
auth 安全和认证相关消息(不推荐使用authpriv替代)
authpriv 安全和认证相关消息(私有的)
cron 系统定时任务cront和at产生的日志
daemon 和各个守护进程相关的日志
ftp ftp守护进程产生的日志
kern 内核产生的日志(不是用户进程产生的)
local0-local7 为本地使用预留的服务
lpr 打印产生的日志
mail 邮件收发信息
news 与新闻服务器相关的日志
syslog 有syslogd服务产生的日志信息(虽然服务名称已经改为rsyslogd,但是很多配置都还是沿用了syslggd的,这里并没有修改服务名)。
user 用户等级类别的日志信息
uucp uucp子系统的日志信息,uucp是早期linux系统进行数据传递的协议,后来也常用在新闻组服务中。
连接符号 说明
“*”代表所有日志等级 比如:“authpriv.*”代表authpriv认证信息服务产生的日志,所有的日志等级都被记录
“.”代表只要比后面的等级高的(包含该等级)日志都记录下来。 比如:“cron.info”代表cron服务产生的日志,只要日志等级大于等于info级别,就记录
“.=”代表只记录所需等级的日志,其他等级的都不记录。 比如:“*.=emerg”代表人和日志服务产生的日志,只要等级是emerg等级就记录。这种用法很少见,了解就好
“.!”代表不等于,也就是除了该等级的日志外,其他等级的日志都记录。
等级名称(从低到高) 说明
debug 一般的调试信息说明
info 基本的通知信息
notice 普通信息,但是有一定的重要性
warning 警告信息,但是还不会影响到服务或系统的运行
err 错误信息,一般达到err等级的信息以及可以影响到服务或系统的运行了
crit 临界状况信息,比err等级还要严重
alert 警告状态信息,比crit还要严重。必须立即采取行动
emerg 疼痛等级信息,系统已经无法使用了
日志记录位置 说明
日志文件的绝对路径 如“/var/log/secure"
系统设备文件 如“/dev/lpo” 这是打印机
转发给远程主机 如“@192.168.0.210:514”
用户名 如“root”
忽略或丢弃日志 如“~”

7.3 日志切割与轮换

1.日志文件的命名规则
配置文件中加入“dateext”参数   之后的文件名会自动加上日期

2.logrotate配置文件
cat /etc/logrotate.conf

3.rpm包不用手工做轮替,只有源码包才需要,例如把apache日志加入轮替,即在下面那个配置文件加入以下代码
vim /etc/logrotate.conf
/usr/local/apache2/logs/access_log {
	daily
	create
	rotate 30
}

4.
logrotate [选项] 文件名
-v 会显示日志轮替过程   -f 不论是否到轮替时间,强制轮替
参数(logrotate配置文件) 说明
daily 日志的轮替周期是每天
weekly 日志的轮替周期是每周
monthly 日志的轮替周期是每月
rotate 数字 保留的日志文件的个数。0指没有备份
compress 日志轮替时,旧的日志是否进行压缩
create mode owner group 建立新日志,同时指定新日志的权限与所有者和所属组。如 create 0600 root utmp
mail address 当日志轮替时,输出内容通过邮件发送到指定的邮件地址。如 mail [email protected]
missingok 如果日志不存在,则忽略该日志的警告信息
notifempty 如果日志为空文件,则不进行日志轮替
minsize 大小 日志轮替的最小值。也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替
size 大小 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替,如size 100k
dateext 使用日期作为日志轮替文件的后缀,如secure-20220306

八、备份与恢复

8.1 概述

1.Linux需要备份的数据
/root/目录
/home/目录
/var/spool/mail/目录
/etc/目录
其他目录

2.安装服务的数据

Apache需要备份的数据
配置文件+网页主目录+日志文件

MySQL需要备份的数据
源码包安装的mysql:/usr/local/mysql/data/
RPM包安装的mysql:/var/lib/mysql/

3.备份策略

完全备份:指把所有需要备份的数据完全备份,比如:完全备份整块硬盘;完全备份整个分区目录

增量备份:第一天完全备份,第二天备份第一天增加的内容,第三天备份第二天增加的内容,以此类推
缺点:恢复起来也是一天一天的恢复,较慢

差异备份:把完全备份和增量备份的优势结合起来,是个折中的概念,但实际工作还是上面两种比较多,这个知道一下就行

8.2 dump和restore命令

备份

 1. yum -y install dump
 dump [选项] 备份后的文件名 原文件或目录
 -level:就是0-9十个备份级别,0代表完全备份,1代表第一次增量备份,2代表第二次增量备份
 -f 文件名:指定备份后的文件名
 -u:备份成功后,把备份时间记录在/etc/dumpdates文件
 -v:显示备份过程中更多的输出信息
 -j:把备份文件压缩为.bz2格式
 -W:显示允许被dump的分区的备份等级以及备份时间
 
 2.举例:备份boot分区(Centos7已改)
 dump -0uj -f /root/boot.bak.bz2 /boot/    #先执行一次完全备份,并压缩和更新备份时间
 cat /etc/dumpdates                        #查看备份时间文件
 cp install.log /boot/                     #复制日志文件到boot分区
 dump -1uj -f /root/boot.bak1.bz2 /boot/   #增量备份boot分区,并压缩
 dump -W            					   #查询分区的备份时间和备份等级
======================================================================================
 恢复
 
 1.restore [模式选项] [选项]
 模式选项:
 -C:比较备份数据和实际数据的变化
 -i:进入交互模式,手工选择需要恢复的文件
 -t:查看模式,用于查看备份文件中拥有哪些数据
 -r:还原模式,用于数据还原
 选项:
 -f:指定备份文件的文件名
 
 2.举例:
 (1)比较备份数据和实际数据的变化
	mv /boot/vmlinuz-2.6.32-279.el6.i686 /boot/vmlinuz-2.6.32-279.el6.i686.bak
	#把/boot目录中内核镜像文件改个名字
	restore -C -f /root/boot.bak.bz2
	#restore发现内核镜像文件丢失
	
(2)查看模式
	restore -t -f /root/boot.bak.bz2
	
(3)还原模式,还原boot.bak.bz2分区备份
	mkdir boot.test             #新建目录,选择恢复到哪个目录
	cd boot.test/
	restore -r -f /root/boot.bak.bz2     #恢复完全备份
	restore -r -f /root/boot.bak1.bz2    #恢复增量备份

你可能感兴趣的:(linux,centos)