linux安全整理

常用命令
线上查询及帮助命令:
man 查看命令帮助,命令词典,内部,外部均可
help 内部命令 查看linux内置命令的帮助
外部命令 -help 查找帮助
type 命令 判断命令是内部命令还是外部命令
文件和目录操作指令:
ls 全拼list,列出目录的内容及其内容属性信息
cd 全拼change directory,从当前指定工作目录切换到指定的工作目录
cp 全拼copy,其功能为复制文件或目录
find 查找的意思,用于查找目录及目录下的文件
mkdir 全拼make directories其功能是创建目录
mv 全拼move,其功能是移动或重命名文件
pwd 全拼print working directory,其功能是显示当前工作目录的绝对路径
rename 用于重命名文件
rm 全拼用于全remove,功能是删除一个或多个文件或目录
rmdir 全拼remove emply directories,功能是删除空目录
touch 创建新的空文件,改变已有文件的时间属性
tree 功能是以树状结构显示目录下的内容
basename 显示文件名或者目录名
dirname 显示文件或目录路径
chattr 改变文件的拓展属性
lsattr 查看文件的类型
file 显示文件的类型
md5sum 计算和校验文件的MD5值
查看文件和内容处理命令
cat 全拼concatenate,连接多个文件并且打印到屏幕或重定向到指定文件中
tac 反向显示文件内容
more 分页显示文件内容
less 分页显示文件内容少量
tail 显示文件头部内容
cut 将文件的每一行按指定分隔符分割并输出
split 分割文件为不同的小片段
paste 安航合并文件内容
sort 对文件的内容排序
uniq 去除重复行
wc 统计文件的行数,单词数或字节数
iconv 转换文件的编码格式
dos2unix 将DOS格式文件转换为UNIX格式
diff 全拼difference比较文件的差异常用于文本文件
vimdiff 命令行可视化文件比较工具,常用于文本文件
rev 反向输出文件内容
grep/egrep 过滤字符串
join 将两个文件的相同字段合并
tr 替换或删除字符
vi/vim 命令行文本编辑器
strings 以字符串的方式查看二进制文件
文件压缩及解压命令
tar 打包压缩
unzip 解压文件
gzip gzip压缩工具
zip 压缩工具
信息显示命令
uname 显示操作系统相关信息的命令
hostname 显示或者设置当前系统的主机名
dmesg 显示开机信息用于诊断系统故障
uptime 显示系统运行时间及负载
stat 显示文件或文件系统的状态
du 计算磁盘空间的使用情况
df 报告文件系统磁盘空间的使用情况
top 实时显示系统资源的使用情况
free 查看系统内存
date 显示与设置系统时间
cal 查看日历等时间信息
搜索文件命令
which 查找二进制命令,按照环境变量PATH路径查找
find 从磁盘遍历查找文件或目录
whereis 查找二进制命令,按照环境变量PATH路径查找
locate 从数据库(/var/lib/mlocate/mlocate.db)查找,使用update更新库
进程管理相关命令
bg 将一个在后台暂停的命令,变成继续执行
fg 将后台中的命令调至前台继续运行
jobs 查看当前后台运行命令的个数
kill 终止进程
killall 通过进程名终止进程
pkill 通过进程名终止进程
crontab 定时任务命令
ps 显示进程的快照
pstree 树形显示进程
nice/renice 调整程序运行的优先级
nohup 忽略挂起信号运行指定的命令
pgrep 查找匹配条件的进程
runlevel 查看系统当前运行级别
init 切换运行级别
service 启动,停止,重新启动或关闭系统服务,还可以显示所有系统服务的当前状况
用户管理命令
useradd 添加用户
usermod 修改系统中已存在的用户属性
userdel 删除用户
groupadd 添加用户组
change 修改用户密码的有效期限
id 查看用户的uid gid以及归属组
su 切换用户身份
visudo 编辑/etc/sudoers文件的专属命令
sudo 用root权限执行在sudoers文件中允许的命令
基础网络操作指令
telnet 使用telnet协议远程登录
ssh 使用ssh加密协议远程登录
scp 全拼secure copy 用于不同主机之间复制文件
wget 命令下载文件
ping 测试主机间网络的连通性
route 显示和设置linux系统的路由表
ifconfig 查看,配置,启用或禁用网络接口的命令
ifup 启动网卡
ifdown 关闭网卡
netstat 查看网络状态
ss 查看网络状态
深入网络操作命令
nmap 网络扫描命令
lsof 全名list open files 列举系统中已经被打开的的文件
mail 发送和接收邮件
mutt 邮件管理命令
nslookup 交互式查询互联网dns服务器的命令
dig 查找dns解析过程
host 查询dns的命令
traceroute 追踪数据传输路由状况
tcpdump 命令行抓包工具
有关磁盘与文件系统的命令
mount 挂载文件系统
umount 卸载文件系统
fsck 检查并修复linux文件系统
dd 转换或复制文件
dumpe2fs 导出ext2/3/4文件系统信息
fdisk 磁盘分区命令,使用于2T之下的磁盘分区
parted 磁盘分区命令,没有磁盘大小限制
mkfs 格式化linux文件系统
partprobe 更新内核的硬盘分区表信息
e2fsck 检查ext2/3/4类型文件系统
mkswap 创建linux交换分区
swapon 启用交换分区
swapoff 关闭交换分区
sync 将内存缓冲区的数据写入磁盘
resize2fs 调整ext2/3/4文件系统大小
系统权限及用户授权相关命令
chmod 改变文件或者目录权限
chown 改变文件或目录的属住和属组
chgrp 改变文件用户组
umask 显示或设置权限掩码
查看系统用户登录信息的命令
whoami 显示当前有效的用户名称,相当于执行id -un命令
who 显示当前登录用户的信息
w 显示已经登录系统的用户列表,并显示用户正在执行的指令
lsat 显示登录成功的记录,读取的是/var/log/wtmp文件
lastlog 显示登录失败的记录,读取的是/var/log/btmp文件
users 显示当前登录系统的所有用户的用户列表
finger 查找并显示用户信息(debain系统)
内置命令及其他
echo 打印变量,或者直接输出指定的字符串
printf 将结果格式化输出到标准输出
rpm 管理rpm包的命令
yum 自动化管理rpm包(8.0之后建议使用dnf)
watch 周期性执行给定命令,并将命令的输出以全屏方式
alias 设置系统别名
unalias 取消系统别名
clear 清屏
history 查看历史命令
eject 弹出光盘
nc 网络工具
xargs 将标准输入转换成命令行参数
exec 调用并执行指令的命令
export 设置或显示环境变量、
unset 删除变量或函数
bc 命令行科学计算器
系统管理与性能监视命令
chkconfig 管理linux系统开机启动项
vstat 虚拟内存统计
mpstat 显示各个可用cpu的状态统计
sar 全面获取系统的cpu,运行队列,磁盘I/O,分页,内存,网络等性能数据
ipcs 用于报告linux中进程间通讯设备的状态,显示信息包括消息列表和信号量的信息
ipcrm 用于删除一个或更多消息队列,信号量或者共享内存标识
strace 用于诊断,调试linux用户空间跟踪器
ltrace 命令会跟踪进程的库函数调用,显示那个库函数被调用】
关机/重启/注销/和查看系统信息
shutdown 关机
halt 关机
poweroff 关闭电源
logout 退出当前登录的shell
exit 退出当前登录的shell
ctrl+d 退出当前登录的shell
linux下的用户,组和权限
用户,组文件
用户和文件 拥有/不拥有
组合文件 拥有/不拥有
用户和组 属于/不属于
即可分有:
用户拥有该文件
用户属于某个组,某个组拥有该文件
用户不拥有该文件
用户和组信息的查看
三类用户:
超级用户 root:UID=0
程序用户 ami: uid=1-499; kuangami: UID=1-999
普通用户 ami: UID=500-65535 kuangami:UID=1000-600000
cat /etc/passwd 查看用户信息
cat /etc/shadow 查看用户密码信息
cat /etc/group 查看用户的组信息
查看用户信息
cat /etc/passwd #/etc/passwd 默认权限为644,最小权限为444
[root@localhost ~]# cat /etc/passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
用户信息共有7个字段
1.用户名:root
2.密码占位符:****
3.uid:用户id——》0
4.gid:组id——>0
5.用户描述信息——》root
6.家目录:/root
7.登录shell (/bin/bash表示允许登录/sbin/nologin表示不允许登录)
注:一般来说只有root用户的uid为0,如果将一个用户的uid修改为0那么可以
使用普通用户的账户密码登录为root用户(系统自行切换),所有系统加固时
需要过滤用户的UID
可以使用如下shell脚本:
#! /bin/bash
read -p “请输入要查询的用户名:” A
echo “------------------------------”
n=cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}' | wc -l
if [ n − e q 0 ] ; t h e n e c h o " 该 用 户 不 存 在 " e c h o " − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − " e l s e e c h o " 该 用 户 的 用 户 名 : n -eq 0 ];then echo "该用户不存在" echo "------------------------------" else echo "该用户的用户名: neq0];thenecho""echo""elseecho"A"
echo “该用户的UID:cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $3}'
echo “该用户的组为:id $A | awk {'print $3'}
echo “该用户的GID为:cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $4}'
echo “该用户的家目录为:cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $6}'
Login=cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $7}'
if [ $Login == “/bin/bash” ];
then
echo “该用户有登录系统的权限!!”
echo “------------------------------”
elif [ $Login == “/sbin/nologin” ];
then
echo “该用户没有登录系统的权限!!”
echo “------------------------------”
fi
fi
查看密码信息
cat /etc/shadow #shadow默认权限为600最小为400
[root@localhost ~]# cat /etc/shadow
root: 6 6 6dHynbFrBHia67qu5KaTeX parse error: Expected 'EOF', got '#' at position 762: … #̲! /bin/bash …A’’ /etc/login.defs
sed -i ‘/^PASS_MIN_DAYS/c\PASS_MIN_DAYS ‘KaTeX parse error: Undefined control sequence: \PASS at position 73: …^PASS_MIN_LEN/c\̲P̲A̲S̲S̲_MIN_LEN 'C’’ /etc/login.defs
sed -i ‘/^PASS_WARN_AGE/c\PASS_WARN_AGE ‘$D’’ /etc/login.defs
echo “已设置好密码策略…”
查看组信息
cat /etc/group
[root@localhost ~]# cat /etc/group
root❌0:
bin❌1:
daemon❌2:
sys❌3:
1.组名称
2.组密码占位符
3.gid
4.组成员
注:一个用户只能有一个主要组,最多可以有31个附加组,主要组是用户创建文件时
默认的所有组,附加组主要用于权限管理,不论用户属于哪个组,用户都能拥有该组
的权限

        特殊组whell
            在linux中有一个特殊组whell,whell组就类似与一个管理员的组。在linux中
            即使有管理员权限,也不建议使用root用户登录。一般情况下用普通用户即可(
            可使用su-do执行root命令,修改配置文件使whell组内用户可以切换到root用户)
