一、常用命令
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 用户配置文件
-
在Linux中,主要是通过用户配置文件来查看和修改用户信息
-
后面的用户和用户组管理命令,实质就是修改这些配置文件里的信息
-
在影子文件中保存的是真正加密的密码串
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 #恢复增量备份