Shell编程
基本功能
Shell
是一个命令行解释器,为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序
还是一个功能强大的编程语言,易编写、易调试、灵活性较强,可直接调用Linux系统命令Shell分类
Bourne Shell:从1979起Unix就开始使用Bourne Shell,主文件名为sh
C Shell:C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名- 区别:
Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容
Bourne家族主要包括sh、ksh、Bash、psh、zsh
C家族主要包括:csh、tcsh
- 区别:
Bash
Bash与sh兼容,目前使用Bash作为用户的基本ShellLinux支持的Shell
/etc/shells文件可查询
… … … echo -e … … … ∞
echo -e "\e[1;31m testcontent \e[0m" |
… … … history … … … ∞
history [选项] [历史命令保存文件] |
… … … alias … … … ∞
# 设定命令别名 |
… … … wc … … … ∞
wc [选项] [文件名] |
… … … dd … … … ∞
dd if=输入文件 of=输出文件 bs=字节数 count=个数 |
… … … | … … … ∞
# 管道符,命令1的正确输出作为命令2的操作对象 |
变量、环境变量
- 变量
1.定义:计算机内存的单元
2.规则:
由字母、数字、下划线组成,不能以数字开头Bash中,变量默认类型是字符串型,要进行数值运算,需修改为数值型
等号连接,两侧不能有空格
环境变量建议大写,便于区分
3.分类
用户自定义变量(本地变量)
只在当前的Shell中生效
例:变量叠加
aa=123
aa=${aa}456
aa=”$aa”789
环境变量
主要保存的是和系统操作环境相关的数据会在当前Shell和所有子Shell中生效;如果写入相应配置文件,会在所有的Shell中生效
… … … export … … … ∞
# 声明变量 |
… … … read … … … ∞
read [选项] [变量名] |
… … … set … … … ∞
# 查看系统中的变量 |
环境变量配置文件
… … … source … … … ∞
# 修改环境配置文件重启或者source生效 |
运算符
数值运算
… … … declare … … … ∞
# 声明变量类型,用exporter一样 |
正则、排序
正则表达式与通配符
正则是包含匹配(grep、awk、sed等命令支持正则)
通配符是完全匹配(ls、find、cp等命令不支持正则,只能用shell自带通配符进行匹配)基础正则表达式
元字符 作用* 前一个字符匹配0或多次
. 匹配除了换行符外的任意1个字符
^ 匹配行首(例^hello匹配以hello开头的行)
$ 匹配行尾
[] 匹配中括号中指定的任意1个字符,只匹配1个字符
[^] 匹配中括号中的字符以外的任意1个字符([^0-9]匹配任意1位非数字字符)
\ 转义符,取消特殊符号的含义
\{n\} 表示前面的字符恰好出现n次([0-9]\{4\}匹配4位数字;[1][3-8][0-9]\{9\}匹配手机号码)
\{n,\} 表示前面的字符出现不小于n次([0-9]\{2,\}表示两位及以上的数字)
\{n,m\} 表示前面的字符至少出现n次、最多出现m次([a-z]\{6,8\}匹配6-8位的小写字母)
# 例:
grep "a*" testfile.txt # 匹配0或多次a,匹配所有内容包括空白行
grep "aa*" testfile.txt # 匹配至少有一个a的行
grep "s..d" testfile.txt # 匹配sd中间一定有2个字符的单词
grep ".*" testfile.txt # 匹配所有内容
grep -n "^$" testfile.txt # 匹配空白行
grep "\.$" testfile.txt # 匹配使用.结尾的行
… … … sort … … … ∞
sort [选项] 文件名 |
条件判断
按照文件类型进行判断
-b:判断文件存在且为块设备文件
-c:判断文件存在且为字符设备文件
-d:判断文件存在且为目录 *
-e:判断文件存在 *
-f:判断文件存在且为普通文件 *
-L:判断文件存在且为符号链接文件
-p:判断文件存在且为管道文件
-s:判断文件存在且为非空
-S:判断文件存在且为套接字文件两种判断格式
test -e testfile
[ -e testfile ] # 常用
例:[ -d /root ] && echo "yes" || echo "no"按照文件权限进行判断
-r:判断文件存在且有r权限
-w:判断文件存在且有w权限
-x:判断文件存在且有x权限
-u:判断文件存在且有SUID权限
-g:判断文件存在且有SGID权限
-k:判断文件存在且有SBit权限两个文件间比较
file1 -nt file2:判断file1的修改时间是否比file2的新
file1 -ot file2:判断file1的修改时间是否比file2的旧
file1 -ef file2:判断file1和file2的Inode号是否一致,可理解为是否为同一个文件,用于判断硬链接是个好方法
例:# 创建硬链接后-ef判断
ln file1 file2
[ file1 -ef file2 ] && echo "yes" || echo "no"
## 两个整数间比较
integer1 -eq integer2:判断是否相等
integer1 -ne integer2:判断是否不相等
integer1 -gt integer2:判断integer1是否>integer2
integer1 -lt integer2:判断integer1是否<interger2
integer1 -ge integer2:判断integer1是否>=integer2
integer1 -le integer1:判断integer1是否<=integer2
## 字符串的判断
-z string:判断字符串是否为空
-n string:判断字符串是否为非空
string1 == string2:判断是否相等
string1 != string2:判断是否不相等
## 多重条件判断
判断1 -a 判断2:逻辑与,都成立结果才为真
判断1 -o 判断2:逻辑或,有一个成立结果就为真
! 判断:逻辑非,使原始的判断取反
流程控制
… … … if … … … ∞
## 单分支if条件 |
… … … case … … … ∞
case $变量名 in |
… … … for … … … ∞
# 语法1 |
… … … while … … … ∞
# 条件成立进入循环 |
… … … until … … … ∞
# 条件不成立进入循环 |
服务管理
RPM包服务源码包服务
Linux服务包括:RPM包默认安装的服务、源码包安装的服务
RPM包默认安装的服务包括:独立的服务、基于xinetd服务
独立的服务:在内存中启动,响应更快
基于xinetd服务:不占用内存,但响应较慢
启动与自启动
服务启动:在当前系统中让服务运行并提供功能
服务自启动:开机或重启后,随着系统的启动而自动启动服务查询已安装的服务
RPM包安装的服务# 查看自启动的服务,可以看到所有RPM包安装的服务,2 3 4 5如果是启用代表启用
chkconfig --list查看当前启动的服务
ps aux | grep
netstat -tlun源码包安装的服务
查看服务安装位置,一般是/usr/local/下RPM包安装服务与源码包安装服务的区别
RPM包安装在默认位置
源码包安装在指定位置,一般是/usr/local/RPM包服务安装默认位置
/etc/init.d/:启动脚本位置
/etc/sysconfig/:初始化环境配置文件位置
/etc/:配置文件位置
/etc/xinetd.conf:xinetd配置文件
/etc/xinetd.d/:基于xinetd服务的启动脚本
/var/lib/:服务产生的数据放在这里
/var/log/:日志独立服务的启动
/etc/init.d/独立服务名 start|stop|status|restart
service 独立服务名 start|stop|status|restart *独立服务的自启动
chkconfig [–level 运行级别] [独立服务名] [on|off]
修改/etc/rc.d/rc.local文件 *
使用ntsysv命令管理自启动源码包服务的启动
使用绝对路径调用启动脚本;不同的源码包的启动脚本不同,可查看对应方法
例:/usr/local/apache2/bin/apachectl start|stop源码包服务的自启动
修改/etc/rc.d/rc.local加入/usr/local/apache2/bin/apachectl start让源码包服务被service命令识别,做软链接,建议不这么做
ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apache
系统管理
查看linux系统版本
cat /etc/redhat-release
进程
正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源作用判断服务器健康状态查看系统中所有进程杀死进程
进程查看
… … … ps … … … ∞
# 查看系统中所有进程,使用BSD操作系统格式 |
… … … top … … … ∞
# 查看系统健康状态 |
… … … pstree … … … ∞
# 查看进程树 |
- 进程管理
… … … kill … … … ∞
kill -l # 查看可用的进程信号 |
… … … killall … … … ∞
# 按照进程名杀死进程 |
… … … pkill … … … ∞
# 按照进程名终止进程 |
… … … jobs … … … ∞
# 查看后台的工作 |
… … … fg … … … ∞
# 将后台暂停的工作恢复到前台执行 |
… … … bg … … … ∞
bg %工作号 |
- 系统资源查看
… … … vmstat … … … ∞
# 监控系统资源 |
… … … dmesg … … … ∞
# 开机时内核检查 |
… … … free … … … ∞
# 查看内存使用状态、空闲情况,默认树形Mem物理内存swap交互区内存 内核缓存区内存 |
… … … uptime … … … ∞
uptime # 显示系统的启动时间和平均负载(相当于top第一行),w也可以看到 |
… … … uname … … … ∞
# 查看系统与内核相关信息 |
… … … lsof … … … ∞
列出进程调用或打开的文件的信息 |
… … … crontab … … … ∞
crontab [选项] |
… … … lspci … … … ∞
lspci |grep -i sas 查看raid卡型号 |
… … … systemctl … … … ∞
#列出启动失败的服务 |
… … … md5 … … … ∞
md5sum |
日志管理
日志服务
centos6.x中日志服务由rsyslogd取代原本的syslogd
rsyslogd更先进、功能更多,和syslogd相兼容rsyslogd的新特点
基于TCP网络协议传输日志信息
更安全的网络传输方式
有日志消息的及时分析框架
后台数据库 配置文件中可以写简单的逻辑判断
与syslog配置文件相兼容查看rsyslogd服务是否启动
ps aux | grep rsyslogd
查看是否自启动
chkconfig --list | grep rsyslog
常见日志的作用
/var/log/cron:系统定时任务相关日志
/var/log/cups/:打印信息日志
/var/log/dmesg:系统在开机时内核自检的信息,也可使用dmesg直接查看内核自检信息
/var/log/btmp:错误登录的日志(二进制文件,不能用vi查看,需要使用lastb命令查看)
/var/log/lastlog:系统中所有用户最后一次的登录时间的日志(二进制文件,使用lastlog查看)
/var/log/mailog:邮件信息
/var/log/message:系统重要信息的日志(记录linux系统绝大多数重要信息,如出现问题,首先检查该文件)
/var/log/secure:验证和授权方面的信息,只要涉及账户和密码的程序都会记录(比如系统的登录、ssh的登录、su切换用户、sudo授权、useradd、修改用户密码都会记录在此)
/var/log/wtmp:永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机时间(二进制文件,用last查看)
/var/run/utmp:当前已登录的用户信息,会随着用户的登录、注销而不断变化,只记录当前登录用户信息(二进制文件,用w、who、users等命令查看)
除系统默认的日志外,rpm安装的系统服务也会默认把日志记录在/var/log/中(源码包安装的服务日志在源码包指定目录中),不由rsyslogd服务来记录和管理,由各个服务使用自己的日志管理文档来记录自身日志rpm包安装服务的日志
/var/log/httpd/:rpm包安装的apache服务的默认日志目录
/var/log/mail/:rpm包安装的邮件服务的额外日志目录
/var/log/samba/:rpm包安装的samba服务的日志目录
/var/log/sssd/:守护进程安全服务目录rsyslogd服务日志文件格式
时间产生的时间、发生事件的服务器的主机名、产生时间的服务名或程序名、事件的具体信息/etc/rsyslog.conf配置文件
# 服务名称[连接符号]日志等级 日志记录位置
authpriv.* /var/log/securre # 认证相关服务.所有日志等级 记录在/var/log/secure日志中
1.服务名称
auth:安全和认证相关消息(不推荐使用authpriv替代)
authpriv:安全和认证相关消息(私有的)
cron:系统定时任务cront和at产生的日志
demon:和各个守护进程相关的日志
ftp:ftp守护进程产生的日志
kern:内核产生的日志(不是用户进程产生的)
local0-local7:为本地使用预留的服务
lpr:打印产生的日志
mail:邮件收发信息
news:与新闻服务器相关的日志
syslog:syslogd服务产生的日志信息(虽然服务名已改为rsyslogd,但很多配置都还沿用syslogd)
user:用户等级类别的日志信息
uucp:uucp子系统的日志信息,uucp是早期linux系统进行数据传递的协议,后来也常用在新闻组服务中
2.连接符号
*:代表所有日志等级
.:代表只要比后面的等级高的日志都记录下来(cron.info代表cron服务产生的日志,只要日志登记≥info级别就记录)
.=:代表只记录所需等级日志,其他等级都不记录(*.=emerg代表人和日志服务产生的日志,只要等级是emerg等级就记录,这种用法极少见)
.!:代表不等于,除了该等级的日志外都记录
3.日志等级
debug:一般的调试信息说明
info:基本的通知信息
notice:普通信息,但有一定的重要性
warning:警告信息,但还不会影响到服务或系统的运行
err:错误信息,一般达到err等级的信息已经可以影响到服务或系统的运行了
crit:临界状态信息,比err等级还要严重
alert:警告状态信息,比crit还要严重,必须立即采取行动
emerg:疼痛等级信息,系统已无法使用
4.日志记录位置
日志文件的绝对路径,如/var/log/secure
系统设备文件,如/dev/lp0
转发给远程主机,如@192.168.0.210.514
用户名,如root
忽略或丢弃日志,如~日志轮替
# 日志文件的命名规则
1.如果配置文件中有用dateext参数,日志会用日期作为后缀,例secure-20221219,这样文件名不会重叠
2.如果配置文件中没有dateext参数,日志文件需要进行改名。第一次进行日志轮替时,当前secure自动改名为secure.1,新建secure日志用来保存新的日志,第二次轮替,secure.1自动改名为secure.2以此类推
# logrotate配置文件
daily:日志轮替周期为每天
weekly:日志轮替周期为每周
monthly:日志轮替周期为每月
rotate 数字:保留的日志文件的个数,0指没有备份
compress:日志轮替时,旧的日志进行压缩
create mode owner group:建立新日志,同时指定新日志的权限与所有者和所属组(如create 0600 root utmp)
mail address:日志轮替时,输出内容通过邮件发送到指定邮件地址
missingok:如果日志不存在,则忽略该日志的警告信息
notifempty:如果日志为空文件,则不进行日志轮替
minsize 大小:日志轮替的最小值,日志一定要达到最小值才会轮替,否则就算时间达到也不轮替
size 大小:日志只有大于指定大小才进行日志轮替,而不是按照时间轮替(如size 100k)
dateext:使用日期作为日志轮替文件的后缀
# 把apache日志加入轮替
vi /etc/logrotate.conf
/usr/local/apache2/logs/access_log {
daily
create
rotate 30
}
… … … logrotate … … … ∞
logrotate [选项] 配置文件名 |
启动管理
- CentOS6.x启动管理
# 系统运行级别
0:关机
1:单用户模式(相当于windows的安全模式,主要用于系统修复)
2:不完全的命令行模式,不含NFS服务
3:完全的命令行模式,就是标准字符界面
4:系统保留
5:图形模式
6:重启动
… … … runlevel … … … ∞
查看运行级别 |
… … … init … … … ∞
# 改变运行级别 |
备份恢复
linux系统需要备份的数据
/root/目录、/home/目录、/var/spool/mail/目录、/etc/目录、其他目录备份策略
完全备份:把左右需要备份的数据全部备份,可备份整块硬盘、整个分区或某个具体的目录
增量备份:
差异备份:
… … … dump … … … ∞
dump [选项] 备份后的文件名 原文件或目录 |
其他
… … … chrony … … … ∞
chronyc sources -v |
… … … tcpdump … … … ∞
tcpdump -i eth0 vrrp -n |
… … … openssl … … … ∞
#生成随机密码 |
… … … 登录信息 … … … ∞
登录机器分别排查一下登录记录等信息 |
… … … git … … … ∞
## 提交代码 |
… … … dmidecode … … … ∞
# 查看是虚机还是物理机 |
… … … sar … … … ∞
# 查看时间段负载记录 |
… … … storcli64 … … … ∞
存储节点存在过周六11点左右业务卡顿的问题,将raid卡的CC和PR功能关闭,问题解决。 |
… … … hostname … … … ∞
hostname -f 查看fqdn 主机名+域名 完全域名 |
说些什么吧!