用户组信息管理
    用户管理:
        新建用户系统会做的事:
            1.新建用户时,系统会将/etc/skel中的目录拷贝到新建用户的家目录下
            2.在/var/spool/mail 中新建用户的邮箱
            3.在/etc下的passwd,shadow,group文件中,增加用户信息
        添加用户时指定参数
            -g指定新建用户所属组-u指定用户uid
            -G参数指定新建用户的附加组
            -s /sbin/nologin 指定创建用户没有登录系统的权限
            -M参数,指定创建用户不在home目录下创建家目录
            -d参数指定其家目录
        使用下面命令可以创建一个具有root权限的用户
            useradd -p `openssl passwd -1 -salt 'user' 123qwe` -u 0 -o -g root  -G root -s /bin/bash -d /home/user venus
        注:用户创建时,默认属性都是通过/etc/login.defs文件控制,修改此属性可以
        影响后所有的用户,也可以临时指定参数创建
        删除用户:userdel -r ***
            1.不加-r只删除/passwd,shadow和group文件中的用户信息,/home目录下的文件
            不删除,/var/spool/mail下的文件不删除
            2.加-r参数,删除passwd,shadow和group文件中的用户信息,同时删除用户的家目录
            和邮箱
        修改用户密码:passwd ***
            当用户为root用户:
                1.不需要知道当前密码
                2.不需要遵循密码要求
            当前用户为普通用户时:
                1.需要知道当前密码
                2.需要遵守要求(不能少于8个字符,妈祖复杂度要求)
        修改账户属性:usermod 参数 **
            1.-s修改用户登录shell usermod -s /sbin/nologin **
            2.-L账户锁定(passwd -S 账户名 查看账户状态)
            3.-U解锁账户
            4.-g修改用户所属组:usermod -d 改后 原组
            5.-G给用户添加附属组:usermod -G 用户名  附加组
                      删除用户:gpasswd -d 用户名 附加组
            6.-a 给用户添加多个附加组,默认仅有一个附加组
              [root@Redhat ]# id james
           [root@Redhat ]# id james
            uid=1000(james) gid=2002(james) 组=2002(james)
            
            [root@Redhat ]# usermod -g aaa james ; id james;  //修改用户的主组为aaa
            uid=1000(james) gid=2000(aaa) 组=2000(aaa)
            
            [root@Redhat ]# usermod -G xie james ;id james;   //给用户添加附加组 xie 
            uid=1000(james) gid=2000(aaa) 组=2000(aaa),1000(xie)
            
            [root@Redhat ]# usermod -G xiao james ;id james;  //给用户添加附加组xiao,并且如果原来有附加组的话替换原来的附加组
            uid=1000(james) gid=2000(aaa) 组=2000(aaa),2001(xiao)
            
            [root@Redhat ]# usermod -aG xie james;id james;  //给用户添加附加组 xie ,并且不替换原来的附加组
            uid=1000(james) gid=2000(aaa) 组=2000(aaa),1000(xie),2001(xiao)     
        锁定和解锁用户:
            锁定用户:usermod -L * 或 passwd -l *
            解锁用户:usermod -U * 或 passwd -u *
            查看用户状态:passwd -S *
                注:虽然usermod和passwd这两个命令都可以锁定和解锁用户。区别:passwd操作完会有提示
                passwd的权限比usermod大,使用usermod锁定的用户可以用passwd来解锁,但是使用passwd
                锁定的用户不能用usermod来解锁
    组管理:
        添加组:groupadd *
            1.-g --gid 为组使用GID
            2.-K --key 不使用/etc/login.defs文件的默认值
            3.-o --non-unique   允许创建有重复GID的组
            4.-p --password 为新租使用此加密过的密码
            5.-r --system 创建一个系统用户
        删除组:groupdel *
            1.-r --remove   删除主目录和邮件池
            注:只能删除附加组,不能删除主组
        修改组的属性:groupmod *
            1.-g --gid GID  将组ID改为GID
            2.-n --new_name 将组名改为 new_name
            3.-o --non_unique   允许使用重复的GID
        修改组中的用户:groupmems
                    groupmems -a john -g xie 将用户John添加到xie组中
                    groupmems(gpasswd) -d john -g xie 将用户从组中移除
文件权限的查看:
    使用ls-lh可以查看文件的具体信息,包括不同用户对该文件的权限
        drwxr-xr-x.  3 root root     97 8月  24 23:04 abrt
        -rw-r--r--.  1 root root     16 8月  24 23:08 adjtime
            前11个字符确定用户可以对文件进行的操作:
                文件(-)目录(d)连接(l)设备(c)块设备(b)
                三个一组(rwx)读写执行
                第一组是文件所有者的权限
                第二组是所属组的权限
                第三组是其他用户的权限
            针对文件:
                r:可读
                w:可写
                x:可执行
            针对目录:
                r表示可以列出目录内容(可使用ls)前提是有x权限
                w表示可以对目录内容进行增删改查,前提是有x权限
                x可进入目录,如果需要操作必须拥有对应权限
            后面字段:
                连接文件数 所属者 所属组 文件大小 最后修改日期 文件名        
文件权限的修改
    修改文件的权限:chmod  
            chmod 755 (rwxr-xr-x) 文件名
            chmod u=rwx,g=rx,o=rx 文件名
            chmod u-x,g+w,  文件名 (+/- 增加/减少对应权限)
    ACL控制setfacl,getfacl
        setfacl:设置文件访问控制规则
            -m给文件加扩展acl规则
            -x给文件移除acl规则
            -b移除文件所有acl规则
            -R地柜进行操作
            -d设置默认的acl规则
        getfacl:获取访问控制规则
        注:若a用户原来对文件只有 r 权限,设置的acl是 setfacl  -m  u:a:w  file  ,
        则设置完acl后,用户a只对文件有 w 权限,没有 r 权限了倘若要让一个文件夹内的所有已存在文件都继承于文件夹的设置的acl的权限属性,  可以使用  setfacl  -R  -m  u:a:rwx  文件名

linux启动流程
开机BIOS自检–》MBR引导–》GRUB2菜单–》加载内核–》systemed进程初始化
init和systemed的区别:
init:
1.启动时间长,串行启动
2.启动脚本复杂
systemd:
1.按需启动,减少系统资源消耗
2.并行启动,减少启动等待时间
运行级别 说明 Rehl 6/7 命令 Rhel7 命令
0 关机状态,使用该级别将会关机 init 0 poweroff
1 系统救援模式,多用于系统维护 init 1 systemctl isolate rescue.target
2 字符界面的多用户模式(不可访问网络) init 2 systemctl isolate mutil-user.target
3 字符界面的完整多用户模式,大多数服务器主机运行此级别 init 3 systemctl isolate mutil-user.target
4 未分配使用 init 4 systemctl isolate mutil-user.target
5 图形界面的多用户模式,提供了图形桌面操作环境 init 5 systemctl isolate graphical.target
6 重新启动主机 init 6 reboot
查看运行级别:
runlevel:显示当前运行级别和切换当前运行级别
systemctl get-default:显示当前运行级别
永久设置开机模式:
systemctl set-default multi-user.target 文本模式
systemctl set-default graphical.target 图形化模式
linux服务管理:
启动某服务:systemctl start httpd
停止某服务:systemctl stop httpd
重启某服务:systemctl restart httpd
检查某服务:systemctl status httpd
删除某服务:停止应用,删除其配置
设置服务开机自启:systemctl enable httpd
设置服务禁止自启:systemctl disable httpd
加入自定义服务:systemctl load test
查询服务是否开机自启:systemctl is-enabled httpd
查询启动失败的服务:systemctl --failed
systemd常用命令:
列出所有可用单元:systemctl list-unit-files
列出所有运行的单元:systemctl list-unit-files|grep enable
列出所有可用服务:systemctl list-unit-files --type=service
屏蔽httpd服务:systemctl mask httpd
SELinux
SELinux的模式:
enforcing:阻止违规行为,同时对违规行为做日志记录
permissive:不对违规行为进行阻止,只记录日志
disable:selinux不开启
获取当前工作模式:getenforce
修改当前工作模式:
1.配置文件/etc/sysconfig/selinux 需要重启生效
2.setenforce 0/1 设置为0时模式为permissive,设置为1时模式为enforcing
不需要重启
3.在系统刚启动引导的时候按e进入kernel层对selinux做控制,selinux=0
开机后模式为disabled enforcing=0 开机后模式为permissive
4.安装图形化管理工具,yum install policycoreutils-gui 安装插件
使用system-chkconfig-selinux启动
安全属性:
security context:user:role:type:range
user:用户,selinux定义了三种用户:超级用户,系统用户,普通用户
role:角色,role based access control RBAC,一个U可以属于多个role
不同的role具有不同的权限
type:表示文件(进程)所属的domain,一个domain有什么权限都需要allow语句实现
range:selinux对文件和进程进行了分级,不同级别的资源需要不同的级别进程才能访问
查看文件或文件夹的SContext:ls Z 文件/ls -dZ 文件夹
查看进程deSContext:ps -auxZ
修改SContext:一般修改的是type字段
chcon -R -t public_content_t /home/xie chcon表示运行状态下的修改,修改完立即生效
restorecon可以将之前所做的修改还原。在修复模式等特殊环境下 ,chcon所做的修改会被重置

        semanage fcontext -a -t httpd_sys_content_t'/srv/www(/.*)?' semanage表示系统层
        的修稿,修改完重启生效,无法通过resorecon还原,只能重新设置新的标签
        
        restorecon -Rv /home/xie 表示还原或触发系统默认标签类型 -R表示递归式还原 -v表示显示
        还原标签的变化信息
    布尔值:布尔决定是否在运行是应用某些规则
        获取布尔值:getsebool -a 
        修改布尔值:setsebool -P httpd_enable_cgi on/off -P表示永久生效
    获取端口标签:semanage port -L
    SELinux日志机制:如果SElinux的监听服务开启,setroubleshootd(RHEL5/6)/auditd(RHEL7),SElinux相关的日志存放在/var/log/audit/audit.log文件中。如果SElinux的监听服务没有开启,则日志机制会被 rsyslog 代理监听,SElinux相关的日志就会被存放在/var/log/messages文件中

