用户组和权限
1.linux的安全模型
2.用户和组
//查看我的权限
id
//用户及属性信息
/etc/passwd
//用户密码及相关属性
/etc/shadow
//组及其属性信息
/etc/group
//组密码及其属性信息
/etc/gshadow
//创建用户范例
rpm -q --scripts postfix
# Add user and groups if necessary
/usr/sbin/groupadd -g 90 -r postdrop 2>/dev/null
/usr/sbin/groupadd -g 89 -r postfix 2>/dev/null
/usr/sbin/groupadd -g 12 -r mail 2>/dev/null
/usr/sbin/useradd -d /var/spool/postfix -s /sbin/nologin -g postfix -G mail -M -r -u 89 postfix 2>/dev/null
groupadd
-g 指定组ID,多个机器同一个组ID必须相同,方便权限统一
-r 系统组
useradd
-d /var/spool/postfix 指定家目录
-s /sbin/nologin shell类型
-g postfix 主组
-G mail 附加组
-M 不创建家目录 -m创建家目录
-r 系统账号
-u 用户ID
//修改用户和组
//创建账号默认的配置
ls /etc/skel/ -a
//查看用户默认配置
/etc/default/useradd
3.权限
1.常规权限
chown //更换所有者
chmod //更换权限
//默认创建文件夹和文件的权限
umask
//新建文件权限666-umask 奇数+1 偶数不变
//新建文件夹权限777-umask
2.特殊权限
SUID 作用于二进制文件的权限,用户执行此二进制文件则继承所有者权限
SGID 作用于二进制文件的权限,用户执行此二进制文件则继承用户组权限
作用于文件夹,用户在此文件夹下创建的权限继承所属组
STICKY 作用于目录上,此目录中的文件只能拥有者删除
3.文件特殊属性
chattr +i test10.txt // 增加特殊属性,不能修改 不能重命名 限制root权限
chattr -i test10.txt
4.访问控制列表
setfacl //设置访问控制列表
setfacl -m u:用户:- test10.txt
getfacl //查看访问控制列表
getfacl test9.txt
4.文本处理工具
文本常见工具
1.less
2.cat -A
3.head
4.tail
5.tail -f //动态跟踪 文件的变化
6.cut -d: -f1,3 /etc/passwd //截取文件的一部分
7.df |tr -s ' ' %|cut -d% -f5 |tail -n +2 //截取字符串示例
8.wc
9.sort
10.uniq
11.diff
12.vimdiff
13.cmp
正则表达式
基本正则表达式
1.字符匹配
. 匹配任意单个字符
[abc] 匹配范围内的字符
[^abc] 不在范围内的字符
[:alnum:] 字母和数字
[:alpha:] 任意大小写字母
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 空白字符 空格和制表符
[:space:] 比blank范围广的空白字符 包括空格、制表符、换行符、回车符
[:cntrl:] 不可打印的控制符 退格 删除
[:digit:] 十进制数字
[:punct:] 标点符号
\s 匹配空白字符
\S 匹配非空白字符
\w 匹配一个字母 数字 下划线 汉字
\W 匹配一个非字母 数字 下划线 汉字
2.匹配次数
* 匹配前面字符任意次数 *任意长度的任意字符 ? 匹配前面字符0次或1次
+ 匹配前面字符 至少1次
{n} 匹配前面字符N次
{m,n}匹配至少m,最多n
3.位置锚定
^ 行首
$ 行尾
< 语首
语尾
4.分组()| 或者
文本处理
1.grep #主要对文本行进行模式过滤
格式 选项 正则 文件
-m #匹配m次后停止
-v #取相反行
-i #忽略字符大小写
-n 显示匹配的行号
-c 匹配统计的行数
-o 仅显示匹配到的字符串
-A #后#行
-B#前#行
-C#前后#行
-e #多个条件的 or 关系
-w #匹配整个单词
-E #使用EGREP
-f # 指定文件
-r #递归处理 不处理软连接
-R#递归处理 ,处理软连接
2.sed #文本编辑工具格式 选项 脚本 文件
-n #不自动打印
-f #从指定的文件中读取脚本
-r,E #使用扩展正则表达式
-i.bak #备份并原处编辑说明
-ir 不支持
-i -r 支持
-ri 支持脚本[地址命令]
地址格式
不写地址对全文处理
-单地址 #:指定行 $:最后一行 /pattern/ 被此处模式匹配到的每一行
-地址范围 #,# 从第几行到第几行 3,6 表示从3到第6行
#,+# 3,+3 从第3行到第6行
/pat1/,/pat2/ #,/pat1/ /pat1/,#
-步进 ~ 1~2 奇数行 2~2偶数行
命令格式
p 打印当前模式空间内容
Ip忽略大小写输出
d删除模式空间匹配的内容 立即启动下一轮循环
a [] text 在指定行后面追加文本
i[] text 在行前面追加文本
c[] text 替换行为单行或多行文本
w file 保存模式匹配的行 至文件
r file 读取指定文件的文本至模式空间匹配到的行后
= 为模式空间中的行打印行号
!模式空间取反
q结束退出sed查找替代
s/pattern/string/修饰符
修饰符
g 行内全局替换
p 显示替换成功的行
w /path/path 将替换成功的行保存至文件中
i 忽略大小写
3.awk #文本报告生成器
grep练习
1.显示/proc/meminfo文件中以大小S开头的行 ,用两种方法
grep '^[Ss]' /proc/meminfo
grep '<[Ss]' /proc/meminfo
2.显示/etc/passwd不以/bin/bash 结尾的行
grep -v '/bin/bash>' /etc/passwd
- 显示用户rpc默认的shell程序
grep '<rpc>' /etc/passwd|cut -d: -f7
4.找出/etc/passwd中的两位或三位数
grep '<[[:digit:]]{2,3}>' /etc/passwd
5.显示centos7/etc/grub2.cfg 中至少一个空白字符开头且后面含有非空白字符的行
grep '[[:space:]]+[[:space:]].' /etc/grub2.cfg
6.找出netstat -tan 命令中以LISTEN后跟任意多个空白字符结尾的行
netstat -tan|grep '<LISTEN[[:space:]]' /etc/passwd
9.利用df 和grep 取出磁盘各分区利用率 从大到小排序
df|grep '<[[:digit:]]{1,}[%]' -o|tr -d %|sort -gr
10.显示三个用户root mage wang 的UID 和默认shell
grep '^root|mage|wang' /etc/passwd|cut -d: -f3,7
11.找出/etc/rc.d/init.d/functions 文件中 行首为某单词包括下划线 后面带一个小括号的行
grep '^([[:alpha:]]|_)+>(+' /etc/rc.d/init.d/functions
12.使用egrep 找出/etc/rc.d/init.d/functions 的基名
echo '/etc/rc.d/init.d/functions' |egrep '[^/]+([[:alpha:]]|/)$' -o
13.使用egrep 找出/etc/rc.d/init.d/functions 的目录名
echo '/etc/rc.d/init.d/functions' |egrep '^.*/' -o
14.统计last 以root用户登录的每个主机IP登录次数
last |grep root |grep -Eo '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'|uniq -c
15.用grep显示0-9的数
echo {0..256}|grep -o '<[0-9]>'
16.用grep显示10-99的数
echo {0..256}|grep -o '<[1-9][0-9]>'
17.用grep显示100-199的数
echo {0..256}|grep -o '<1[0-9][0-9]>'
18.用grep显示200-249的数
echo {0..256}|grep -o '<2[0-4][0-9]>'
19.用grep显示250-255的数
echo {0..256}|grep -o '<25[0-5]>'
20.显示ifconfig结果中ipv4的地址
ifconfig|grep 'inet>'|grep -E '(([0-9]|[1-9][0-9]|1[0-9][0-9]).){3}([0-9]|[1-9][0-9]|1[0-9][0-9])'
21.将此字符串"welcome to magedu linux" 中的每个字符去重排序,重复次数多的排前面
echo 'welcome to magedu linux' |grep '.' -o|sort | uniq -c|sort -r
sed练习
1.取出倒数第2行
sed -n "$(echo $[`cat /etc/passwd|wc -l`-1])p" /etc/passwd
echo $[`cat /etc/passwd|wc -l`-1] #打印出倒数第2行
$(echo $[`cat /etc/passwd|wc -l`-1]) #执行打印命令 拼接到 sed命令 位置
2.取IP地址
ifconfig ens160|grep -Eo '<inet[[:space:]][0-9.]{3,}'|grep -Eo '<[[:space:]][0-9.]{3,}'
ifconfig ens160|grep -Eo '<[[:digit:]][0-9.]{7,}'|head -1
ifconfig ens160 |sed -nE '2s/[^0-9].(<[[:digit:]][0-9.]{7,})./\1/p'
ifconfig ens160 |sed -nE '2s/[^0-9]+([0-9.]{7,})./\1/p'
3.取基名
echo '/etc/sysconfig/network-scripts/' |grep -Eo '([^/]+)'|tail -1
echo '/etc/sysconfig/network-scripts/' |sed -rn 's#(.)/([^/]+)/?#\2#p'
echo '/etc/sysconfig/network-scripts/' |sed -rn 's#(.)/([^/]+)/?#\1#p'
4.取前缀和后缀
echo 'a.b.c.gz' |sed -rn 's#(.).([^.]+)#\1#p'
文件查找和压缩
非实时查找
locate查询系统预建的文件数据库 /var/lib/mlocate/mlocate.db
新创建的文件不能实时更新数据,可以通过执行updatedb 更新
示例:
locate -n2 -r 'test[0-9]'
-n 显示前几行
-r 使用正则表达式
实时查找
find
1.指定目录搜索层级
find /etc -maxdepth 3 -mindepth 3
2.优先处理目录内的文件,再处理文件夹
find /root -depth
3.根据文件名和inode查找
find /root -name '*.bashrc'
ls -ihla /root //查出inode
find /root -inum 135105457
4.根据用户组查找
find /root -user root
find /root -nouser
5.根据文件类型查找
find /etc -type d
f 普通文件
d 文件夹
l 符号连接文件
s socket文件
b 设备块文件
c 字符文件
p 管道文件
6.空文件或目录
find /etc -type d -empty
7.组合条件
-a 默认多个条件是与
-o 或
! 非
find /etc -type f -a -empty
find /etc -type d -o -type l -ls
find ! \( -user root -o -user test \)
8.排除目录
find /etc -path '/etc/security' -a -prune -o -name "*.conf"
find /etc \( -path '/etc/security' -o -path '/etc/dbus-1' -o -path '/etc/fonts' \) -a
-prune -o -name '*.conf'
find / \( -path '/proc' -o -path '/sys' \) -a -prune -o -type f
9.根据文件大小查找
find / -depth -size +100k
10.根据时间查找
find ./ -amin -1
find ./ -mmin -4
11.处理动作
-ls 类似ls -dils 命令
-fls 保存到文件中 类似 -ls > file
-exec COMMAND {}
find ./ -perm 644 -type f -name '*.org' -exec chmod u+x,g+x {} \;
12.参数替换xargs
练习
1.查找/var下属主为root 且属组为mail的所有文件
find /var -user root -a -group mail
2.查找/var下不属于root.lp、gdm的所有文件
find /var ! \( -user root -o -user lp \)
3.查找/var下最近一周内内容修改过,同时属主不是root,也不是postfix的文件
find /var ! \( -user root -o -user postfix \) -mtime -7 -ls
4.查找系统内没有属组或属主且在一周内被访问过的文件
find / -nogroup -nouser -atime -7
5.查找/var 下大于1M,类型为普通类型的文件
find /var -size +1M -type f |xargs ls -lsh
6.查找/var下所有用户都没有写权限的文件
find /var ! -perm /222 -ls
7.查找/var下至少一类用户没有执行权限的文件
find /var ! -perm -111 -ls
8.查找/etc/init.d/下 所有用户都有执行权限,且其他用户有写权限的文件
find /etc/init.d/ -perm -111 -a -perm -002
压缩
1.压缩指定文件,不包含文件夹,到指定目录
tar -C ./liu -zcvf liu.tar.gz ./
2.解压缩指定文件,到指定目录
tar -xvf liu.tar.gz -C ./data/
3.排除压缩
tar -zcvf ../liu1.tar.gz --exclude=*.org ./
shell编程
1.vimrc
#在自己的家目录下
vi .vimrc
set ts=4
set expandtab
set ignorecase
set shiftwidth=4
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e") =='sh'
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#************************************")
call setline(4,"#Author: baiyude")
call setline(5,"#Date: ".strftime("%Y-%m-%d"))
call setline(6,"#FileName: ".expand("%"))
call setline(7,"#Description: 说明")
call setline(8,"#Copyright: ".strftime("%Y"))
call setline(9,"#************************************")
call setline(10,"")
endif
endfunc
autocmd BufNewFile * normal G
磁盘管理
1.添加新硬盘
看不到新添加的设备需要扫描所有的连接
for i in {0..31}; do echo "- - -" > /sys/class/scsi_host/host${i}/scan; done
查看所有设备列表
lsblk
查看添加的设备
fdisk -l /dev/nvme0n2
交互式添加分区
fdisk /dev/nvme0n2
选择n 新建
选择w 保存退出
修改分区类型
fdisk /dev/nvme0n2
选择t 选择8e liunx虚拟类型
2.创建文件系统
mkfs.ext4 /dev/nvme0n2p1
3.持久挂载
vi /etc/fstab
4.创建swap
umount /dev/nvme0n2p1 //取消挂载
用分区创建
fdisk /dev/nvme0n2 //创建swap分区,选 t 选择liunx swap
mkswap /dev/nvme0n2p1 //创建swap文件系统
vi /etc/fstab //挂载swap
swapon -a //swap 生效
free -h //查看内存
用文件创建
dd if=/dev/zero of=/swapfile bs=1M count=1024 //创建1G文件
chmod 600 /swapfile //修改访问权限
vi /etc/fstab //添加 swapfile 文件的swap
swapon -a //生效
swapon -s //查看
4.创建逻辑卷
pvcreate /dev/nvme0n2p1 //创建物理卷
vgcreate -s 16M vg2 /dev/nvme0n2p1 //创建卷组
lvcreate -L 800M -n mysql vg2 //创建逻辑卷
mkfs.ext4 /dev/vg2/mysql //创建文件系统
vi /etc/fstab //永久挂载
mount -a //生效
5.扩容逻辑卷
fdisk /dev/nvme0n2// 增加分区
pvcreate /dev/nvme0n2p2 //增加物理卷
vgextend vg2 /dev/nvme0n2p2 //扩展卷组
lvextend -L+5G /dev/vg2/mysql //扩展逻辑卷
resize2fs /dev/mapper/vg2-mysql //扩展文件系统 只支持ext4 文件系统
lvextend -r -L+5G /dev/vg2/mysql //扩展逻辑卷 同时扩展文件系统 同时支持ext4 和 xfs
df -lh //查看
6.逻辑卷快照
lvcreate -n mysqlsnaps -s -p r -L 1G /dev/vg2/mysql //创建逻辑卷快照
mount /dev/mapper/vg2-mysqlsnaps /var/filesnap/ //挂载逻辑卷
7.取消逻辑卷快照
umount /var/file //取消原文件挂载
umount /var/filesnap //取消快照挂载
lvconvert --merge /dev/mapper/vg2-mysqlsnaps //恢复
mount /dev/mapper/vg2-mysql /var/file //挂载原文件