1,什么是shell?
Shell 是一个命令解释器,它的作用是解释执行用户输入的命令及程序等,用户输入一条命令,Shell就解释执行一条。这种从键盘一输入命令,就可以立即得到回应的对法方式,称之为交互的方式。
Shell存在于操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户,当我们输入系统用户名和密码,登录到Linux后的所有操作都是Shell解释并执行的。
2,什么是Shell脚本?
了解Shell后,理解Shell脚本就简单了。当命令或者程序语句不在命令行下执行,而是通过一个程序文件执行时,该程序就被称为称为Shell脚本。如果在Shell脚本里内置了很多条命令,语句及循环控制,然后一次性把这些命令执行完,这种通过文件执行脚本的方式,称为非交互的方式。Shell脚本类似于DOS系统下的批处理程序。用户可以在Shell脚本中敲入一系列的命令及语句组合。
这些命令,变量和流程控制语句等有机地结合就形成了一个功能强大的Shell脚本。
其实, shell script是利用shell的功能所写的一个程式(program),这个程式是使用纯文字档,将一些shell的语法与指令(含外部指令)写在里面,搭配正规表示法,管线命令与资料流重导向等功能,以达到我们所想要的处理目的。
所以,简单的说,shell script 就像是早期 DOS 年代的批次档 (.bat) ,最简单的功能就是将许多指令汇整写在一起, 让使用者很轻易的就能够 one touch 的方法去处理复杂的动作 (执行一个档案 "shell script" ,就能够一次执行多个指令)。 而且 shell script 更提供阵列、回圈、条件与逻辑判断等重要功能,让使用者也可以直接以 shell 来撰写程式,而不必使用类似 C 程式语言等传统程式撰写的语法呢!
这么说你可以了解了吗?是的! shell script 可以简单的被看成是批次档, 也可以被说成是一个程式语言,且这个程式语言由于都是利用 shell 与相关工具指令, 所以不需要编译即可执行,且拥有不错的除错 (debug) 工具,所以,他可以帮助系统管理员快速的管理好主机。
简而言之:shell 就是一个更有效的管理服务器的工具
3,为什么要学习shell脚本?
3.1 shell 是Linux底层核心
Linux/Unix系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。每一个合格的Linux系统管理员或运维工程师,都需要熟练Shell脚本语言的编写,并能够阅读系统及各类软件附带的Shell脚本内容,只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础。
3.2 Linux运维工作常用工具
现在和Linux运维关联最火的语言莫过于Python语言了,那么和Python语言相比, Shell具备天生不可替代的优势,再处理系统底层的工作方面,例如:初始化、备份、启动、停止、服务及监控报警等日常运维工作,用Shell会简单、方便,而同样的功能用其他语言就会复杂很多,因此, Shell脚本是企业中Linux自动化运维必备不可替代的工具。
3.3 自动化运维必备基础工具
Devops时代,企业的运维不断地变革,从几年前传统的手工运维,到现如今的自动化运维、平台化运维、智能化运维,所有的运维阶段不管给用户多么智能和多么高大上,最终处理和系统相关的服务和业务时,都必然离不开Shell脚本的支持, Shell脚本是Linux运维人员自动化高效运维必须要掌握的基本编程语言工具。
4,学习好Shell所需要的基础
4.1 熟练使用VIM 编译器
Linux下开发Shell脚本最常使用的编译器是VIM,因此如果能熟练使用并配置好vim的各种高级功能设置,就可以让开发Shell脚本达到事半功倍的效果。
4.2 熟练使用Linux常用命令
和其他的开发语言(例如:Python)不同,Shell脚本语言很少有可以直接使用外部函数库,把Linux系统的命令看做Shell的函数库,因此,对Linux系统常用命令的掌握程度就直接决定运维人员对Shell脚本编程的掌握程度。
4.3 熟练使用三剑客以及正则表达式
Linux正则表达式以及三剑客(grep、 sed、 awk)是Linux系统里所有命令中最核心的3个命令,每个命令加上正则表达式的知识后功能异常强大,如果能掌握它们,就可以在编写Shell脚本中发挥更大的作用。
命令总结
1,线上查询及帮助命令
1.1 man
man - format and display the on-line manual pages
查看帮助,man一下
man 命令 man 配置文件
1.2 help
例如: ls-help
--help是查看简单帮助,没有man详细。没有man的功能强大
1.3 info
info - read Info documents
2,文件和目录操作命令
2.1 ls
ls - list directory contents
- -i 查看Inode
- -d 查看目录
- -l 长格式显示
- -a 查看所有文件(包括隐藏文件)
- -h --human -readable
[root@luffy ~]# ls luffy can [root@luffy ~]# ls -l total 4 drwxr-xr-x. 2 root root 4096 Dec 26 16:38 luffy -rw-r--r--. 1 root root 0 Dec 26 16:39 can [root@luffy ~]# ls -a . luffy .bash_logout .bashrc .cshrc .tcshrc .. .bash_history .bash_profile can .lesshst .viminfo [root@luffy ~]# ls -lh total 4.0K drwxr-xr-x. 2 root root 4.0K Dec 26 16:38 luffy -rw-r--r--. 1 root root 0 Dec 26 16:39 can [root@luffy ~]# ls -d luffy/ luffy/ [root@luffy ~]# ls luffy/ [root@luffy ~]#
2.2 cd
change directory
改变目录
- . 当前目录
- .. 上一级目录
- - 上一次一次目录
- ~ 家目录
- 空格 (空白表示家目录)
[root@luffy luffy]# cd /home/luffy/ [root@luffy luffy]# pwd /home/luffy [root@luffy luffy]# cd . [root@luffy luffy]# pwd /home/luffy [root@luffy luffy]# cd .. [root@luffy home]# pwd /home [root@luffy home]# cd ~ [root@luffy ~]# pwd /root [root@luffy ~]# cd - /home [root@luffy home]# pwd /home [root@luffy home]# cd [root@luffy ~]# pwd /root [root@luffy ~]#
2.3 cp
拷贝文件
cp - copy files and directories
- -a:此参数的效果和同时指定"-dpR"参数相同;
- -d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
- -f:强行复制文件或目录,不论目标文件或目录是否已存在;
- -i:覆盖既有文件之前先询问用户;
- -l:对源文件建立硬连接,而非复制文件;
- -p:保留源文件或目录的属性;
- -R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
- -s:对源文件建立符号连接,而非复制文件;
- -u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;
- -S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀;
- -b:覆盖已存在的文件目标前将目标文件备份;
- -v:详细显示命令执行的操作。
[root@luffy luffy]# touch test [root@luffy luffy]# mkdir test.dir [root@luffy luffy]# /bin/cp test test.dir/ [root@luffy luffy]# ls test.dir/ test [root@luffy luffy]# /bin/cp -i test test.dir/ /bin/cp: overwrite \`test.dir/test\'? y [root@luffy luffy]# rm test.dir/test -f [root@luffy luffy]# chmod 755 test [root@luffy luffy]# /bin/cp test test.dir/ [root@luffy luffy]# ll test.dir/ total 0 -rw-r--r--. 1 root root 0 Dec 26 16:49 test [root@luffy luffy]# ll test -rwxr-xr-x. 1 root root 0 Dec 26 16:46 test [root@luffy luffy]# /bin/cp -p test test.dir/ [root@luffy luffy]# ll test.dir/ total 0 -rwxr-xr-x. 1 root root 0 Dec 26 16:46 test
2.4 find
查找
find - search for files in a directory hierarchy
- -type 类型
- -name 名字
2.5 mkdir
创建目录
mkdir - make directories
- -p / -parents 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录
[root@luffy luffy]# mkdir can/cc mkdir: cannot create directory `can/cc': No such file or directory [root@luffy luffy]# mkdir -p can/cc [root@luffy luffy]# ll can/ total 4 drwxr-xr-x. 2 root root 4096 Dec 26 17:17 cc
2.6 mv
移动或者改名文件
mv - move (rename) files
- --backup=<备份模式>:若需覆盖文件,则覆盖前先行备份;
- -b:当文件存在时,覆盖前,为其创建一个备份;
- -f:若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录;
- -i:交互式操作,覆盖前先行询问用户,如果源文件与目标文件或目标目录中的文件同名,则询问用户是否覆盖目标文件。用户输入”y”,表示将覆盖目标文件;输入”n”,表示取消对源文件的移动。这样可以避免误将文件覆盖。
- --strip-trailing-slashes:删除源文件中的斜杠“/”;
- -S<后缀>:为备份文件指定后缀,而不使用默认的后缀;
- --target-directory=<目录>:指定源文件要移动到目标目录;
- -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
2.7 pwd
显示当前目录路径
pwd - print name of current/working directory
[root@luffy luffy]# pwd /home/luffy [root@luffy luffy]#
2.8 rename
重命名
rename - Rename files
2.9 rm
删除文件或者目录
rm - remove files or directories
- -r
- -f
[root@AIGE test]# pwd /root/test [root@AIGE test]# mkdir test1 [root@AIGE test]# touch test1 [root@AIGE test]# touch test2 [root@AIGE test]# ls test1 test2 [root@AIGE test]# rm test2 rm: remove regular empty file `test2'? n [root@AIGE test]# rm -f test2 [root@AIGE test]# ls test1 [root@AIGE test]# rm -rf test1 [root@AIGE test]# ls [root@AIGE test]#
2.10 rmdir
删除空目录
rmdir - remove empty directories
[root@AIGE test]# pwd /root/test [root@AIGE test]# mkdir test1 [root@AIGE test]# mkdir -p test2/test [root@AIGE test]# rmdir test1 [root@AIGE test]# rmdir test2/ rmdir: failed to remove `test2/': Directory not empty [root@AIGE test]#
2.11 touch
改变文件的时间戳(可以改变已经存在的目录时间戳)
touch - change file timestamps
可以创建一个文件: [root@AIGE test]# ls [root@AIGE test]# pwd /root/test [root@AIGE test]# touch test [root@AIGE test]# ll total 0 -rw-r--r--. 1 root root 0 Dec 27 08:21 test 修改时间戳
2.12 tree
以树形结构列表出目录
tree - list contents of directories in a tree-like format.
- -L 数字
- -d 只显示目录
2.13 basename
带目录和文件名的后缀
basename - strip directory and suffix from filenames
2.14 dirname
dirname - strip non-directory suffix from file name
2.15 chattr
chattr命令用来改变文件属性
chattr - change file attributes on a Linux file system
这项指令可改变存放在ext2文件系统上的文件或者目录属性,这些属性共有以下8中模式:
- a:让文件或目录仅供附加用途;
- b:不更新文件或目录的最后存取时间;
- c:将文件或目录压缩后存放;
- d:将文件或目录排除在倾倒操作之外;
- i:不得任意更动文件或目录;
- s:保密性删除文件或目录;
- S:即时更新文件或目录;
- u:预防意外删除。
2.16 lsattr
lsattr 命令用于查看文件的第二扩展文件系统属性。
lsattr - list file attributes on a Linux second extended file system
- -E:可显示设备属性的当前值,但这个当前值是从用户设备数据库中获得的,而不是从设备直接获得的。
- -D:显示属性的名称,属性的默认值,描述和用户是否可以修改属性值的标志。
- -R:递归的操作方式;
- -V:显示指令的版本信息;
- -a:列出目录中的所有文件,包括隐藏文件。
2.17 file
确定文件的类型
file - determine file type
2.18 MD5sum
采用MD5报文摘要算法(128位)计算和检查文件的校验和
md5sum - compute and check MD5 message digest
习题
-
监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员。提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟: 阶段1:开发一个守护进程脚本每30秒实现检测一次。 阶段2:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误。 阶段3:请使用数组技术实现上述脚本(获取主从判断及错误号部分)
-
使用for循环在/Luffy目录下通过随机小写10个字母加固定字符串Luffy批量创建10个html文件,名称例如为:
[root@luffy luffy]# sh /server/scripts/luffy.sh [root@luffy luffy]# ls coaolvajcq_luffy.html qnvuxvicni_luffy.html vioesjmcbu_luffy.html gmkhrancxh_luffy.html tmdjormaxr_luffy.html wzewnojiwe_luffy.html jdxexendbe_luffy.html ugaywanjlm_luffy.html xzzruhdzda_luffy.html qcawgsrtkp_luffy.html vfrphtqjpc_luffy.html
-
请用至少两种方法实现! 将以上文件名中的Luffy全部改成nami(用for循环实现),并且html改成大写。
-
批量创建10个系统帐号Luffy01-Luffy10并设置密码(密码为随机8位字符串)。
-
写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些(方法有很多) 注意:此脚本使用nmap,如果没有需要使用yum -y install nmap
-
写一个脚本解决DOS攻击生产案例 提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:iptables -I INPUT -s 10.0.1.10 -j DROP。
-
开发mysql多实例启动脚本: 已知mysql多实例启动命令为:mysqld_safe--defaults-file=/data/3306/my.cnf &
停止命令为:mysqladmin -u root -pLuffy123 -S /data/3306/mysql.sockshutdown
请完成mysql多实例启动启动脚本的编写
要求:用函数,case语句、if语句等实现 -
如何实现对MySQL数据库进行分库备份,请用脚本实现
-
如何实现对MySQL数据库进行分库加分表备份,请用脚本实现
-
请用至少两种方法实现! bash for循环打印下面这句话中字母数不大于6的单词
-
开发shell脚本分别实现以脚本传参以及read读入的方式比较2个整数大小。以屏幕输出的方式提醒用户比较结果。注意:一共是开发2个脚本。当用脚本传参以及read读入的方式需要对变量是否为数字、并且传参个数做判断。
-
打印选择菜单,一键安装Web服务:
[root@Luffyscripts]# sh menu.sh 1.[install lamp] 2.[install lnmp] 3.[exit] pls input the num you want:
要求:
1、当用户输入1时,输出“startinstalling lamp.”然后执行/server/scripts/lamp.sh,脚本内容输出"lampis installed"后退出脚本; 2、当用户输入2时,输出“startinstalling lnmp.”然后执行/server/scripts/lnmp.sh输出"lnmpis installed"后退出脚本; 3、当输入3时,退出当前菜单及脚本; 4、当输入任何其它字符,给出提示“Input error”后退出脚本。 5、要对执行的脚本进行相关条件判断,例如:脚本是否存在,是否可执行等。
-
如下 1、监控web服务是否正常,不低于3种监控策略。
2、监控db服务是否正常,不低于3种监控策略。
要求间隔1分钟,持续监控。
思路
1、监控的三种方式
通过进程名监控 ps -ef|grep name
通过端口监控 netstat -lntup|grep port/lsof -i:80
通过链接信息上的进程名 netstat -lntup|grep port
2、等待一分钟
3、后台执行 nohup -
监控memcache服务是否正常,模拟用户(web客户端)检测。 使用nc命令加上set/get来模拟检测,以及监控响应时间及命中率。
-
面试及实战考试题:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次(10分钟时间完成)。
-
写网络服务独立进程模式下rsync的系统启动脚本 例如:/etc/init.d/rsyncd{start|stop|restart}。 要求: 1.要使用系统函数库技巧。 2.要用函数,不能一坨SHI的方式。 3.可被chkconfig管理。
-
要求: 抓阄 1、执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能在出现相同数字。 2、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出继续等待别的学生输入。
-
已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?
-
批量检查多个网站地址是否正常 要求: shell数组方法实现,检测策略尽量模拟用户访问思路
-
用shell处理以下内容 1、按单词出现频率降序排序! 2、按字母出现频率降序排序!
-
【LVS主节点】手工开发ipvsadm管理lvs的脚本ip_vs
实现:/etc/init.d/lvs {start|stop|restart}
-
【LVS主节点】模拟keepalived健康检查功能管理LVS节点, 当节点挂掉(检测2次,间隔2秒)从服务器池中剔除,好了(检测2次,间隔2秒)加进来 提示:利用ipvsadm命令实现添加和减少LVS节点。
-
【LVS客户端节点】开发LVS客户端设置VIP以及抑制ARP的管理脚本 实现:/etc/init.d/lvsclient {start|stop|restart}
-
【LVS备节点】模拟keepalved vrrp功能,监听主节点,如果主节点不可访问则备节点启动并配置LVS实现接管主节点的资源提供服务(提醒:注意ARP缓存)
- 请用shell或Python编写一个正方形(Luffy_square.sh),接收用户输入的数字。
- 请用shell或Python编写一个等腰三角形(Luffy2_triangle.sh),接收用户输入的数字。
- 请用shell或Python编写一个画直角梯形程序(Luffy4.sh),接收用户输入的参数n,m