Netfilter
Netfilter是Linux 2.4内核引入的全新的包过滤引擎,位于Linux内核中的包过滤
功能体系,基于内核控制,实现防火墙的相关策略。Netfilter 由一些数据包过滤
表组成,这些表包含内核用来控制信息包过滤的规则集。Netfilter在数据包必须
经过且可以读取规则的位置,设有5个控制关卡。这5个关卡处的检查规则分别放在
5个规则链中叫钩子函数(hook functions)。也就是说5条链对应着数据包传输
路径中的5个控制关卡,链中的规则会在对应的关卡检查和处理。任何一个数据包,
只要经过本机,必然经过5个链中的某个或某几个。
Netfilter中5个规则链
PREROUTING 数据包进入网络接口后,路由之前
INPUT 数据包从内核流入用户空间
FORWARD 在内核空间中,从一个网络接口进入,到另一个网络接口去。转发过滤
OUTPUT 数据包从用户空间流出到内核空间
POSTROUTING 路由后,数据包离开网络 接口前
链其实就是从包含众多规则的检查清单,每一条链中包含很多规则。当一个数据包
到达另一个链时系统就会从链中的第一天规则开始检查,看该数据包是否满足规则
所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包,否则
就继续检查下一条规则,如果该数据包不符合链中的任何一条规则,系统就会根据该链
预先定义的默认策略来处理数据包,
数据包的传输过程:
1.当一个数据包进入网卡时,首先进入PREROUTING链,内核根据数据包目的IP判断
是否需要转送出去
2.如果数据包就是进入本机的,它会沿着图向下移动,到达INPUT链。数据包到了INPUT
链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包 会经过OUTPUT
链,然后到达POSTROUTING链输出
3.如果数据包要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链
然后到达POSTROUTING链输出
IPtables:
iptables是用来管理防火墙的工具,属于静态防火墙,我们通过IPtables将更多过滤
规则写入内核,然后Netfilter根据规则进行过滤数据包。所以实际上iptables是 通过调用
Netfilter来进行防火墙管理的,它本身不具有过滤数据包的功能。iptables程序位于/sbin/IPtables
使用5种规则链,4个规则表,规则表的作用是容纳各种规则链。规则表的划分依据是防火墙的
作用
iptables中的四个规则表
raw表 确定是否对该数据包进行状态跟踪
mangle表 为数据包设置标记
nat表 修改数据包中的源,目标IP或端口
filter表 确定是否对数据包进行放行过滤
匹配顺序:raw–>mangle–>nat–>failter
规则链之间的顺序:
入站:PEROUTING–>INPUT
出站:OUTPUT–>POSTROUTING
转发:PREROUTING–>FORWARD–>POSTROUTING
规则链的匹配顺序:
按顺序依次查找,匹配即停止(LOG策略除外)
没有匹配的按照默认策略处理
数据包的常见控制类型:
ACCEPT:允许通过
DROP:直接丢弃,不会huiying
REJECT:拒绝通过,必要时会给予提示
LOG:记录日志信息,然后传给下一条规则
iptables的基本语法
iptables 【-t 表名】 选项 链名 条件 【-j 控制类型】
不指定链名时默认指定所有
除非默认策略,否则必须指定匹配条件
选项,链名,控制类型必须使用大写字母,其余为小写
规则的匹配条件:
通用匹配:可以直接使用,不依赖任何条件或拓展
协议匹配:-p 协议名 iptables -A INPUT -p icmp -j DROP
地址匹配:-s 源地址/-d 目标地址 iptables -A INPUT -s 192.168.1.0/24 -j DROP
接口匹配:-i 入站网卡/-o出站网卡 iptables -A INPUT -i ens33 -p icmp -j DROP
隐含匹配:需要用特定的协议匹配为前提,包括端口,TCP标记,ICMP类型等
端口匹配:–sport 源端口/–dport 目标端口 iptables -A INPUT -p tcp -drot 20:21 -j ACCEPT
TCP标记匹配:–tcp-flags 检查范围 被设标记
ICMP类型匹配:–icmp-type ICMP类型
显示匹配:要求以“-m 扩展模块”的形式明确指出类型,包括多端口,MAC地址,IP范围,数据包类型
多端口匹配:-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
iptables -A INPUT -p tcp -m multiport --dport 25.80.110.143 -j ACCEPT
IP范围匹配:-m iprange --src-range IP范围
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.21-192.168.1.31 -j ACCEPT
MAC地址匹配:-m mac --mac-soruce MAC地址
iptables -A INPUT -m mac --mac-sorce 00:0c:29:c0:55:3f -j DROP
添加新规则:
-A 在链的末尾追加规则
-I 在链的开头加入规则
iptables -t failter -A INPUT -p tcp -j ACCEPT 在filter表的INPUT链中加入一条允许所有允许TCP协议的规则
iptables -A INPUT -p tcp -j ACCEPT 未加表名默认是filter表
iptables -I INPUT -p udp -j ACCPUT
iptables -I INPUT 3 -P icmp -j ACCEPT在INPUT链的第3条加入一条允许所有的icmp协议的规则
删除,清空所有的规则
-D 删除链内指定序号的一条规则
-F 清空所有的规则
iptables -D INPUT 3
iptables -t raw -F 清除raw表中所有的规则
iptables -F 清除所有的规则重启后恢复
设置默认规则
-P 指定链设置默认规则
iptables -t nat -P OUTPUT ACCEPT 给nat表中设置默认的accept规则
规则的备份和还原
导出规则:iptables-save > /tmp/xie/1.txt 将配置导入到对应文件中
还原规则:iptables-restore < /tmp/xie/1.txt
规则永久生效:
iptables不是一个守护进程,所做的修改仅临时生效
保存规则:service iptables save
services iptables start / stop / restart 开启/停止/重启 iptables服务
chkconfig --level 5 iptables on / off  使服务开启自启 / 不自启
iptables做本地端口转发
iptables -t nat -L #查看端口转发记录
iptables -t nat -A PREROUTING -d 192.168.10.21 -p tcp --dport 2222 -j DNAT --to-destination 192.168.10.21:22 #将192.168.10.21的2222端口的流量都转发给192.168.10.21的22端口
iptables -save #保存
iptables -t nat -F #清除规则
firewalld:firewalld本身不具有防火墙功能
firewalld的配置模式:配置文件以xml文件为主
1./etc/firewalld/services/ 用户自定义配置文件
2./usr/lib/firewalld/services/ 系统配置文件,预置文件不建议修改
过滤规则集合:zone
一个zone就是一套过滤规则
每个zone对应一个xml文件在/usr/lib/firewalld/services/下,
<zone名>.xml在其中添加过滤规则即可
每个zone都有一个默认的行为处理,default,ACCEPT,REJECT,DROP
firewalld提供9个zone:
1.drop 流入包均丢弃,不做响应,仅允许流出
2.block 任何流入包均被拒绝,返回icmp-host-prohibitrd报文/icmp6
-adm-prohibitrd报文。只允该系统初始化网络连接
3.public默认的zone,部分公开,不信任网络中的其他计算机,只放行特定网络服务
4.extermal 只允许选中网络,用于伪装路由器
5.dmz允许隔离区内的电脑有限的被访问
6.work 用在工作网络,允许选中的服务通过
7.home 用在家庭网络,信任大多数计算机,只允许选中的服务通过
8.intermal 用于内部网络,只允许选中的服务通过
9.trusted 允许所有网络连接,即使没有开放任何服务使用此zone的流量允许通过
防火墙的动态监测
firewall-cmd --list-all //列出所有的已配置接口的配置信息
firewall-cmd --state //查看防火墙的状态
firewall-cmd --get-active-zones //查看防火墙激活的zone区域
firewall-cmd --get-services //查看防火墙预定义的服务
firewall-cmd --get-default-zone //查看防火墙默认的zone区域
firewall-cmd --set-default-zone=home //将防火墙默认的区域设置为home区域
firewall-cmd --get-service --permanent //查看永久生效的服务
firewall-cmd --list-rich-rules //列出所有的富规则
防火墙的配置
在区域中添加服务或端口:
临时设置:firewall-cmd -zone=public --add-service=mysql

                        firewall-cmd    --add-port=8080-8081/tcp    //不写区域的话默认是public区域

        在区域中移除服务或端口:

        临时设置:firewall-cmd   --remove-service=https

                        firewall-cmd   --remove-port=8080-8081/tcp

        在区域中永久添加和移除服务或端口(--permanent参数):

        永久设置:firewall-cmd   --permanent    --add-service=mysql

                        firewall-cmd   --permanent   --remove-port=8080-8081/tcp

                        firewall-cmd  --reload           //重载,永久设置需要重载配置文件才能生效              

        富规则:富规则允许你创建更复杂的配置

            firewall-cmd  --zone=public  --add-rich-rule="rule family="ipv4"  source address="192.168.10.0/24"   service name=ssh accept  "     //zone区域添加一个富规则,允许来自源网段192.168.10.0/24 的数据
            firewall-cmd  --permanent  --zone=public  --add-rich-rule="rule family="ipv4"  source address="192.168.10.0/24"  port  protocol="tcp" port="8080" accept"   //在zone区域中永久添加一个富规则,允许来自源网段 192.168.10.0/24 的tcp协议的8080端口的数据
            firewall-cmd   --zone=public  --remove-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="http" accept "      //移除zone区域的富规则--来自192.168.10.0/24网段的http服务
        防火墙的选择
        Rhel7中既有iptables防火墙,又有firewalld防火墙。但是同一时刻只能开一个,所以必须得关闭其中一个防火墙。一般我们都是关闭iptables防火墙,而打开firewalld防火墙,因为firewalld比iptables强大太多了。
        开启firewalld防火墙,并且使其开机自启动,关闭iptables防火墙
            systemctl  mask     iptables.service          //屏蔽iptables服务
            systemctl  unmask iptables.service           //启用iptablees服务
            systemctl  start       firewalld.service
            systemctl  enable   firewalld.service    
        打开路由转发功能 : 
            echo  1 > /proc/sys/net/ipv4/ip_forward   (临时开启) 
            sysctl  -w  net.ipv4.ip_forward=1  (临时开启)
            vim  /etc/sysctl.conf  , 将net.ipv4.ip_forward=0 改为 =1,然后 sysctl -p   /etc/sysctl.conf 使之生效  (永久开启IP转发)
        端口转发:
        firewall-cmd   --zone=public   --add-rich-rule="rule  family=ipv4  forward-port port=10000  protocol=tcp to-port=22"   //将外部访问本机10000端口的流量转发至本机22号端口
        firewall-cmd  --zone=public  --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.10.24    //将外部访问本机8080端口流量转到192.168.10.24上的80端口

