中篇:
五、正则表达式与文件格式化处理
六、Shell Scripts
七、 邮件、日期和任务排程
八、进程管理与 SELinux
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
正则中特殊符号 | 代表意义 |
---|---|
[:print:] | 代表任何可以被打印出来的字符 |
[:graph:] | 除了空格符(空格键和Tab键)外的其他所有按键 |
[:alnum:] | 代表英文大小写字符及数字,亦即 0-9,A-Z,a-z |
[:xdigit:] | 代表 16 进位的数字类型,包括 0-9,A-F,a-f |
[:alpha:] | 代表任何英文大小写字符,亦即 A-Z,a-z |
[:lower:] | 代表小写字符,亦即 a-z |
[:upper:] | 代表大写字符,亦即 A-Z |
[:digit:] | 代表数字,亦即 0-9 |
[:cntrl:] | 代表键盘上面的控制按键,亦即包括 CR,LF,Tab,Del…等等 |
[:punct:] | 代表标点符号 |
[:space:] | 代表任何会产生空白的字符,包括空格键,Tab,CR 等等 |
[:blank:] | 代表空格键与 TAB 按键两者 |
语法:
grep [-option] pattern [filename] # 过滤
-c 仅列出文件中包含模式的行数。
-i 忽略模式中的字母大小写。
-l 列出带有匹配行的文件名。
-n 在每一行的最前面列出行号。
-v 列出没有匹配模式的行。
sed [-option] [command] [filename] # 采用流编辑模式,根据脚本命令来处理文本文件中的数据,每次仅读取一行内容
-e 该选项会将其后跟的脚本命令添加到已有的命令中。
-f 该选项后接脚本文件
-n 该选项会屏蔽启动输出
-i 此选项会直接修改源文件
# sed 命令:[n1,[n2]]function
# function:
# a 新增,后接字符串,在当前行的下一行新增一行
# c 取代,后接字符串,取代n1,n2之间的行
# d 删除
# i 插入,后接字符串,在当前行的上一行新增一行
# p 打印
# s 取代,格式为:s/pattern/replacement/flags
awk '条件类型1{动作1}...' [filename] # 逐行处理文本,并将一行分成数个“字段”处理
# 在 awk 的括号内,每一行的字段都有变量名称,那就是$1,$2...$0 代表一行的全部变量
# awk 内建变量:
# NF 每一行的字段总数
# NR 目前 awk 所在的行数
# FS 目前的分隔字符,默认是空格符
# awk 关键字
# BEGIN 读取数据前执行的命令
# END 读完数据后执行的命令
bash shell 的优点:
变量设定规则:
${变量+特殊字符+关键字}:编辑变量内容
脚本的执行方式:
test 测试指令
# 文件类型的判断
-e 判断文件是否存在
-f 判断文件是否为普通文件
-d 判断文件是否为目录
# 文件权限测试
-r 侦测该文件是否存在且具有 可读 权限
-w 侦测该文件是否存在且具有 可写 权限
-x 侦测该文件是否存在且具有 可执行 权限
# 两个文件的比较,如:test file1 -nt file2
-nt (newer than)判断file1是否比file2新
-ot (older than)判断file1是否比file2旧
-ef 判断file1与file2是否为同一文件
# 两个整数之间的判定,如:test n1 -eq n2
-eq 两数值相等(equal)
-ne 两数值不相等(not equal)
-gt n1 大于 n2(greater than)
-lt n1 小于 n2(less than)
-ge n1 大于等于 n2
-le n1 小于等于 n2
# 判定字符串的数据
test -z string 字符串为空,则为true
test -n string 字符串为空,则为false,-n可省略
test str1=str2 两字符串相等,则为true
test str1!=str2 两字符串相等,则为false
# 多重条件判定
-a 相当于and
-o 相当于or
! 反相状态
还可以利用中括号进行数据的判断,和 test 的用法相似需要注意:
shift:使脚本的参数变量号码偏移,后面可接数字。
条件判断语句:
if [ 条件判断式一 ]; then
条件判断式一成立时,执行的指令
elif [ 条件判断式二 ]; then
条件判断式二成立时,执行的指令
else
条件判断式一与二都不成立时,执行的指令
fi
case $var in
"匹配字符串1")
程序段
;;
"匹配字符串2")
程序段
;;
"匹配字符串3")
程序段
;;
esac
脚本内部的函数功能:
# 函数内部的参数为 $1,$2...
function fname() {
程序段
}
循环结构
# 当 condition 成立时,执行 program,直至 condition不再成立
while [ condition ]
do
program
done
# 当条件成立时,停止循环
until [ condition ]
do
program
done
# 循环时,$var 的内容变换为对应的 con
for var in con1 con2 con3 ...
do
program
done
for ((初始值; 限制值; 执行步阶))
do
程序段
done
shell script 的追踪与 debug
sh [-nvx] script.sh
mail
命令是 Linux 终端发送邮件用的最多的命令。mailx
是 mail
命令的更新版本。
mail [-s 主题] 目标 # 给目标发送邮件
-a file 添加附件
mail [-u user] # 查看邮件
date 命令可以用来显示或设定系统的日期与时间。在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下:
date '+标记' # 根据标记指定的格式输出时间
#时间# %n 换行;%t TAB键;%% 输出%
# %H 小时(00..23)
# %M 分钟
# %s 从1970年1月1日00:00:00UTC到目前为止的秒数
# %S 秒
#日期# %T 时间,同 %H:%M:%S
# %a 星期名(Sun..Sat);%A 星期名,全拼
# %w 一周中的第几天(0..6)
# %b 月份名(Jan..Dec);%B 月份名,全拼
# %y 年份最后两位;%Y 完整年份
# %m 月份数
# %d 当月的日数
# %D 日期,同 %m/%d/%y
# %j 一年中的第几天,三位数
# %U 一年中的第几周,以周日为始
# %W 一年中的第几周,以周一为始
两种任务排程的方式:
Linux 系统上常见的例行性任务有:
# 可以创建 /etc/at.allow 或 /etc/at.deny 限制at指令的使用
# 可以创建 /etc/cron.allow 或 /etc/cron.deny 限制crontab指令的使用
at [-mldv] TIME # 添加一个一次性任务
# -m 邮件通知使用者工作完成
# at -l 相当于atq,列出该用户所有的at排程
# at -d 相当于 atrm,取消一个在at排程中的任务
# at -c 后接工作号码查看工作内容
batch # 当 CPU 负载低于 0.8 时执行任务
crontab -e # 编辑 crontab 的工作内容
# -u username 仅 root,编辑其他用户的任务排程
# -l 查看 crontab 的工作任务
# -r 清空 crontab 的工作内容
# 编辑格式:分 时 日 月 周 指令
# 特殊字符:
# * 代表任何时刻
# , 代表分隔时段
# - 代表一段时间范围
# /n 代表每隔n单位间隔进行一次
anacron # 检查周期性的任务
系统任务的排程在 /etc/crontab,一般服务在 /etc/cron.d/ 目录中,或者将指令放到或链接到 /etc/cron.hourly/ 等目录中,就不需要手动指定时间了。
crond 无法执行过期的任务,但是
在 Linux 中,触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据触发这个程序的用户与相关属性关系,给予这个 PID 一组有效的权限设定。
有一些进程在启动后会不断的运作,我们将这些常驻在内存的进程成为:服务(daemon)。
bash 的 job control 的使用限制:
可以在指令最后直接加 & 符,让程序在背景中运行,也可以使用快捷键 Ctrl+z 将正在运行的进程放到背景中暂停。
jobs [-lrs] # 显示当前的背景工作状态。
# + 代表最近被放到背景的工作号码
# - 代表最近最后第二个被放到背景的工作号码
fg [%jobnumber|-] # 将背景工作拿到前景处理。
# 默认取出 + 工作
bg [%jobnumber|-] # 让工作在背景下运行
kill [-s signal] [%jobN] [PID] # 结束一个进程
# -l --list 列出能够使用的 signal
# -1 重新读取一次参数的配置文件
# -2 代表与键盘输入 Ctrl+c 同样的动作
# -9 立刻强制删除一个工作
# -15 以正常的进程方式终止一项工作
killall [-iIe] [cmd name] # 根据指令名称给与讯号
# -i 交互式;-I 忽略大小写;-e 严格匹配
nohup cmd [ARG]... # 让执行的指令不被中断
# nohup 不支持内部指令
进程的状态有(STAT,S):
R:当前进程正在运行中或在运行队列中等待
S:该程序目前正在睡眠状态,但可以被唤醒
D:不可中断,不可被唤醒的睡眠状态,通常是在等待 I/O 的情况。
T:停止状态,后台暂停或进程处于除错状态
Z:僵尸状态,进程已经终止但无法被移除至内存外
s:当前进程有多个子进程
l:当前进程可能会开启多个子进程,多线程
+:表示这个进程在后台运行
<:表示当前进程优先级高
N:表示当前进程优先级低
L:被锁入内存
进程的优先级越高,其PRI(Priority)值越低。这个 PRI 值由核心动态调整,用户可以通过 NI(Nice) 值调整进程的优先级,相关性为 新PRI = 旧PRI + nice。调整 NI 时要留意:
ps aux # 查看所有进程信息
# -A 显示所有的进程,同 -e
# a 不与 terminal 有关的所有进程
# u 有效使用者相关的进程
# x 通常与 a 一起使用,显示较完整信息
# -l 较详细地显示进程信息
# j 工作格式
# -f 做一个更完整的输出
top [-p PID] # 持续侦测进程运作状态
# -d 后面接更新的秒数,默认5秒
# -b 以批次的方式执行 top
# -n 与 -b 搭配,意思是需要进行几次 top 的输出
# top 内部命令
# ? 帮助
# P 以CPU的使用率排序显示
# M 以Memory的使用率排序显示
# N 以PID排序显示
# T 由该进程使用的CPU时间累积TIME+排序
# k 给与某个PID一个讯号signal
# r 给与某个PID重新制定一个nice值
pstree [-AIUup] # 列出目前系统上面所有的进程树的相关性
SELinux 是 Security Enhanced Linux 的缩写,指的是安全强化的 Linux。SELinux 是整合到 Linux 内核的一个模块,它是在进行进程、文件等细部权限设定依据的一个核心模块。
一般的,依据进程拥有者与文件资源的 rwx 权限来决定一个进程有无存取某一个文件的能力,这种存取文件系统的方式称为自主式访问控制(Discretionary Access Control,DAC)。这种 DAC 的访问控制存在几个问题:(1)root 具有最高权限;(2)使用者可以取得进程来变更文件资源的访问权限。
SELinux 导入了委任式访问控制(Mandatory Access Control,MAC),它能够针对特定的程序与特定的文件资源来进行权限的管控。也就是说,SELinux 是透过 MAC 的方式来管控进程,它控制的主体是进程,而目标则是该进程能否读取的文件资源。
SELinux 工作流程:主体(进程)想要访问文件资源,SELinux 分析政策(Policy,默认是target)内的规则,通过后对比安全性上下文(security context),一致后允许访问,最后再看文件与自身权限。
SELinux 的三种模式:
getenforce # 查看 SELinux 的模式
setenfore # 临时修改 SELinux 的模式
# /etc/selinux/config 永久修改
sestatus # 查看 SELinux 的状态
getsebool [-a] [rule_name] # 查看 SELinux 规则是否开启
seinfo [-Atrub] # 查看 SELinux 的统计信息
sesearch [-A] [-s 主体类别] [-t 目标类别] [-b 布尔值] # 查询规则的用处
# -A 列出允许读取或放行的相关数据
setsebool [-P] [rule_name] [0|1] # 设置 SELinux 规则的开启与关闭,-P 写入配置文件
chcon [-R] [-t type] [-u user] [-r role] file...
# 修改文件的 SELinux type
# -R 连同目录下的子目录一同修改
# --reference=范例文件
restorecon [-Rv] file... # 恢复为预设值
semanage # 管理 SELinux 的默认选项