@mrz1
2017-12-31T15:09:32.000000Z
字数 20912
阅读 1590
笔记
rm -rf /boot/ /etc/fstab
dd if=/dev/zero of=/dev/sda1 //boot没了数据没了文件系统破坏了
修复需光盘引导 救援模式修复
修复 需要创建文件系统 mkfs.ext4 /dev/sda1
由于/etc/fstab文件被破坏,所以逻辑卷不能被挂载,此时必须先激活卷组,可以查看一下lv和vg,均处于不可用状态。
查看:lvs lvdisplay 逻辑卷 pvs 卷组
激活逻辑卷:vgchange –ay
创建一个挂载点:mkdir /mnt/root
下面进行挂载:mount /dev/VolGroup/lv_root /mnt/root
现在开始恢复之前的fstab文件
自己手动写入文件内容导入到/etc/fstab,由于驱动也被破坏了,不能使用vim编辑器,所以只能用重定向导入。
cat > /mnt/rootfs/etc/fstab
/dev/sda1/ /boot ext4 defaults 0 0
/dev/mapper/VolGroup/lv_root / ext4 defaults 0 0
/dev/mapper/VolGroup-lv-swap swap swap defaults 0 0
重要:之后必须重新启动让救援模式自动挂载分区
点击shell start shell之后
chroot /mnt/sysimage 切换跟 //要装greb 必须切根
mkdir /mnt/chrom
mount /dev/sr0 /mnt/chrom
rpm -ivh /mnt/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force //引文切跟了 所以不写--root=/mnt/sysimage
greb-install /dev/sda 修复完成
这里 修复好了 稍等下sync 因为它写到缓存 立即重启有可能会出现问题
但是唯独没有grub.conf
之后 编辑grub.conf文件
default=0
timeout=5
titel centos6
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=uuid=xxxx
initrd /initramfs-2.6.32-696.el6.x86_64.img
r!ls /boot/vmlinuz-2.6.32-696.el6.x86_64 /boot/initramfs-2.6.32-696.el6.x86_64.img
r!blkid /dev/sda2
现在重启 完成
分区并创建文件系统
fdisk /dev/sdb
分两个必要的分区 /dev/sdb1对应 /boot /dev/sdb2对应根 /
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
挂载boot
mkdir/mnt/boot 子目录必须为boot
mount /dev/sdb1 /mnt/boot
hexdump -C -n 512 /dev/sdb //有分区 没有grub 1 1.5 2 阶段
安装grub
grub-install --root-directory=/mnt/dev/sdb
ls /mnt/boot/grub //查看是否生成
恢复内核和initramfs文件
rpm -ivh /mnt/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force //这条命令会装内核文件磁盘文件各种/lib/modules/*库 这里我们考过去最基本的
cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot
建立grub.conf
vim /mnt/boot/grub.conf
default=0
timemout=3
title costomlinux
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash //这里写bash是因为简单 如果写init 还得写大量的配置文件/etc/inittab 各种脚本
initrd /initramfs-2.6.32-642.el6.x86_64.img
创建一级目录
mkdir /mnt/rootfs
mount /dev/sdb2 /mnt/rootfs
mkdir –pv /mnt/rootfs/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
复制bash和相关库文件
复制相关命令及相关库文件 需要copycmd.sh文件复制
如:bash ifconfig insmod ping ls cat mv cp mount quit 网卡驱动(modinfo e1000//查看路径)...等
insmod /lib/e1000.ko 加载网卡驱动
ifconfig eth0 192.168.2.03 配置ip
开机启动配置ip
grub.conf
vim /mnt/boot/grub.conf
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 //这里不写参数 它会直接去/sbin/init
vim /sbin/init
/bin/bash
insmod /lib/e1000.ko
ifconfig eth0 192.168.2.03
就会先执行就这脚本 脚本有/bin/bash 加载网卡驱动,配置网络
在根文件系统无法使用时需要,如/bin/mount删除
对系统没有特殊要求
从光盘引导(boot.iso或者安装光盘#1)
从USB盘(由boot.iso制作)引导
文件系统重组
Anaconda将会询问是否应该挂载文件系统
/mnt/sysimage/*
/mnt/stage2
$PATH包括硬盘的目录
系统在引导期间,很重要的一个过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误,Linux将无法正常启动。此时,只有通过救援模式才可以解决此类问题。
有备份文件的回复方法
进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行:
chroot /mnt/sysimage
cp /etc/inittab.bak /etc/inittab
没有备份文件的恢复办法
如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM包
chroot /mnt/sysimage
rpm -qf /etc/inittab
initscripts-9.03.49-1.el6.centos.x86_64
exit 退出chroot模式
挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下)
mount /dev/sr0 /mnt/source
CentOS6系统的RPM包存放在光盘Package目录下,要修复的硬盘系统的根目录在/mnt/sysimage下,需要使用--root选项指定其位置。覆盖安装/etc/inittab文件所在的RPM包:
rpm -ivh --replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm
其中的rpm命令选项"--replacepkgs"表示覆盖安装,执行完成后,即已经恢复了此文件
如果想只提取RPM包中的/etc/inittab文件进行恢复,可以在进入救援模式后,执行命令:
rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm| cpio -idv ./etc/inittabcpetc/inittab/mnt/sysimage/etc
注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的路径。提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可
/proc/cmdline /boot/grub/grub.conf 内核的启动参数
/proc/sys/net/ipv4/ 目录下是网络相关的 在改只是临时生效存不住(内存信息)
想要保存住使用命令:sysctl 写配置文件
sysctl -w path.to.parameter=VALUE
例:net.ipv4.ip_forward=0
[root@centos6 ~]#sysctl -w net.ipv4.ip_forward=0
net.ipv4.ip_forward = 0
注意: net.ipv4.ip_forward 前面不用加/proc/sys因为sysctl命令只是管就是/proc/sys里面的
net/ipv4/ip_forward 之后把"/"换成"."就成了
修改hostname
sysctl -w kernel.hostname=mail.magedu.com
永久保存写文件 /etc/sysconfig/network
[root@centos6 ipv4]#cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=centos6.qifei.com
[root@centos7 ~]#cat /etc/hostname
centos7.qifei.com
[root@centos7 ~]#hostnamectl set-hostname centos7.qifei.com //设置hostname
sysctl命令:
默认配置文件:/etc/sysctl.conf(不是所有配置文件都在这里有比如禁ping)
(1) 设置某参数
sysctl -w parameter=VALUE
(2) 通过读取配置文件设置参数
sysctl -p [/path/to/conf_file]
(3) 查看所有生效参数
sysctl -a
常用的几个参数:
net.ipv4.ip_forward
net.ipv4.icmp_echo_ignore_all
vm.drop_caches
[root@centos6 proc]#sysctl -a |grep drop
vm.drop_caches = 0
fs.quota.drops = 0
net.core.xfrm_larval_drop = 1
[root@centos6 proc]#sysctl -w vm.drop_caches=1 //清理内存
vm.drop_caches = 1
[root@centos6 ~]#cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
net.ipv4.icmp_echo_ignore_all = 1 //把这个写到/etc/sysctl.conf里面就行了 禁ping
sysctl -p //从新读/etc/sysctl.conf 生效禁ping
sysctl -a //查看所有生效的设置
如果注释net.ipv4.icmp_echo_ignore_all = 1 ;sysctl -p 是读取内存中的 内存是什么 就是什么 机器重启就恢复成默认0
扫描硬盘
echo '- - -' > /sys/class/scsi_host/host0/scan
/etc/udev/rules.d/70-persistent-net.rules //修改eth0 名称
自己写一个80-disk.rules文件(意思是发现新硬盘如果是/dev/sdc/ 就创建软连接 disk2 可以参考70-persistent-cd.rules)
[root@centos6 rules.d]#vim 80-disk.rules
SUBSYSTEM=="block",KERNEL=="sdc",SYMLINK="disk2"
块设备 如果是sdc 软连接是disk2
[root@centos6 rules.d]#ll /dev/disk2
lrwxrwxrwx. 1 root root 3 Dec 28 16:20 /dev/disk4 -> sdc
单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
内核组成部分:
kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE(rpm -ql kernel 包)
kernel object: 内核对象,一般放置于(如需加载需要的放到vmlinuz)
/lib/modules/VERSION-RELEASE/(例:ntsysv 命令)
[ ]: N 这功能不启用
[M]: M 独立文件
[*]: Y 生成到vmlinuz-VERSION-RELEASE
辅助文件:ramdisk
initrd
initramfs
/boot/config-3.10.0-693.el7.x86_64
运行中的内核:
uname命令:
uname - print system information
uname[OPTION]...
-n: 显示节点名称
-r: 显示VERSION-RELEASE
-a: 显示所有信息
lsmod命令:
显示由核心已经装载的内核模块(根据硬件自动加载例:优盘usb)
显示的内容来自于: /proc/modules文件
modinfo命令:显示模块的详细描述信息
modinfo[ -k kernel ] [ modulename|filename... ]
-n: 只显示模块文件路径
-p: 显示模块参数
-a: author 作者
-d: description 描述
-l: license 许可证
lsmod|grep xfs;modinfo xfs
[root@centos7 ~]#modinfo -n usb_storage
/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/usb/storage/usb-storage.ko.xz
modprobe命令:装载或卸载内核模块
modprobe[ -C config-file ] [ modulename] [ module parame-ters... ]
配置文件:
/etc/modprobe.conf
/etc/modprobe.d/*.conf
modprobe[ -r ] modulename...
modprobe -r usb_storage //卸载usb模块
depmod命令:
内核模块依赖关系文件及系统信息映射文件的生成工具
装载或卸载内核模块
insmod命令:指定模块文件,不自动解决依赖模块
insmod[ filename ] [ module options... ]
insmod `modinfo –n exportfs`
lnsmod `modinfo –n xfs`
rmmod命令:卸载模块
rmmod[ modulename]
rmmod xfs
rmmod exportfs
rmmod usb_storage //卸载usb模块(有依赖性)
前提:
1. 准备好开发环境
2. 获取目标主机上硬件设备的相关信息
3. 获取目标主机系统功能的相关信息例如:需要启用相应的文件系统
4. 获取内核源代码包www.kernel.org
包组(CentOS 6):
Server Platform Development
Development Tools
目标主机硬件设备相关信息:
CPU:
cat /proc/cpuinfo
x86info -a //yum search x86info //查看包名
lscpu
lspci
lsusb
PCI设备:
lspci
-v
-vv
lsusb
-v
-vv
lsblk 块设备
CentOS6全部硬件设备信息hal-device
tail /var/log/messages
//硬件有没有识别
df -T 查看什么系统
内核文件一般编译安装大概生成10多G,注意空间
安装开发包组
下载源码文件
.config:准备文本配置文件
make menuconfig:配置内核选项
make [-j #]
make modules_install:安装模块
make install :安装内核相关文件
安装bzImage为/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
编辑grub的配置文件
1:
tar xvf linux-4.14.9.tar.xz -C /app //解压
du -sh /app //查看大小 1比9
cd /app/linux-4.14.9/
cp /boot/config-3.10.0-693.el7.x86_64 .config
make menuconfig 配置内核选项(有可能打不开缺少包组 例:ncurses-devel)
grep NTFS .config 查看是否启用
make [-j #] 用几核cpu编译
for i in {1..10};do sleep 0.3;echo -e "\a";done ;make [-j #] 发出声音提醒(有可能还缺少库文件继续安装)
make modules_install:安装模块 //lib/modules
make install :安装内核相关文件
安装bzImage为/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
编辑grub的配置文件
U盘不可写
yum search ntfs
yum install ntfsprogs
yum history uodo 33(编号)
2:
tar xf linux-3.10.67.tar.xz -C /usr/src
cd /usr/src
ln -sv linux-3.10.67 linux
cd /usr/src/linux
cp /boot/config-$(uname -r) ./.config
make help
make menuconfig
make -j 2
make modules_install
make install
reboot
1.配置内核选项
(一)支持"更新"模式进行配置:make help
(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
(b) make menuconfig:基于curses的文本窗口界面
(c) make gconfig:基于GTK (GNOME)环境窗口界面(鼠标)
(d) make xconfig:基于QT(KDE)环境的窗口界面
(二)支持"全新配置"模式进行配置
(a) make defconfig:基于内核为目标平台提供的"默认"配置进行配置
(b) make allyesconfig: 所有选项均回答为"yes"
(c) make allnoconfig: 所有选项均回答为"no"
2.编译
全编译:make [-j #]
编译内核的一部分功能:
(a) 只编译某子目录中的相关代码
cd /usr/src/linux
make dir/ 编译dir里面所有模块驱动
(b) 只编译一个特定的模块
cd /usr/src/linux
make dir/file.ko 编译dir/file.ko这个模块驱动
例如:只为e1000编译驱动:make drivers/net/ethernet/intel/e1000/e1000.ko
3.如何交叉编译内核:
编译的目标平台与当前平台不相同(一般在哪编译在哪用)
make ARCH=arch_name
4.要获取特定目标平台的使用帮助
make ARCH=arch_name help
make ARCH=arm help 编译arm用到各种的功能选项
5.在已经执行过编译操作的内核源码树做重新编译
6.需要事先清理操作:
make clean:清理大多数编译生成的文件,但会保留config文件等
make mrproper: 清理所有编译生成的文件、config及某些备份文件
make distclean:mrproper、patches以及编辑器备份文件
7.卸载内核
删除/lib/modules/目录下不需要的内核库文件
删除/usr/src/linux/目录下不需要的内核源码
删除/boot目录下启动的内核和内核映像文件
更改grub的配置文件,删除不需要的内核启动列表
centous7 /boot/grub/grub2/grub.cfg
grub2-mkconfig -o grub.cfg //生成这个文件
SELinux: Secure Enhanced Linux,是美国国家安全局(NSA=The National Security Agency)和SCC(Secure Computing Corporation)开发的Linux的一个强制访问控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后集成在内核中
DAC:Discretionary Access Control自由访问控制(没有SELINUX)
MAC:Mandatory Access Control 强制访问控制(有SELINUX)
1. DAC环境下进程是无束缚的
2. MAC环境下策略的规则决定控制的严格程度
3. MAC环境下进程可以被限制的
4. 策略被用来定义被限制的进程能够使用那些资源(文件和端口)
5. 默认情况下,没有被明确允许的行为将被拒绝
[root@centos7 boot]#cat config-3.10.0-693.el7.x86_64 |grep SELINUX
CONFIG_SECURITY_SELINUX=y //7已经集成到内核里面了
·······
SELinux有四种工作类型:(/etc/selinux/config)
1. strict: centos5,每个进程都受到selinux的控制
2. targeted: 用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易被入侵的进程,centos4只保护13个服务,centos5保护88个服务
3. minimum:centos7,修改的targeted,只对选择的网络服务
4. mls:提供MLS(多级安全)机制的安全性
targeted为默认类型,minimum和mls稳定性不足,未加以应用,strict已不再使用
/etc/selinux/config
[root@centos7 ~]#getenforce
Permissive
[root@centos7 ~]#sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: permissive
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
[root@centos7 ~]#setenforce 1
[root@centos7 ~]#sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: permissive
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
[root@centos7 ~]#getenforce
Enforcing
enforcing 变成enabled 必须关机
安全上下文有五个元素组成:`user:role:type:sensitivity:category`会消失 -rw-r--r--. 点会没有
user:role:type:sensitivity:category
user_u:object_r:tmp_t:s0:c0
(ll -Z//查看)semanage fcontext –l
安全上下文有五个元素组成:unconfined_u:object_r:admin_home_t:s0
1. User:指示登录系统的用户类型,如root,user_u,system_u,多数本地进程都属于自由(unconfined)进程
2. Role:定义文件,进程和用户的用途:文件:object_r,进程和用户:system_r
3. Type:指定数据类型,规则中定义何种进程类型访问何种文件Target策略基于type实现,多服务共用:public_content_t
4. Sensitivity:限制访问的需要,由组织定义的分层安全级别,如unclassified,secret,top,secret, 一个对象有且只有一个sensitivity,分0-15级,s0最低,Target策略默认使用s0
5. Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret, 一个对象可以有多个categroy,c0-c1023共1024个分类,Target 策略不使用category
配置SELinux:
SELinux是否启用
给文件重新打安全标签
给端口设置安全标签
设定某些操作的布尔型开关
SELinux的日志管理
SELinux的状态:
enforcing: 强制,每个受限的进程都必然受
permissive: 允许,每个受限的进程违规操作不会被禁止,但会被记录于审计日志
disabled: 禁用
相关命令:
getenforce: 获取selinux当前状态
sestatus:查看selinux状态
setenforce0|1
0: 设置为permissive 1: 设置为enforcing
配置文件:
/boot/grub/grub.conf
使用selinux=0禁用SELinux
/etc/selinux/config
/etc/sysconfig/selinux
SELINUX={disabled|enforcing|permissive}
给文件重新打安全标签:chcon[OPTION]... [-u USER] [-r ROLE] [-t TYPE] FILE...
chcon[OPTION]... --reference=RFILE FILE...
-R:递归打标;
恢复目录或文件默认的安全上下文:
restorecon[-R] /path/to/somewhere
Semanage:来自policycoreutils-python包
查看默认的安全上下文
semanage fcontext–l
添加安全上下文
semanage fcontext -a –t httpd_sys_content_t '/testdir(/.*)?' restorecon–Rv/testdir
删除安全上下文
semanage fcontext -d –t httpd_sys_content_t '/testdir(/.*)?'
查看端口标签
semanage port –l
添加端口
semanage port -a -t port_label-p tcp|udp PORT
semanage port -a -t http_port_t -p tcp 9527
删除端口
semanage port -d -t port_label-p tcp|udp PORT
semanage port -d -t http_port_t -p tcp 9527
修改现有端口为新标签
semanageport -m -t port_label-p tcp|udp PORT
semanageport -m -t http_port_t-p tcp 9527
注意:httpd自带的端口不可修改不可删
[root@centos7 ~]#systemctl start httpd //启动httpd 服务
cp /var/www/html/index.html /root
unconfined_u:object_r:httpd_sys_content_t:s0 //原先的
mv /root/index.html /var/www/html/
unconfined_u:object_r:admin_home_t:s0 //修改后的
这时httpd服务会找不到html文件
restorecon -R /var/www/html/ //还原这个目录下该有的标签
chcon -t httpd_sys_content_t /var/www/html/index.html //针对单个文件
修改默认标签
semanage fcontext -a –t httpd_sys_content_t '/app(/.*)?'
restorecon -R /app/ //还原这个目录下该有的标签httpd_sys_content_t
删除默认标签
semanage fcontext -d –t httpd_sys_content_t '/app(/.*)?'
restorecon -R /app/ //还原这个目录下该有的标签default
查看端口标签
semanage port -l |grep http
编辑/etc/httpd/conf/httpd.conf
#Listen 12.34.56.78:80
Listen 80
Listen 9527 //80改成9527这个端口服务就启动失败了
SE 策略报警信息 tail -n 30 cat /var/log/messages //最后30条
添加端口
semanage port -a -t http_port_t -p tcp 9527
删除端口
semanage port -d -t http_port_t -p tcp 9527
修改现有端口为新标签
semanage port -m -t ssh_port_t -p tcp 9527
布尔型规则:
getsebool
setsebool 修改布尔值
查看bool命令:
getsebool[-a] [boolean]
semanage boolean –l
semanage boolean -l –C 查看修改过的布尔值
设置bool值命令:
setsebool [-P] booleanvalue(on,off)
setsebool [-P] Boolean=value(0,1)
getsebool -a 与semanage boolean -l相比?
getsebool -a 只显示生效的
semanage boolean -l 显示当前生效和磁盘上保存的(内存)(磁盘)
[root@centos7 ~]#semanage boolean -l|grep ftpd_anon_write
ftpd_anon_write (off(内存) , off(磁盘)) Allow ftpd to anon write
[root@centos7 ~]#setsebool ftpd_anon_write=1 //等于1 或者on 等价 只改的内存 下次重启失效
ftpd_anon_write (on(内存) , off(磁盘)) Allow ftpd to anon write
[root@centos7 ~]#setsebool -P ftpd_anon_write=1 //等于1 或者on 等价 改的全部 保存下次重启不失效
ftpd_anon_write (on(内存) , on(磁盘)) Allow ftpd to anon write
[root@centos7 ~]#semanage boolean -l –C 查看修改过的布尔值
ftpd_anon_write (on(内存) , on(磁盘)) Allow ftpd to anon write
yum install setroubleshoot(重启生效)
将错误的信息写入/var/log/message
grep setroubleshoot /var/log/messages
sealert -l UUID
查看安全事件日志说明
sealert -a /var/log/audit/audit.log
扫描并分析日志
yum –y install selinux-policy-devel (centos7.2帮助)
yum –y install selinux-policy-doc (centos7.3以后)
yum info selinux-policy-doc 查看
yum search selinux-policy-doc 搜索
mandb | makewhatis 更新数据库
man -k _selinux 查看与selinux相关的文档服务
httpd为例
[root@centos7 ~]#mandb 更新数据库
[root@centos7 ~]#man -k _selinux |grep httpd_selinux 看在哪个章节
httpd_selinux(8) -XXXXXXXXXXXXXXXXXXXX
[root@centos7 ~]#man 8 httpd_selinux 查看文档
[root@centos7 ~]#man 8 ftpd_selinux 查看文档
有的配置文件都告诉你怎么改 /etc/ssh/sshd_config
/etc/selinux/config
case $1 in
on)
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
;;
off)
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
echo "please reboot"
;;
*)
echo 'SELinux on or off'
;;
esac
awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出
有多种版本:New awk(nawk),GNU awk(gawk)
gawk:模式扫描和处理语言
基本用法:
awk [options] 'program' var=value file...
awk [options] -f programfile var=value file...
awk [options] 'BEGIN{ action;... } pattern{ action;... } END{ action;... }' file ...
awk程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部分组成
program通常是被单引号或双引号中
选项:
-F 指明输入时用到的字段分隔符
-v var=value: 自定义变量
基本格式:
awk [options] 'program' file...
program:pattern{action statements;..}
pattern和action:
pattern部分决定动作语句何时触发及触发事件
BEGIN,END
action statements对数据进行处理,放在{}内指明
print, printf
注意: 内部命令也有printf,处理字符串和echo差不多
分割符、域和记录
awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称为域标识。$0为所有域,注意:和shell中变量$符含义不同
文件的每一行称为记录
省略action,则默认执行print $0 的操作
第一步:执行BEGIN{action;... }语句块中的语句
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;... }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;...}语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块
print格式:print item1, item2, ...
要点:
(1) 逗号分隔符
(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式
(3) 如省略item,相当于print $0
示例:
awk '{print "hello,awk"}' //输入什么打印hello,awk
awk -F: '{print}' /etc/passwd //打印所有
awk -F: '{print "wang"}' /etc/passwd //打印用户名全是wang
awk -F: '{print $1}' /etc/passwd //打印用户名
awk -F: '{print $0}' /etc/passwd //打印所有
awk -F: '{print $1"\t"$3}' /etc/passwd //打印用户名和uid制表符分开
tail -3 /etc/fstab | awk '{print $2,$3}' //打印/etc/fstab后三行取出挂载点和什么系统
实例:
支持\n
[root@centos7#echo "QQ" |awk '{print "qq\nqq"}'
支持运算
[root@centos7]#echo "QQ" |awk '{print 2*2}'
4
[root@centos7]#echo "QQ" |awk '{print 2^3}'
8
[root@centos7]#echo "QQ" |awk '{print 2/3}'
0.666667
取出特定的格式
[root@centos7]#awk -F: '{print $1,$3,$4}' passwd
root 0 0
[root@centos7]#df -h |grep /dev/sd |awk '{print $1,$5}'
/dev/sda2 8%
/dev/sda1 16%
/dev/sda3 1%
支持\t
[root@centos7]#df -h |grep /dev/sd |awk '{print $1"\t"$5}'
/dev/sda2 8%
/dev/sda1 16%
/dev/sda3 1%
awk默认分隔符是空白符 字符串必须用双引号
变量:内置和自定义变量
FS:输入字段分隔符,默认为空白字符(变量)
awk -v FS=':' '{print $1,FS,$3}' /etc/passwd
awk -F: '{print $1,":",$7}' /etc/passwd
OFS:输出字段分隔符,默认为空白字符
awk -v FS=':' -v OFS=':' '{print $1,$3,$7}'' /etc/passwd
RS:输入记录分隔符,指定输入时的换行符
awk -v RS=' ' '{print }' /etc/passwd
ORS:输出记录分隔符,输出时用指定符号代替换行符
awk -v RS=' ' -v ORS='###' '{print }' /etc/passwd
NF:字段数量
awk -F:'{print NF}' /etc/fstab 引用内置变量不用$
awk -F: '{print $(NF-1)}' /etc/passwd
NR:记录号
awk '{print NR}' /etc/fstab; awkEND'{print NR}' /etc/fstab
FNR:各文件分别计数,记录号
awk '{print FNR}' /etc/fstab /etc/inittab
FILENAME:当前文件名
awk '{print FILENAME}’ /etc/fstab
ARGC:命令行参数的个数
awk '{print ARGC}' /etc/fstab /etc/inittab
awk 'BEGIN {print ARGC}' /etc/fstab/etc/inittab
ARGV:数组,保存的是命令行所给定的各参数
awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/inittab
awk 'BEGIN {print ARGV[1]}' /etc/fstab/etc/inittab
练习1(可以调用bash变量)
FS(以它为分隔符找出$1$3)
[root@centos7]#awk -v FS=':' '{print $1,$3}' /etc/passwd
root 0
[root@centos7]#seq=":";awk -v FS="$seq" '{print $1FS$3}' /etc/passwd
root:0
OFS(输出分隔符默认是空白符)
[root@centos7]# awk -v FS=':' -v OFS='#' '{print $1,$3}' /etc/passwd
root#0
RS:(以;为分隔符(aa bb cc)(ee ff oo)(xx yy zz)分三组$2 bb ff yy )
[root@centos7]#cat f1.txt
aa bb cc ;ee
ff oo ;xx
yy zz
[root@centos7]#awk -v RS=";" '{print $2}' f1.txt
bb
ff
yy
ORS:(RS找以空格分割 ORS是用---替换)
[root@centos7]#cat f1.txt
aa bb cc ;ee
ff oo ;xx
yy zz
[root@centos7]#awk -v RS=' ' -v ORS="---" '{print $1 $2 }' f1.txt
aa---bb------cc---;eeff---oo---;xxyy---zz---
NF:字段数量
[root@centos7]#awk -F: '{print NF}' /etc/fstab
0
1
1
3
1
1
1
1
1
1
1
1
在文件中找以":"分割的 如果这一行没东西是0 有东西但是没有:是1 有:看下分成几段
[root@centos7]#awk -F: '{print NF}' /etc/passwd 字段7
7
7
[root@centos7]#awk -F: '{print $NF}' /etc/passwd 倒数一
/bin/bash
[root@centos7]#awk -F: '{print $(NF-1)}' /etc/passwd 倒数二
/root
[root@centos7]#ss -nt |grep ESTAB |awk '{print $NF}'|awk -F: '{print $1}'
172.18.101.65
[root@centos7]#df |grep /dev/sd | awk '{print $1,$(NF-1)}'|awk -F\% '{print $1}'
/dev/sda2 8
/dev/sda1 16
/dev/sda3 1
[root@centos7]#awk '{print $1}' /var/log/httpd/access_log
172.18.0.100 ....
NR:记录号
[root@centos7]#awk '{print NR,$0}' /etc/passwd 一个文件
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin ...
[root@centos7]#awk '{print NR,$0}' /etc/passwd /etc/issue 多个文件,行号累加 (空白行也算一行)
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
48 time is \t
49 tty is \l
50 \S
51 Kernel \r on an \m
52
FNR 独立编号
[root@centos7]#awk '{print FNR,$0}' /etc/passwd /etc/issue 多个文件 行号不累加(空白行也算一行)
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
48 time is \t
49 tty is \l
50 \S
51 Kernel \r on an \m
52
FILENAME:当前文件名
[root@centos7]# awk '{print FNR,FILENAME,$0}' /etc/passwd /etc/issue
1 /etc/passwd root:x:0:0:root:/root:/bin/bash
2 /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin
1 /etc/issue The hostname is \n
2 /etc/issue time is \t
ARGC:命令行参数的个数
[root@centos7]# awk '{print ARGC}' /etc/fstab /etc/inittab
3 (awk /etc/fstab /etc/inittab 这三个)
[root@centos7]# awk '{print ARGV[0]}' /etc/fstab /etc/inittab
awk
ARGV:数组,保存的是命令行所给定的各参数
[root@centos7]# awk '{print ARGV[0]}' /etc/fstab /etc/inittab
3 (awk /etc/fstab /etc/inittab 这三个)
[root@centos7]# awk '{print ARGV[1]}' /etc/fstab/etc/inittab
2 (awk /etc/fstab/etc/inittab 这两个/etc/fstab/etc/inittab是一个整体 )
自定义变量(区分字符大小写)(两种方式定义变量)
(1) -v var=value
(2) 在program中直接定义
示例:
[root@centos7 app]#awk -v seq='---' -F: '{print $1seq$2}' /etc/passwd seq自定义变量
root---x
bin---x
这种写法可以调用bash变量
[root@centos7]#awk -v username="username" -v uid="uid" -v seq=":" -F: '{print username seq $1"\t"uid seq $3}' /etc/passwd
username:root uid:0
username:bin uid:1
[root@centos7]#seq=":";awk -v seq="$seq" -F: '{print $1seq$3}' /etc/passwd
root:0
下面这两种写法没发调用bash变量
[root@centos7]#awk -F: '{sex="male";print$1,sex,age;age=18}' /etc/passwd (变量需先定义)
root male
bin male 18
[root@centos7]#awk -F: '{ username="username" ;print username,$1}' /etc/passwd
username root
[root@centos7]#vim awkscript
{username="username" ;print username,$1}
[root@centos7]#awk -F: -f awkscript /etc/passwd
username root