监视系统进程(ps,top)
程序:保存在硬盘,光盘等介质中可执行代码和数据,保存的静态代码
进程:在cpu及内存中运行的程序代码动态执行的代码每个进程可以有多个子进程
PID:标识进程的唯一标识
ps:静态查看系统的进程
top:动态查看系统的进程
pgrep:标识查看指定服务的pid
-u 查看指定用户的进程信息
pstree:树状显示进程相关信息
进程后台管理
ctrl+z 前台进程调入后台,挂起,进程并没有死亡,只是卡在哪里
ctrl+c 结束进程
jobs 查看后台进程
fg 3 将后台第3个进程在前台运行(不加数字时,jobs程序为+的程序被优先掉回)
bg 3 将后台的第2个进程后台运行(不加数字时,jobs程序为+的程序被优先掉回)
& 直接将进程放在后台运行
kill 向进程发送kill信号,强制杀死进程kill -s 9 PID -s 9 参数是传递给进程信号为9 强制杀死进程
killall 杀死同一命令的所有进程
top:反应系统进程动态信息,默认每3秒更新一次,顶部始终显示系统当前活跃进程
PID:进程ID
USER:运行进程的用户
PR:系统默认的优先级,PR总比NI大20
NI:用户可以修改的优先级,范围从-20–19数字越小值越大,在系统运行中可以使用
renice命令修改其优先级,renice -n - 20 PID 当进程没有运行时可以使用nice -n 20 httpd 开启进程时指定优先级
VIRT:虚拟内存
RES:当前进程使用的内存
SHR:共享内存
S:状态S(sleep)或者R(running)
%CPU:进程占用CPU的比重
%MEM:进程所占用的内存比重
Time:进程运行的时间
COMMAND:进程的指令
ps:process status的缩写,列出系统中当前运行的就进程
PID:运行着的进程
TTY:命令所运行的位置
TIME:运行着的该命令所占用的CPU处理时间
CMD:该进程所运行的命令
ps aux
a选项表示查看
u选项表示进程所属的用户信息
x选项表示显示默认信息外的信息
ps -ef
e参数表示全部进程
f参数表示全格式
UID:运行进程的用户
PID:进程的编号
%CPU:进程占用CPU的比重
%MEM:进程所占用的内存比重
VSZ:虚拟内存
TTY:当前是否有登录 ,?表示没有
STAT:
S:当前状态为睡眠
s:当前进程有多个子进程
I:当前进程可能开启多个子进程
R:当前进程正在运行中
+:表示这个进程在前台运行
Z:表示僵尸进程
<:表示当前进程优先级高
START:进程开始的时间
Time:进程运行的时间
COMMAND:进程命令所在的目录
根据PID过滤当前PID所对应进程的信息脚本
#! /bin/bash
# Function: 根据用户输入的PID,过滤出该PID所有的信息
read -p "请输入要查询的PID: " P
n=ps -aux| awk '$2~/^'$P'$/{print $11}'|wc -l
if [ $n -eq 0 ];then
echo “该PID不存在!!”
exit
fi
echo “--------------------------------”
echo “进程PID: $P”
echo “进程命令:ps -aux| awk '$2~/^'$P'$/{print $11}'
echo "进程所属用户: ps -aux| awk '$2~/^'$P'$/{print $1}'"
echo “CPU占用率:ps -aux| awk '$2~/^'$P'$/{print $3}'%”
echo “内存占用率:ps -aux| awk '$2~/^'$P'$/{print $4}'%”
echo “进程开始运行的时刻:ps -aux| awk '$2~/^'$P'$/{print $9}'
echo “进程运行的时间:ps -aux| awk '$2~/^'$P'$/{print $10}'
echo “进程状态:ps -aux| awk '$2~/^'$P'$/{print $8}'
echo “进程虚拟内存:ps -aux| awk '$2~/^'$P'$/{print $5}'
echo “进程共享内存:ps -aux| awk '$2~/^'$P'$/{print $6}'
echo “--------------------------------”
根据进程名过滤当前所有PID进程的信息
#! /bin/bash
# Function: 根据输入的程序的名字过滤出所对应的PID,并显示出详细信息,如果有几个PID,则全部显示
read -p “请输入要查询的进程名:” NAME
N=ps -aux | grep $NAME | grep -v grep | wc -l ##统计进程总数
if [ $N -le 0 ];then
echo “该进程名没有运行!”
fi
i=1
while [ $N -gt 0 ]
do
echo "进程PID: ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $2}'"
echo “进程命令:ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $11}'
echo "进程所属用户: ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $1}'"
echo “CPU占用率:ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $3}'%”
echo “内存占用率:ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $4}'%”
echo “进程开始运行的时刻:ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $9}'
echo “进程运行的时间:ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $11}'
echo “进程状态:ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $8}'
echo “进程虚拟内存:ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $5}'
echo “进程共享内存:ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $6}'
echo “***************************************************************”
let N-- i++
done
查看网络连接信息(netsat)
netstat:该命令用于显示各种网络相关信息,网络连接,路由白边,接口状态,masquerade连接,多播成员
命令的输出有两部分,第一部分Active Internet connections ,称有源TCP连接
其中“Recv-Q”和“Send sockets”,成为有源Unix域套接口(和网络套接字一样,但是只能用)
第二部分是Active UNIX domain sockets,称为有源Unix域套接字
proto表示连接使用的协议
refcnt表示连接到本套接子口上的进程号
types表示套接口的类型:STREAM表示TCP套接字,DGRAM表示UDP套接字
state表示当前套接口当前的状态
path表示到套接口的进程所使用的路径名
注:netstat命令默认是不显示LISTEN状态的网络连接,和LISTEING状态的UNIX域连接只有使用-a或者-I参数的命令才能显示
命令参数:
-a 显示所有状态的连接
-I列出有在监听状态的连接
-t显示tcp连接
-u显示udp相关连接
-n拒绝显示别名,能显示数字的全部转化为数字
-p显示建立连接的程序名
-r显示路由信息,路由表
-e显示扩展信息
-s按各个协议进行统计
-c每个一个固定时间执行netstat命令
文件进程,端口关联(lsof)
lsof:当列出一个系统进程打开文件的工具,在linux环境下,一切皆文件
常用命令
lsof | grep abc.txt 显示开启abc.txt的进程
lsof -c abc 显示abc进程现在打开的文件
lsof -p 1234 列出进程号为1234的进程锁打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /usr/loacl/ 显示目录下被进程打卡的文件
lsof +D /usr/local/ 递归搜索目录下被进程打开的文件
lsof -d 4 显示文件描述为4的进程
lsof -i 端口号 显示符合条件的进程
lsof -p 699 显示PID为699的进程所打开的文件
lsof -i:22 打开所有与22端口有关的进程
ls -lh /proc/699/exe 显示PID为699的进程的启动程序
cp /proc/699/exe 1 复制PID为699的进程的启动程序为1
计划任务管理
at
at 20:00 今天20:00
at 3am+2days 两天后的凌晨三点
at now+30minutes 30分钟后
at 3:00 20157-7-17
结束:Ctrl+d
查询 alq或at -l
删除:atrm 2
查询指定计划内容 at -c 2
crontab:周期性计划任务,按照预先设置的时间周期执行用户指定的操作
主要配置文件:
全局配置文件:/etc.crontab文件和?etc、cron.d/目录 内的文件
黑名单/etc/corn.deny
白名单 /etc/cron.allow
用户自定义文件:/var/spool/cron/用户名
编辑计划任务: crontab -e -u 用户名 此命令会在 /var/spool/cron 下创建一个以用户名为文件名的定时任务文件
查看计划任务: crontab -l -u 用户名
删除计划任务: crontab -r -u 用户名
有6个参数,分别代表 分、时、天、月、周、要执行的命令 。如果打开的时候没指定用户名,则这里也不需要写用户名,代表当前编辑用户
.---------------- minute (0 - 59)
| .------------- hour (0 - 23)
| | .---------- day of month (1 - 31)
| | | .------- month (1 - 12) OR jan,feb,mar,apr …
| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | |
* * * * * command

            *号代表每一 ,比如
            
            */5  *  15-20  7-8  3-4   command   每五分钟,每一个小时,一个月的15-20号,一年的7-8月,一周的周3-周4 执行命令
            这里的command命令可以是一个可执行文件的路径,也可以是一条命令

lvm磁盘管理
LVM:逻辑卷管理器,可以动态调整磁盘容量,提高磁盘管理灵活性,绝大多数分区
可以基于LVM创建,但是/boot挂在分区不能基于LVM分区创建
linux下的磁盘分区,卸载和磁盘配额
查看磁盘信息
fdisk:这个命令是 磁盘分区表操作工具,fdisk能将磁盘分区,同时也能为每个
分区指定类型
fdisk -l:查看磁盘分区表
df -Th:显示已挂在的磁盘文件系统
cat /proc/partitions:显示已识别的所有分区
linux磁盘 分区
1.添加并识别硬件设备:fdisk -l 查看是否识别或者ls -l /dev/sdb 查看是否有这个设备
2.创建分区并识别分区:fdisk /dev/sdb 按照步骤一步步对硬盘分区,之后保存退出
n创建新的磁盘分区
d删除已存在的磁盘分区
l查看支持的磁盘分区类型
t转换分区类型
p查看磁盘的分区信息
w保存修改并退出
q不保存直接退出
识别新分区:partprobe /dev/sdb
cat /proc/partitions:显示已识别的所有分区
3.制作文件系统 mkfs.ext4 /dev/sdb1 对sdb硬盘的第一个分区制作etx4文件系统
4.制作磁盘标签 e2lable /dev/sdb1 newpart 给分区起一个别名
5.创建挂载点 mkdir /mnt/sdb1 在/mnt目录下新建一个挂载点
6.将分区信息写入文件分区表 修改/etc/fstab文件,将分区信息写入,保存并退出
1.第一列表示待挂载的文件系统,挂载方式可以是设备路径/dev/sdb1可以是LABEL可以是UUID
2.第二个是挂载点,表示设备使用后,从哪个接入点使用磁盘空间
3.第三列是文件系统类型,制作文件系统时的格式卸载这个位置
4.第四列是挂载时的磁盘参数,默认可包含可读可写
5.第五列是是否对磁盘做dump备份
6.第六列是是否对磁盘做fsck检查
7.挂载文件系统 mount -a 读取fstab文件系统。df -Th查看是否挂载上
mount -a挂载所有文件,使用df -Th查看所有的文件系统,swqp分区不会显示,因为没有对应的挂载点
extend扩展分区sdb4也不会显示在这里,因为仅仅是一个分区,并没有分配文件系统
swap分区是创建一个虚拟内存,开启虚拟内存的指令为 swap -a将开启所有的fstab文件中的swap分区
关闭使用swapoff,仅关闭一个swapoff /dev/sdb2 关闭所有swapoff -a 查看虚拟内存空间变化可以使用
free -m查看当前虚拟内存可以使用swapon -S
自动分区脚本
#! /bin/bash
# Function:对硬盘进行分区,得到一个标准的linux文件系统(ext4/xfs)的主分区
cat /proc/partitions > old
read -p “请输入你要分区的硬盘(写绝对路径,如:/dev/sda):” A
if [ -e $A ];then
echo “true”
else
echo “该设备不存在!!”
exit
fi
read -p “请输入你要创建的磁盘分区类型(这里只能是主分区,默认按回车即可):” B
read -p “请输入分区数字,范围1-4,默认从1开始,默认按回车即可:” C
read -p “请输入扇区起始表号,默认按回车即可:” D
read -p “请输入你要分区的分区大小(格式:如 +5G ):” E
fdisk $A << EOF
n
p
$C
$D
$E
w
EOF
echo “一个标准的linux文件系统的分区已经建立好!!”
partprobe $A
echo “-------------------------------”
cat /proc/partitions
cat /proc/partitions > new
F=diff new old | grep "<" | awk '{print $5}'
echo “-------------------------------”
echo $F
echo “你想对新分区设定什么类型的文件系统?有以下选项:”
echo “A:ext4文件系统”
echo “B:xfs文件系统”
read -p “请输入你的选择:” G
case G i n a ∣ A ) m k f s . e x t 4 / d e v / G in a|A) mkfs.ext4 /dev/ GinaA)mkfs.ext4/dev/F
echo “该分区将被挂载在 “/mnt/$F” 下”
m=ls /mnt/|grep $F | wc -l
if [ m − e q 0 ] ; t h e n m k d i r / m n t / m -eq 0 ];then mkdir /mnt/ meq0];thenmkdir/mnt/F
fi
n=cat /etc/fstab | grep /dev/$F| wc -l
if [ n − e q 0 ] ; t h e n e c h o " / d e v / n -eq 0 ];then echo "/dev/ neq0];thenecho"/dev/F /mnt/KaTeX parse error: Undefined control sequence: \/ at position 137: … sed -i '/^\̲/̲dev\/F/c/dev/ F / m n t / F /mnt/ F/mnt/F ext4 defaults 0 0’ /etc/fstab
fi
mount -a
df -Th
;;
b|B)
mkfs.xfs -f /dev/ F e c h o " 该 分 区 将 被 挂 载 在 " / m n t / F echo "该分区将被挂载在 "/mnt/ Fecho""/mnt/F" 下"
m=ls /mnt/|grep $F | wc -l
if [ m − e q 0 ] ; t h e n m k d i r / m n t / m -eq 0 ];then mkdir /mnt/ meq0];thenmkdir/mnt/F
fi
n=cat /etc/fstab | grep /dev/$F | wc -l
if [ n − e q 0 ] ; t h e n e c h o " / d e v / n -eq 0 ];then echo "/dev/ neq0];thenecho"/dev/F /mnt/KaTeX parse error: Undefined control sequence: \/ at position 135: … sed -i '/^\̲/̲dev\/F/c/dev/ F / m n t / F /mnt/ F/mnt/F xfs defaults 0 0’ /etc/fstab
fi
mount -a
df -Th
;;
)
echo “你的输入有误!!”
esac
linux分区卸载
1.卸载所有已经挂载的分区,先查看哪些分区已经挂载上df -Th,再依次卸载,最后关闭分区,‘
使用umount时候,显示设备正忙可以使用 fuser -mv /mnt/sdbx 来查看那个进程正在使用这个
设备然后kill即可
2.修改/etc/fstab文件,把我们分区信息都给删除了或者注释掉
3.进入/dev/sdb里面,fdisk /dev/sdb一路摁d把所有的分区都删除然后使用P查看是否删除,w保存
之后刷新partprobe /dev/sdb查看分区信息 cat /proc/partitions
linux磁盘配额
1.挂载的同时需要为文件系统添加支持配额的选项:usrquota ,grpquota
umount -a
2.配额检查quotacheck -augcv 在分区中生成配额文件aquota.user和aquota.group
-a 扫描所有支持配额的分区
-u 扫描磁盘并计算用户所占用的文件数
-g 扫描磁盘并计算所占用的文件数
-c 创建配额文件 aquota.user和aquota.group
-v 显示详情信息
执行后,会检查所有 支持磁盘配额的分区,如果分区前有配额,先关闭,再次开启会有配置文件被更新
如果是第一次创建磁盘配额,那么会提示之前没有任何配额文件,并且在分区中生成配额文件aquota.user和aquota.group
3.为用户建立配额信息edquota -u/g 用户名/组名
edquota -g IT 编辑组IT的配额
4.开启/关闭配额功能 quotaon -a quotaoff -A
5.查看配额信息 quota -u quota -g repquota -a
内核升级:
查看当前内核版本:uname -r
查看可升级内核:yum list kernel
升级kernel:
1.yum update kernel
2.rpm -ivh kernel-3.10.0-123.1.2el7.x86_64.rpm
3.yum localinstall kernel-3.10.0-123.1.2.el7.x86_64.rpm
GRUB2内核启动设置
查看已安装kernel版本:cat /boot/grub2/grub.cfg | grep -l ‘red hat’
查看当前设置的启动版本:grub2-editenv list 或者 cat /boot/grub2/grubenv
设置kernel启动版本:grub2-set-default 2
修改grub菜单的超时时间:vim /etc/default/grub中的GRUB_TIMEOUT=10
更新引导配置文件:grub2-mkconfig -o /boot/grub2/grub.cfg
GRUB2引导菜单加密
1.通过grub2-mkpasswd-pkdf2生成加密密码
2.打开/etc/grub.d/00_header文件,在末尾追加加密密码
3.更新配置文件使其生效 grub2-mkconfig -o /boot/grub2/grub.cfg
GRUB2引导故障及修复
GRUB是大多数linux系统默认使用的引导程序,可以通过启动菜单的方式选择进入不同的操作系统
当配置文件/boot/grub/grub.conf 文件丢失或关键配置出错,或MBR记录中的引导程序遭到破坏时
linux主机启动后可能出现grub>提示符
修复:进行手动引导
1.set root=(hb0,msdos1)指定引导分区在第一块硬盘的第一个分区
2.linux /vmlinuxz-3.10.0-123.el7.x86_64 root=/dev/mapper/rhel_red-root指定内核将根的位置交给文件系统
3.linux /initramfs-3.10.0-123.el7.x86_64.img加载初始化镜像问硬件加载驱动,与上一步内核版本相同
4.boot 引导进入系统
5.进入系统后在硬盘sda上安装grub2,重新覆盖原有的引导
6.更新配置文件grub2-mkconfig -o /boot/grub2/grub.cfg让grub2自己识别不同的系统,自己创建引导
救援模式管理
救援模式的作用:
可以更改root密码;
恢复硬盘,文件系统操作
系统启动失败时使用救援模式
如何进入救援模式:进入系统BIOS设置,VMware中可以电源–>打开电源时进入固件。就可以进入
BIOS设置,将CD调整到最前面,然后保存退出即可
选择continue继续,之后会提示被挂载到了/mnt/sysimages 路径下,然后进行磁盘分区强制检查,ext文件检查(fsck -f)
xfs文件系统检查 xfs_repair -l
日志分析和管理
日志的作用,分类,管理,轮转和级別
日志的作用:
记录系统,程序运行中发生的各种事件
日志文件的分类:
内核及系统日志:由系统服务rsyslog统一管理,日志格式相似
用户日志:记录系统用户登录及退出系统的相关信息
程序日志:由各种应用程序独立管理的日志文件,格式不统一
日志管理策略:
日志的备份和归档
延长日志的保存期限
控制日志的访问权限
集中日志管理
日志的轮转和切割:
实现对当前日志的归档,开始新的日志,删除早期的日志,linux中,日志轮转和切割
服务是由logrotate提供的(/etc/cron.daily/logrotate)logrotate是作为corn的一个每日
任务周期执行的,具备自动轮转,压缩,搬迁 和右键通知到日志系统的多项功能
日志消息的级别:
0 EMERG(警告) 会导致主机系统不可用
1 ALLERT(警告) 必须马上采取解决措施的情况
2 CRIT(严重) 比较严重的情况
3 ERR(错误) 运行出现错误
4 WARNING(提醒) 可能会影响系统功能的时间
5 NOTICE(注意) 不会影响系统但值得注意
6 INFO(注意) 一般信息
7 DEBUG(调试) 程序或系统调试系统等
rsyslog服务
rsyslog服务是由 rsyslogd程序提供的
程序目录:/sbin/rsyslog.log
rsyslog配置文件所在目录:/etc/rsyslog/conf
rsyslog相关文件:/etc/sysconfig/rsyslog
和日志轮转(切割)相关文件:/etc/logrotate.d/syslog
系统中的程序,在收集日志的时候都是调用syslog()函数,这个函数的作用是发送日志消息
给系统的loger,然后根据rsyslogd程序的配置文件的规则将日志消息按照不同格式写入不同文件中
设备 Facility 和 级别 对应的文件
.info; mail.none; authpriv.none; cron.none (任何设备的这些级别) /var/log/messages
authpriv.
(authpriv设备的所有级别) /var/log/secure
mail.
(mail设备的所有级别) -/var/log/maillog
cron.* (cron设备的所有级别) /var/log/cron
.emery (所有设备的emery级别) :omusrmsg: (打印到终端)
local0.* ~ local6.* 自己可定义文件
名称 路径
内核、公共消息日志、系统主日志文件 /var/log/messages
用户登录日志 /var/log/secure
计划任务日志 /var/log/cron
跟yum安装有关 /var/log/yum.log
系统引导日志 /var/log/dmesg
邮件系统日志,跟postfix有关 /var/log/maillog
当前登录的用户,二进制文件,可用 last 查看 /var/log/wtmp
最近登录的用户 , 二进制文件 ,可用 lastb 查看 /var/log/btmp
所有用户的登录情况,二进制文件,可用 lastlog 查看 /var/log/lastlog
journal日志的查看
journalctl 显示所有的日志信息
journalctl -n 10 显示最近10条的日志信息
journalctl -u nginx.service 查看nginx服务的日志自信息
journalctl _PID=1234 查看PID进程为1234的日志信息
journalctl _UID=0 查看UDI为0的用户的日志信息
journalctl /usr/bin/bash 查看指定路径可执行文件的日志信息
journalctl --since today 查看今天以来的日志的信息
/var/log/message:几乎所有的开机系统发生的错误都会在此记录;
/var/log/secure:记录登录系统存取数据的文件,例如:ssh、pop3、telnet,ftp等都会记录在此.。
/var/log/wtmp:记录ssh登录成功的记录,二进制文件
/var/log/btmp:记录ssh登录失败的记录,二进制文件
/var/log/lastlog 记录每个用户最后的登录信息;
/var/log/boot.log:记录一些开机或者关机启动的一些服务显示的启动或者关闭的信息;
/var/log/maillog:记录邮件的存取和往来;
/var/log/cron:用来记录crontab定时任务的记录;
/var/log/httpd:http服务的记录
/var/log/audit:包含被 Linux audit daemon储存的信息
/var/log/dmesg:内核日志;
/var/log/cpus: CPU的处理信息;
/var/log/anaconda.log:在安装Linux时,所有的安装信息记录
/var/log/syslog: 事件记录监控程序日志;
/var/log/auth.log: 用户认证日志;
/var/log/daemon.log: 系统进程日志;
/var/log/mail.err :邮件错误信息;
/var/log/mail.info: 邮件信息;
/var/log/mail.warn: 邮件警告信息;
/var/log/daemon.log: 系统监控程序产生的信息;
/var/log/kern: 内核产生的信息;
/var/log/lpr : 行打印机假脱机系统产生的信息;
/var/log/sa:包含每日由sysstat软件包收集的sar文件。
/var/log/yum.log:使用yum安装的软件包的记录
shell脚本
shell:shell是一个命令解释器,其作用是解释执行用户输入的命令及程序
当命令或程序语句不在用来下执行,该程序文件就被成为shell脚本。在shell
脚本中内置很多命令,语句以及循环控制,然后这些命令一次执行完毕,非交互式
shell适合处理纯文本的数据,所以在linux中适合使用
shell脚本的类型:
shell脚本语言是若语言类型(无需定义变量的类型)
1.Borune shell 包括borun shell(sh)korn shell(ksh) bourne again shell
2.c shell:csh tcsh
查看系统默认的shell:echo $shell
查看系统支持的shell:cat /etc/shells
shell脚本的执行:
1.bash script-name/sh script-name 本身没有执行权限时使用的方法
2.psth/script-name或./script-name 在当前路径下执行脚本,需要将脚本文件的权限更改为可执行,然后
使用脚本的绝对路径或相对路径就可以执行脚本
3.source script-name或. script-name 使用source或.读入或加载指定的shell脚本文件,依次指定shell脚本
中的语句
shell脚本的规范:
1.第一行选用解释器:#! /bin/bash (#! /bin/sh)
2.在shell脚本中 #后面的内容表示注释
3.shell脚本开头会加入版本信息,版权等
4.shell脚本中尽量不要出现中文注释
5.shell脚本命名.sh为扩展名
6.成对出现括号
7.括号两端至少留空一格
8.流控语句一次写完后在添加
9.适当运用缩进让代码具有阅读性
10常规变量的字符串定义变量值应增加双引号,等号前后不能由空格强引用使用单引号
命令引用使用反引号
11.符号均为英文字符
shell中的变量:
变量赋值:A=xie
read -p “提示信息” 变量名 #交互式赋值
查看变量内容 echo $A(echo ( A ) ) 赋 值 时 引 号 的 作 用 双 引 号 : 允 许 通 过 (A)) 赋值时引号的作用 双引号:允许通过 (A))符号引用变量
单引号:禁止引用其他变量$为普通字符
反引号:命令替换,提取命令执行后的输出结果,全局变量的定义办法是export 变量名
位置参数:变量输入进脚本后具有序号,使用$1、2、3。。。调用
预定义变量:
$# :位置参数的数量
$* :所有位置参数的内容
$? :命令执行后返回的状态,0表示没有错误,非0表示有错误
$$ :当前进程的进程号
$! :后台运行的最后一个进程号
$0 :当前执行的进程名
变量的运算:+ - * / % **(幂运算) ++ – !(逻辑非,取反) &&(与) ||(或)
< > <= >= ==(相等) !=(不相等)= -= +=
常见的算术运算指令:
(()) 整数运算
let 整数运算类似(())
i=2
let i=i+8
echo I 10 e x p r 整 数 运 算 e x p r 2 + 24 e x p r l e n g t h ′ I 10 expr 整数运算 expr 2+2 4 expr length ' I10exprexpr2+24exprlengthchar’
bc linux下的计算器
echo ‘ceshi=1+23+3’|bc
$[] 用于整数运算
echo $[2+5]
shell脚本的条件测试:
1.test测试表达式 :利用test命令测试表达式的方法
2.[测试表达式]:同上
3.[[测试表达式>]]:更新一种
4.((测试表达式)):一般用于if语句中
文件测试操作符:
-d , d的全拼为 directory 文件存在且为目录则为真
-f , f的全拼为 file 文件存在且为文件则为真
-e , e的全拼为 exists 文件存在则为真
-s ,s的全拼为 size 文件存在且大小不为0则为真
-r ,r的全拼为 read 文件存在且可读则为真
-w ,w的全拼为write 文件存在且可写则为真
-x ,x的全拼为executable 文件存在且可执行则为真
-L ,L的全拼为link 文件存在且为链接文件则为真
f1 -nt f2 ,nt的全拼为 newer than 文件f1比文件f2新则为真
f1 -ot f2 ,ot的全拼为older than 文件f1比文件f2旧则为真
字符串测试操作符:
-n 若字符串长度不为0,则为真
-z 若字符串长度为0,则为真
“字符串1” == “字符串2” 若字符串1等于字符串2,则为真
“字符串1” != “字符串2” 若字符串1不等于字符串2,则为真

            注: == 和 !=  两端要有空格  ,(())不能用于字符测试
    整数二元比较操作符
        在[]以及test中使用的比较符号	在(())和[[]]中使用的比较符号	说明
                    -eq	== 或 =	相等,全拼为  equal
                    -ne	!=	
                    不相等,全拼为 not equal
                    -gt	>	大于,全拼为 greater than
                    -ge	>=	大于等于,全拼为 greater equal
                    -lt	<	小于,全拼为 less than
                    -le	<=	小于等于 ,全拼为less equal
        "="和"!="也可以在[]中作比较使用,但在[]中使用包含"<"和">"的符号时,需要用反斜线转义,有时不转义虽然语法不会报错,但是结果可能不对。
        也可以在[[]]中使用包含“-gt”和“-lt”的符号,但是不建议使用
        比较符号两端也要有空格,[] (())  [[]]  两端都要有空格
    逻辑操作符:
        在[]和test中使用的操作符	在[[]]和(())中使用的操作符	说明
            -a	&&	and ,与,两端都为真,才为真
            -o	||	or ,或, 两端有一个为真,就为真
            !	!	not ,非, 两端相反,则结果为真
    测试表达式test,[],{[]},{()}的区别
        测试表达式符号	test	[]	[[]]	(())
        边界是否需要空格	需要	需要	需要	不需要
        逻辑操作符	! 、-a、 -o	! 、-a、 -o	! 、&& 、 ||	! 、&& 、 ||
        整数比较操作符	-eq 、 -gt 、-lt、-ge 、-le	-eq 、 -gt 、-lt、-ge 、-le	-eq 、 -gt 、-lt、-ge 、-le 或  = 、>  、< 、 >= 、 <=	= 、>  、< 、 >= 、 <=
        字符串比较操作符	= 、 == 、!=	= 、 == 、!=	= 、 == 、!=	不支持
        文件操作	-d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot	-d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot	-d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot	不支持
        是否支持通配符匹配	不支持      不支持	支持	不支持
    if条件判断语句:
                #####单条件判断##############
                if  条件判断
                then 
                    命令
                else
                    命令
                fi
                
                #或
                
                if  条件判断;then 
                    命令
                else
                    命令
                fi


                ###双条件判断#####
                if 条件判断
                then
                    命令
                elif 条件判断
                then 
                    命令
                else
                命令
                fi
                
                ##或
                if 条件判断;then
                    命令
                elif 条件判断;then 
                    命令
                else
                    命令
                fi
    case条件判断语句
        case条件语句相当于多分支的if/elif/else条件语句,但是它比这些条件语句看起来更工整
                  case  变量  in
                            one)
                                命令
                    ;;
                            two)
                                命令
                    ;;
                            *) 
                                命令
                    esac 
    for循环语句
        for  条件
        do
            命令
        done
        
        ##或
        
        for  条件;do
            命令
        done
    while循环语句
        while  条件
        do
            命令
        done
    break,continue,exit循环控制语句
        break 、continue在条件语句及循环语句(for、while、if等)中用于控制程序走向;而exit则用于终止所有语句并退出当前脚本。
        break   n	如果省略 n ,则表示跳出整个循环,n 表示跳出循环的成熟
        continue n	如果省略 n ,则表示跳过本次循环,忽略本次循环的剩余代码,进行循环的下一次循环。n表示退到第 n 层继续循环
        exit n	退出当前 shell 程序,n 为上一次程序执行的状态返回值。n 也可以省略,在下一个 shell 里可通过  $?  接收 exit  n 的n值

正则表达式:
正则表达式:正则表示法,常规表示法,单个字符串描述匹配语句的字符串
基本正则表达式:
. 匹配单个任意字符
[a-z] 字符范围,a-z的任意字符
[^a-z] 匹配a-z之外的字符
次数匹配
* 匹配任意多个字符
\? 匹配前面的字符0/1次,前面的字符至少出现一次
+ 匹配前面的字符,至少出现一次
x{n} 匹配x出现的n次
x{n,} 匹配x出现至少n次
x{n,m} 匹配x出现n-m次
位置匹配
^ 只匹配行首
$ 只匹配行尾
< 锚定词首,单词最左侧
/> 锚定词尾,单词最右侧
分组及引用
将一个或多个字符捆绑,作为一个整体
\1,\2,\3 向后引用前面匹配到的第一,第二第三。。。
1、过滤 /etc/passwd 中以s或S开头的行
grep “1” /etc/passwd
2、过滤 /etc/passwd 中不以小写字母开头的行
grep “[a-z]” /etc/passwd
3、过滤 /etc/passwd 中以nologin结尾的行
grep “nologinKaTeX parse error: Expected group after '^' at position 139: … grep "^̲” /etc/passwd

        6、过滤 /etc/passwd 中以r开头的行,r后面可以跟0个或任意多个o(也就是说这行的第一个字符必须是r,这行还可以有0个或任意个o)
        grep "^ro*" /etc/passwd
        7、过滤 /etc/passwd 中以r开头的行,r后面必须跟1个或1个以上的字符(也就是这行第一个字符必须是r,而且这行必须还有其他字符,空格也算字符)
        grep "^r." /etc/passwd
        8、过滤 /etc/passwd 中r后跟了任意字符,任意字符后跟了 h 的行 (也就是这一行必须得有r和h,而且h必须在r的后面)
        grep "r.*h" /etc/passwd
        
        9、过滤/etc/passwd 中,包含 root 单词的行,并且root不和其他字符相邻(空格不算)
        grep "\<root\>" /etc/passwd
        10、过滤 /etc/passwd 中 r后跟了o  o出现0次或者1此的行
        grep "ro\?" /etc/passwd
        11、过滤 /etc/passwd 中 r后跟了o  o出现至少一次的行
        grep "ro\+" /etc/passwd
        12、过滤 /etc/passwd 中, r后跟了o,o只出现2次的行
        grep "ro\{2\}" /etc/passwd
        13、过滤 /etc/passwd 中, r 后跟了o ,o出现至少1次至多2次的行
        grep "ro\{1,2\}" /etc/passwd
        14、 过滤 /etc/passwd 中,r后跟了o,  o 至少出现2次的行
        grep "ro\{2,\}" /etc/passwd
扩展正则表达式:使用egrep,grep -E 
    ?          匹配紧挨在前面的字符0次或者1次
    (m,n)     匹配紧邻在前面的字符至少m次最多n次
    +           至少匹配之前的字符一次
    a|b         匹配a或b
    ()        分组
           1、匹配 /etc/passwd 中r后紧跟了o,o出现0次或者1次的行
            egrep "ro?" /etc/passwd
            2、匹配 /etc/passwd 中r后紧跟了o,o出现至少1次至多2次的行
            egrep "ro{1,2}" /etc/passwd
            3、匹配 /etc/passwd 中r后紧跟了o,o出现至少1次的行
            egrep "ro+" /etc/passwd
            4、匹配 /etc/passwd 中出现root或者halt的行
            egrep "root|halt" /etc/passwd
            5、匹配 /etc/passwd 中出现root on或者halt failed的行
            egrep "(root on|halt failed)" /etc/passwd 
grep
    tr set1 set2    使用set2替换set1
    tr -d set1      删除set1中指定的字符
    tr -s set1      压缩set1中指定的字符
    tr -s set1 set2 使用set2替换set1,并压缩set2中指定的字符
    tr -ds set1 set2 删除set1de字符压缩set2中的字符
    eg:  tr  'A-Z'  'a-z'   <  passwd   将passwd中 A-Z 的大写字符全部替换成 a-z 的小写字符,但是并不会改变passwd中的数据
    tr  'A-Z'  'a-z'  < passwd  >  passwd2   将passwd中 A-Z 的大写字符全部替换成 a-z 的小写字符,然后写入到 passwd2 中
diff 
    diff passwd passwd2 比较两文件的不同
du:查看目录或文件占用大小
    递归查看当前目录下
    -a 指定文件
    -s 仅显示总计
    -h 人性化显示
wc:统计文件中的数据
    -l 统计行数
    -c 统计字节数
    -w 统计字数
    -m 统计字符数
    统计文件夹内文件的个数:         ls -l | grep "^-" | wc -l
    统计文件夹内包括递归文件的个数:   ls -lR | grep "^-" | wc -l
    统计文件夹内文件夹的个数 :     ls -l | grep "^d" | wc -l
    统计文件夹内包括递归文件夹的个数:   ls -lR | grep "^d" | wc -l
find:查找文件或文件夹
    find /tmp -name abc 根据文件名查找
    find /tmp -size -1M 根据文件大小查找-小于+大于
    -type 文件类型
    -user 用户所属
    -perm  权限
    find /etc -atime  3    #查找/etc目录三天之内查看过的文件
    find /etc -mtime -3    #查找/etc目录三天之内修改过的文件 
    find /etc mtime  +3    #查找三天前修改过的文件 
    
    find /etc -type f -newermt '2014-1-1 00:00:00' ! -newermt '2015-1-1 00:00:00'  #查找在2014-1-1 00:00:00和 2015-1-1 00:00:00 之间的文件

gcc使用:
gcc 1.c 文件编译生成1.out
-o 自定义文件名
tcpdump使用
过滤网卡:tcpdump -i eth0 抓取经过eth0我的数据
tcpdump -i lo 抓取环回口的数据包
过滤主机/ip:tcpdump host 192.168.1.1
tcpdump src 192.168.1.2
tcpdump dst 192.168.1.3
过滤端口:tcpdump port 80
tcpdump src port 221
tcpdump dst port 8080
过滤协议:tcpdump udp
tcpdump icmp
抓取特定类型的数据包:
tcpdump -i eth1 ‘tcp[tcpflags] = tcp-syn’ #抓取所有经过网卡1的SYN类型数据包
tcpdump -i eth1 udp dst port 53 #抓取经过网卡eth1的所有DNS数据包(默认端口)
tcpdump -i eth1 ‘((tcp) and ((dst net 172.16) and (not dst host 192.168.1.200)))’ #抓取所有经过网卡1,目的网络是172.16,但目的主机不是192.168.1.200的TCP数据
tcpdump -i eth1 host 172.16.7.206 and port 80 -w /tmp/xxx.cap #抓取所有经过网卡1,目的主机为172.16.7.206的端口80的网络数据并存储
grep的使用:
grep全面搜索正则表达式并把行打印,是一种强大的文本搜索工具,是一个对行进行操作的
搜索工作,它能使用正则表达式搜索问本,并把匹配的行打印出来。

grep的用法:grep 选项 模式 文件

grep不加引号直接过滤字符串;grep在进行模式匹配的时候必须加引号,单双都可以
grep在引用变量的时候必须加双引号。
    grep的选项:
            -r :递归搜索
            -v :反向选取
            -o :只显示被模式匹配到的字符串,而不是整个行
            -l :匹配时不区分大小写
            -A 5:显示匹配到的行时,显示后面5行
            -B 5:显示匹配到的行时,显示前面5行
            -C 5:显示匹配到的行时,显示后后5行
            -E :使用扩展的正则表达式
        grep支持基本正则表达式:基本表达式
        grep -E 也支持扩展正则表达式:扩展正则表达式
    grep支持的字符
        [:digit]:所有数字,相当于0-9或者\d 
        [:lower:]:所有的小写字母
        [:upper:]:所有的大写字母
        [:alpha:]:所有的字母
        [:alnum:]:相当于[0-9a-zA-Z]
        [:space:]:空白字符,相当于\S
        [:punct:]:所有标点符号
    grep -E 或 egrep支持的字符
        \s:匹配任何空白字符,包括空格,制表符,换页符与[\f\n\t\v]
        \S:匹配任何非空白字符,与[^\f\n\r\t\v]等效
        \w:匹配任何字类字符,包括下划线,与[A-Za-z0-9]等效
        \W:匹配任何非单词字符,与[^A-Za-z0-9]等效
    grep -P支持的字符
        \d:数字字符匹配,等效于[0-9]
            1、匹配 eg.text 中以 # 开头,且后面跟了至少一个空白字符,而后又跟了任意非空白字符的行
            grep "^#[[:space:]]\{1,\}[^[:space:]]" eg.text    
            拆开 grep "^# [[:space:]] \{1,\} [^[:space:]]" eg.text
            grep -E "^#\s\{1,\}\S" eg.text
            拆开  grep -E "^# \s \{1,\} \S" eg.text
            
            2、匹配 eg.text 中以 包含了 :一个数字:  的行
            grep ":[[:digit:]]:" eg.text
            拆开 grep ": [[:digit:]] :" eg.text
            grep -P ":\d:" eg.text
            拆开 grep -P ": \d :" eg.text
    分组的例子
        grep "l..e.*l..er" test.txt
        grep "\(l..e\).*\lr" test.txt
    匹配1-255的数字
        grep -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>" num.txt
    匹配Email地址:任意长度数字字母@任意长度数字字母
        grep -E "^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$" email.txt
    匹配手机号码,把手机号码是1[3|4|5|8]后面接9位数字的过滤出来
        grep -E "\<1[3|4|5|8][0-9]{9}\>" tel.txt

sed的使用
sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用
功能不同凡响,处理室将当前处理的行存储在临时缓存区,称为“模式空间”接着用sed命令
处理缓冲区中的内容,处理完成后把缓冲区送往屏幕,接着处理下一行,这样不断重复,直到
文件内容并没有改变,除非你使用重定向存储输出
sed命令不能对原文件进行改变除非使用-i参数sed命令是一行一行处理的
sed命令的使用
sed 参数 命令 文件
参数:
-f 脚本文件 以选项中指定的脚本文件来处理输入的文本文件
-e 脚本 以选项中指定的脚本本来处理输入的文本文件
-n 仅显示处理了的行
命令
a\ 在当前行下面插入文本
i\ 在当前行上面插入文本
d 删除选择的行
s 替换指定字符
p 打印模板库块的行
r file 从file中读行
w file 写入file文件中
i 修改原文件内容
行的打印显示:
默认显示文件所有的内容
sed ‘/root/ROOT/p’ /etc/passwd
只显示发生了改变的行
sed -n ‘/root/ROOT/p’ /etc/passwd
查看指定行或指定几行
查看第10行的内容
sed -n ‘10p’ /etc/passwd
查看5-10行的内容
sed -n ‘5,10p’ /etc/passwd
以字符为单位的替换
将文件中的root替换为ROOT,只替换每行的第一个
sed ‘s/root/ROOT/’ /etc/passwd
将文件中的所有root替换为ROOT
sed ‘s/root/ROOT/g’ /etc/passwd
将文件中每行的第2个root开始替换为ROOT
sed ‘s/root/ROOT/2g’ /etc/passwd
以行为单位的替换
将文件的1-5行替换为 i very happy
sed ‘1,5c i very happy’ test
将以root开头的行替换为自己定义的行(在原位置进行行的替换)
sed ‘/^root/c\root user login’ /etc/passwd
数据的搜寻并执行命令
搜索/etc/passwd,找到含有 root 的行,执行后面花括号中的一组命令,这里把bash替换为nologin
这里会找到所有含有root的行,然后将第一个root换成ROOT
sed -n ‘/root/{s/bash/ROOT/p}’ /etc/passwd
如果要将所有的root都换成ROOT
sed -n ‘/root/{s/bash/ROOT/pg}’ /etc/passwd

            找到root开头的行,将bash换成nologin
            sed -n '/^root/{s/bash/ROOT/p}' /etc/passwd
            如果要将所有的root都换成ROOT
            sed -n '/^root/{s/bash/ROOT/pg}' /etc/passwd
        定界符 /
            在sed中使用/作为定界符,也可以使用任意的定界符
                sed 's:root:ROOT:g'
                sed 's|root|ROOT|g'
        删除操作:d
            删除空白行:  sed  '/^$/d'   test
            删除文件的第2行: sed '2d' test
            删除文件的第2行到末尾所有的行:sed '2,$d'  test
            删除文件最后一行: sed  '$d'   test
            删除文件中所有开头是root的行: sed  '/^root/d'  test
            删除文件中含有root的行: sed '/root/d'  test
            删除奇数行显示偶数行: sed '1~2d'  test
        多点编辑:-e 
            -e 选项允许在同一行里执行多条命令
            sed -e '1,5d'  -e  's/root/ROOT/g'  /etc/passwd            
            先删除文件中的1-5行,然后将剩余的行中所有的root替换为ROOT
        从文件读入:r命令
            file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面:
            sed '/test/r file' filename
        写入文件:W命令
            在example中所有包含test的行都被写入file里: sed  -n  '/test/w  file'  example
        插入
        插入(行下)a\或 a 
            将 this is a test line 追加到 以test 开头的行后面:
                sed '/^test/a\this is a test line'    test   
                sed '/^test/a this is a test line'    test
            在 test 文件第2行之后插入 this is a test line:
                sed   '2a\this is a test line'     test  
                sed   '2a  this is a  test  line'  test
        插入(行上)  i\  或   i
            将 this is a test line 追加到以test开头的行前面:
                sed '/^test/i\this is a test line'    test
                sed '/^test/i this is a test line'    test
            在文件第5行之前插入this is a test line:
                sed  '5i\this is  a  test line'    test   
                sed  '5i this is  a  test line'    test
        插入 (行首和行尾)
            在所有行的行首和行尾添加
                sed 's/^/HEAD/g' test   #在test文件中所有行的行首加HEAD
                sed 's/$/TAIL/g' test   #在test文件中所有行的行尾加TAIL
            在指定行的行首和行尾添加
                sed '5s/^/HEAD/'  test     #在test文件中第5行的行首添加HEAD
                sed '5s/$/TAIL/'  test     #在test文件中第5行的行尾添加TAIL
            过滤指定行,然后在过滤行的行首和行尾添加
                sed '/^ONBOOT/s/^/HEAD/' ifcfg   #在以ONBOOT开头的行首加 HEAD
                sed '/^ONBOOT/s/$/TAIL/' ifcfg   #在以ONBOOT开头的行尾加 TAIL

awk的使用
awk是一个强大的文本分析工具,可对数据分析并生成报告
awk处理过程:依次对每一行进行处理,然后输出
awk的用法:awk 参数 ‘BEGIN{} // {action1;action2}’ END{} 文件名
参数: -F 指定分隔符
-f 调用脚本
-v 定义变量
Begin{} 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用
全局变量,设置FS分隔符
// 匹配代码块,字符串或正则表达式
{} 命令代码块,包含一条或多条命令用;隔开
END 结尾代码块,对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
例: awk ‘BEGIN{X=0}/root/{X+=1}END{print “I find”,X,“root lines”}’ /etc/passwd 统计 /etc/passwd 文件中包含root行的总数
awk中字符的含义:
$0 表示整个当前行
$1 每行第一个字段
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t 制表符
\n 换行符
FS BEGIN时定义分隔符
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 包含
!~ 不包含
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]/ 一个或一个以上数字
OFS 输出字段分隔符, 默认也是空格,可以改为其他的
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F [:#/] 定义了三个分隔符
print打印
print 是 awk打印指定内容的主要命令,也可以用 printf
awk ‘{print}’ /etc/passwd == awk ‘{print $0}’ /etc/passwd
awk ‘{print " "}’ /etc/passwd 不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本
awk ‘{print “a”}’ /etc/passwd 输出相同个数的a行,一行只有一个a字母
awk -F: ‘{print $1}’ /etc/passwd == awk -F “:” ‘{print $1}’ /etc/passwd
awk -F: ‘{print $1 $2}’ 输入字段1,2,中间不分隔
awk -F: ‘{print $1,$3,$6}’ OFS="\t" /etc/passwd 输出字段1,3,6, 以制表符作为分隔符
awk -F: ‘{print $1; print $2}’ /etc/passwd 输入字段1,2,分行输出
awk -F: ‘{print $1 “" print $2}’ /etc/passwd 输入字段1,2,中间以分隔
awk -F: '{print “name:”$1”\tid:"KaTeX parse error: Expected 'EOF', got '}' at position 2: 3}̲' /etc/passwd …A’/{print }’ /etc/passwd 打印出文件中含有变量 $A的行
awk -F: ‘!/root/{print}’ /etc/passwd 打印出文件中不含有root的行
awk -F: ‘/root|tom/{print}’ /etc/passwd 打印出文件中含有root或者tom的行
awk -F: ‘/mail/,mysql/{print}’ test 打印出文件中含有 mail
mysql 的行,代表有0个或任意多个字符
awk -F: '/2[7][7]
/{print}’ test 打印出文件中以27开头的行,如27,277,27gff 等等

        awk -F: '$1~/root/{print}' /etc/passwd                     打印出文件中第一个字段是root的行
        awk -F: '($1=="root"){print}' /etc/passwd               打印出文件中第一个字段是root的行,与上面的等效
        awk -F: '$1!~/root/{print}' /etc/passwd                   打印出文件中第一个字段不是root的行
        awk -F: '($1!="root"){print}' /etc/passwd                打印出文件中第一个字段不是root的行,与上面的等效
        awk -F: '$1~/root|ftp/{print}' /etc/passwd               打印出文件中第一个字段是root或ftp的行
        awk -F: '($1=="root"||$1=="ftp"){print}' /etc/passwd   打印出文件中第一个字段是root或ftp的行,与上面的等效
        awk -F: '$1!~/root|ftp/{print}' /etc/passwd              打印出文件中第一个字段不是root或不是ftp的行
        awk -F: '($1!="root"||$1!="ftp"){print}' /etc/passwd    打印出文件中第一个字段不是root或不是ftp的行,与上面等效
        awk -F: '{if($1~/mail/) {print $1} else {print $2}}'  /etc/passwd   如果第一个字段是mail,则打印第一个字段,否则打印第2个字段
格式化输出
    awk '{printf "%-5s %.2d,$1,$2}' test
        printf表示输出格式
        %格式化输出分符
        -8表示长度为8个字符
        s表示字符串类型,d表示小数
    举例:
        1、显示 /etc/passwd 中含有 root 的行
        awk '/root/'  /etc/passwd
        2、以 : 为分隔,显示/etc/passwd中每行的第1和第7个字段
        awk -F ":" '{print $1,$7}' /etc/passwd  或  awk 'BEGIN{FS=":"}{print $1,$7}' /etc/passwd
        3、以 : 为分隔,显示/etc/passwd中含有 root 的行的第1和第7个字段
        awk -F ":" '/root/{print $1,$7}' /etc/passwd
        4、以 : 为分隔,显示/etc/passwd中以 root 开头行的第1和第7个字段
        awk -F ":" '/^root/{print $1,$7}' /etc/passwd
        5、以 : 为分隔,显示/etc/passwd中第3个字段大于999的行的第1和第7个字段
        awk -F ":" '$3>999{print $1,$7}'  /etc/passwd
        6、以 : 为分隔,显示/etc/passwd中第7个字段包含bash的行的第1和第7个字段
        awk -F ":" '$7~"bash"{print $1,$7}' /etc/passwd
        7、以 : 为分隔,显示/etc/passwd中第7个字段不包含bash的行的第1和第7个字段
        awk -F ":" '$7!~"nologin"{print $1,$7}'  /etc/passwd
        8、以 : 为分隔,显示$3>999并且第7个字段包含bash的行的第1和第7个字段
        awk -F ":" '$3>999&&$7~"bash"{print $1,$7}' /etc/passwd
        9、以 : 为分隔,显示$3>999或第7个字段包含bash的行的第1和第7个字段
        awk -F ":" '$3>999||$7~"bash"{print $1,$7}' /etc/passwd

  1. sS ↩︎

  2. 2 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂阿弥20457

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值