Linux-shell的108个案例
通用函数库
# cat diy_func.sh redecho() { #颜色开头部分 echo -ne "\e[5;31m" #取出要加上颜色的内容 echo -n "$@" #颜色的结束部分 echo -e "\e[0m" #echo -e "\e[5;31m $@ \e[0m" } greenecho() { echo -ne "\e[1;32m" echo -n "$@" echo -e "\e[0m" } blueecho() { echo -ne "\e[1;34m" echo -n "$@" echo -e "\e[0m" } check_return_value() { if [ $? -eq 0 ] then greenecho $1 命令执行成功 else redecho $1 命令执行失败 fi } check_user() { echo 检查用户 } check_num() { echo 检查数字 }
1.书写Hello world脚本并在用户登录的时候自动运行。
echo "hello world"
2.备份日志/var/log/下面所有到/backup/
#1.vars time=`date +%F` filename=log-${time}.tar.gz #2. tar zcf /backup/${filename} /var/log/
3.一键部署LNMP(RPM 包版本)
#1. vars #nginx,php,mariadb rpmdir=/server/tools/lnmp/ #2. yum localinstall -y /server/tools/lnmp/*.rpm #如果不是软件包yum方式 #配置ngx和phpyum源 yum install -y nginx yum install -y phpxxxxxxxx yum install -y mariadb
4.安装LAMP环境(yum 版本)
yum install -y httpd yum install -y phpxxxxxxxx yum install -y mariadb
5.一键部署 redis
yum install -y redis
6.使用sshpass工具自动交互密码远程其他主机安装httpd软件
#1.检查sshpass是否安装 check_cmd() { cmd=$1 rpm=$2 which $cmd &>/dev/null || { redecho "$cmd 命令不存在" yum install -y $rpm &> /dev/null } } #2. 连接并安装软件 ssh_cmd() { pass=1 sshpass -p$pass ssh root@10.0.0.61 "yum install -y httpd" check_return_value sshpass } #3. main函数 main() { check_cmd sshpass sshpass #check_cmd ifconfig net-tools ssh_cmd } main
#检查当前有多少人远程连接这个主机的22端口 ss -ant |grep -i ESTAB|awk '$4~/:22$/' |wc -l #有多少ip连接本地的任意端口 ss -ant |grep -i ESTAB |wc -l ss -ant |grep -ic ESTAB
8. 统计当前 Linux 系统中可以登录计算机的账户有多少个
#1.过滤/etc/passwd命令解释器是/bin/bash的用户 check_login_etc_passwd() { name_list=`grep '/bin/bash' /etc/passwd|awk -F: '{print $1}'` } #2.根据这个用户去/etc/shadow里面过滤,如果第2列是非*或!就可 以登录. check_login_etc_shadow() { i=0 for name in $name_list do login=`grep -w "${name}" /etc/shadow |awk -F: '{ if($2!~/[*!]/) print 0 ;else print 1 }'` 28 if [ $login -eq 0 ];then 29 greenecho "$name 用户可以登录" 30 let iՎҡ 31 fi 32 done 33 blueecho "可以远程登录系统的用户数量是:$i" 34 } 35 36 #3.main 37 main() { 38 check_login_etc_passwd 39 check_login_etc_shadow 40 } 41 42 main
#1.find 所有层 find /var/log -type f |wc -l find /var/log -type f
10、自动化部署 Tengine源码包软件
#1. 下载软件包 #2. 解压 #3. 安装依赖 #核心步骤: #1. ./configure ./configure Վʔprefix=/app/tools/tengine-2.3.3/ Վʔ add-module=负载均衡状态检查模块 #2. make -j `nproc` #3. make install
#函数使用建议,根据步骤创建函数. . /etc/init.d/diy_func.sh #1.vars choice=$1 debug=0 #2.定义函数 #2.0 加入检查类函数 #命令是否存在 #配置文件是否存在 nginx_count=`ps -ef |grep nginx |grep -v grep |wc - l` [ $debug -eq 1 ] ՎҐ echo $nginx_count #2.1 启动服务的函数 nginx_start() { [ $nginx_count -eq 0 ] ՎҐ\ nginx #2.2 关闭服务的函数 nginx_stop() { [ $debug -eq 1 ] ՎҐ echo $nginx_count [ $nginx_count -ne 0 ] ՎҐ { pkill nginx } } #2.3 重启服务的函数 nginx_restart() { nginx_stop nginx_start } #2.4 服务的状态函数 nginx_status() { #判断服务是否运行 Վˁ 如果运行则显示 nginx is running (pid) Վˁ 如果没有运行显示 nginx is gualed #检查服务的进程数量 [ $debug -eq 1 ] ՎҐ echo $nginx_count if [ $nginx_count -eq 0 ] then redecho "nginx is gualed" else nginx_pid=`ps -ef |grep nginx|grep -v grep |awk '{print $2}'` greenecho "nginx is running ${nginx_pid}" fi } #2.5 用户输入异常提示 error_msg() { redecho "Usage: $0 {start|stop|restart|status}" } #3. case语句引用函数 脚本的主要部分 main() { case "$choice" in start) nginx_start Վʮ stop) nginx_stop Վʮ restart) nginx_restart Վʮ status) nginx_statusՎʮ *) error_msg esac } main
12、自动对磁盘分区、格式化、挂载
. /etc/init.d/diy_func.sh #1. 分区 (可以略过) #2tb 以上 gpt #2tb 以内 mbr(msdos) #parted /dev/sdb mklabel gpt #parted /dev/sdb parted 0 100 ignore #单位mb #2. 格式化 #mkfs.ext4 mkfs.xfs /dev/sdb check_return_value 格式化 #3. 挂载 [ -d /data/ ] Վҗ mkdir -p /data/ mount /dev/sdb /data/ echo "/dev/sdb /data/ xfs defaults 0 0 "ՎҴ/etc/fstab
13、切割 Tengine日志文件(防止单个文件过大,一般用于编译安装的ngx)
#方法01.logrotate 配置文件.参考nginx或系统. 日志切割的配置文件/etc/logrotate.d/ /var/log/nginx/*.log { daily missingok rotate 52 compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript } logrotate命令 #方法02.书写脚本. mv 日志 日志-时间 重启服务,生成新的日志
14、检测 MySQL 数据库连接数量
(ss -ant与过滤3306)
15、根据 md5 校验码,检测文件是否被修改
#1. 系统命令(做1次,有更新的时候做1次.) find /bin/ /sbin/ /root/bin/ -type f|xargs md5sum >/server/files/bin.md5 #2. 检查md5的脚本 md5sum -c Վʔquiet bin.md5
18、将文件中所有的小写字母转换为大写字母
#1.tr [root@web03 ~]# echo {aՎʡz} |tr 'a-zA-Z' 'A-Za-z' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [root@web03 ~]# echo {aՎʡz} {AՎʡZ} |tr 'a-zA-Z' 'AZa-z' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
20、删除某个目录下大小为 0 的文件
find /etc/ -type f -size 0 |xargs ls -lh
/proc/net/dev 网卡信息 + for循环获取.
join -t: /etc/passwd /etc/shadow |awk -F: '{print $1,$8}'
top
#负载信息
#进程总数
#正在运行的进程
#后台挂起
#僵尸进程数量
#僵尸进程名字
#cpu使用率最高的1个进程
#内存使用率最高的1个进程
#拥有多线程的进程
29、查看所有虚拟机磁盘使用量以及CPU使用量信息
#1. 磁盘分区使用情况 . /etc/init.d/diy_func.sh df -hT |egrep 'xfs'|while read line do name=`echo "$line"|awk '{print $NF}'`\ percent=`echo $line|awk -F'[ %]+' '{print $(NF-1)}' ` greenecho "磁盘分区挂载点名字: $name ,使用率${percent}%" done|column -t
30、生成签名私钥和证书
#方法01.使用命令生成
#方法02.网站生成
https:Վˌletsencrypt.org/
shell编程判断与运算
32、判断文件或目录是否存在
-e 或分开写 -f 文件 -d 目录 -h 软连接
33、根据计算机当前时间,返回问候语,可以将该脚本设置为开机启动(早中晚)
#1规定 #早上:6-10 #中午:11-14 #下午:15-18 #晚上:19-23 #半夜+凌晨: 0-5 #2.date #3.判断
34、通过位置变量创建 Linux 系统账户及密码
#1.vars user=$1 pass=$2 #判断 是否为root #判断 参数个数2 #2.user #2.1 检查用户是否存在 #2.2 不存在则创建 #3.pass echo "$pass" |passwd Վʔstdin $user #密码带特殊符号 sh passwd.sh oldboy 'oldboy!$xxx'
36、检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员(2种方法字符串对比和uid
#ʽ `whoami` Վʱ "root" ] [ $UID -ne 0 ] && { echo no root user exit 1 }
#1.vars read -p "input user name:" user read -p "input password:" pass #判断 是否为root #判断 user内容是否为空 [ -z "$user" ] ՎҐ { echo "请输入用户名" exit 1 } #判断 用户是否写密码 Վʽ -z "$pass" ] ՎҐ { # pass=123456 #} #2.user #2.1 检查用户是否存在 #2.2 不存在则创建 if id $user &>/dev/null ;then echo "用户$user已经存在,不创建" else echo "用户$user不存在,创建中" useradd $user fi #3.pass echo "${pass:-123456}" |passwd Վʔstdin $user #密码带特殊符号 sh passwd.sh oldboy 'oldboy!$xxx'
38、输入三个数并进行升序排序(多种方法实现:判断和sort)
#方法01 if判断 111 20 99 read -p "请输入3数字空格分割:" num1 num2 num3 #num1 存放最大的数字 #num2 中间 #num3 最小 #对比num1 num2 #对比num2 num3 #对比num1 num3 #num1 存放最大的数字 #num2 中间 #num3 最小 #方法02 echo $num1 $num2 $num3 |xargs -n1 |sort -rn |xargs
39、统计 13:30 到 14:30 所有访问 Nginx服务器的请求有多少个(根据日志内容调整,群文件access.zip)
awk '/2023:13:30/,/2023:14:30/' access.log |wc -l
42、非交互自动生成 SSH 密钥文件脚本
#1.vars . /etc/init.d/xxx #1.4 判断是否联网或是否可以使用yum #1.5 加入判断sshpass命令是否存在,如果不存在则安装 if_rm_key() { read -p "是否删除密钥重新创建" rm case "$rm" in yes|y|Yes|Y) rm -f ~/.ssh/id_rsa Վʮ no|n|No|N) exit 0 Վʮ *) echo "请输入yes/y no/n" esac } gen_ssh_key() { ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' &>/dev/null if [ $? -eq 0 ];then action "密钥创建成功" /bin/true else action "密钥创建失败" /bin/false fi } #2.创建秘钥对 check_key_cun() { if [ -f ~/.ssh/id_rsa ] ;then echo "已经创建过秘钥对" if_rm_key else echo "正在创建秘钥对...." gen_ssh_key fi } #3. check_key_cun
43、检查特定的软件包是否已经安装脚本
#rpm #dpkg #yum vs apt
44、监控 HTTP 服务器的状态(测试返回码)脚本
#1.vars url=$1 #2. 检查输入是否为url地址 check_url() { [[ $url =~ ^[0-9a-zA-Z./:]+$ ]] Վҗ { echo "请输入有效的url地址" exit 1 } } #3. 检查 url_status() { status_code=`curl -s -I $url |awk 'NRՎҧ1{print $2}'` [ -z "$status_code" ] ՎҐ { echo "$url is failed" exit 2 } if [ $status_code -lt 400 ];then echo "$url is ok" else echo "$url is failed" fi } #4. main函数 main() { check_url url_status } main #curl -s www.baidu.com -w "%{http_code}\n" -o /dev/null
47、提示用户输入年份后判断该年是否为闰年
年%4 -eq 0
48、测试用户名与密码是否正确
远程登录测试 sshpass -p密码 ssh -p22 root@ip whoami
49、批量下载有序文件(pdf、图片、视频、html页面等等)
wget www.baidu.com/lidao{01Վʡ100}.avi
51、自动配置 rsynd 服务器的配置文件 rsyncd.conf
cat<<EOF 配置文件+变量 EOF
52、自动修改计划任务(定时任务)配置文件
#/var/spool/cron/root
53、判断用户输入的数据类型(字母、数字或其他)
本质就是判断用户输入的内容是否符合正则. #1.输入 str #2. [[ $str =~ ^[0-9]+$ ]] [[ $str =~ ^[a-zA-Z]+$ ]] 剩下就是其他类型
55、Shell 脚本对信号的处理,执行脚本后,按键盘 Ctrl+C 无法终止的脚本
运行脚本的时候输出 1. web01 2. web02 3 web03 用户输入ctrl +c 无法取消这个脚本,如何实现? trap
shell编程循环
#1. 用户名的文件 1行就是1个名字 file=name.txt #2. line_cnt=`cat $file|wc -l` rand_num=$((RANDOM%line_cnt+1)) #rand_num=5 #3. 根据取出随机数,输出对应的行的内容. sed -n " ${rand_num}p" $file
find + sed '1i Վʿ/bin/bash'
61、破解虚拟机密码,无密码登陆虚拟机系统
单用户模式/救援模式,vim /etc/passwd root密码的x去掉
63、编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(for 版本,while,多进程并发版本 3种)
#1.for循环 ip_cidr=10.0.0 #10.0.0.1-10.0.0.254 for ip in $ip_cidr.{1Վʡ254} do ping -c1 -W 1 $ip &>/dev/null [ $? -eq 0 ] ՎҐ { echo "$ip is ok" } done #2.while i=1 while [ $i -le 254 ] do ping -c1 -W 1 $ip &>/dev/null [ $? -eq 0 ] ՎҐ { echo "$ip is ok" } let iՎҡ done #3.高并发 . /etc/init.d/diy_func.sh check_ip() { ping -c1 -W 1 $ip &>/dev/null [ $? -eq 0 ] ՎҐ { echo "$ip is ok" } usleep 500 } for ip in 10.0.0.{1Վʡ254} do check_ip & done #4.命令 nmap nmap -sn 10.0.0.0/24
67、使用死循环实时显示 eth0 网卡发送的数据包流量
/proc/net/dev iftop ifconfig
68、使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码本脚本执行,需要提前准备一个 user.txt 文件,该
file=user.txt while read user pass do useradd $user echo $pass |passwd Վʔstdin $user done <$file
#方法01 rename #方法02 mv+for
73、循环关闭局域网中所有主机
#方法01 sshpass +ssh +for+shutdown #方法02 ansible
74、使用 shell 脚本打印图形:等腰三角形,正方形,梯形。
for+for循环 外层循环控制行,内层循环控制列
shell编程数组
思路取出/etc/fstab
思路df
79、读取用户输入的账户名称,将账户名写入到数组保存
变量追加问题 [root@m01 ~]# oldboy=lidao [root@m01 ~]# [root@m01 ~]# oldboy="$oldboy 996" [root@m01 ~]# [root@m01 ~]# echo $oldboy lidao 996 [root@m01 ~]# oldboy="$oldboy 007" [root@m01 ~]# [root@m01 ~]# echo $oldboy lidao 996 007 数组追加 [root@m01 ~]# array=(lidao) [root@m01 ~]# [root@m01 ~]# [root@m01 ~]# array=(${array[@]} oldboy) [root@m01 ~]# echo ${array[@]} lidao oldboy [root@m01 ~]# [root@m01 ~]# [root@m01 ~]# array=(${array[@]} lidao996 ) [root@m01 ~]# echo ${array[@]} lidao oldboy lidao996 [root@m01 ~]#
综合类项目案例
**[root@oldgirl C19]# ls /oldboy** **apquvdpqbk_oldboy.html mpyogpsmwj_oldboy.html txynzwofgg_oldboy.html** **bmqiwhfpgv_oldboy.html mtrzobsprf_oldboy.html vjxmlflawa_oldboy.html** **jhjdcjnjxc_oldboy.html qeztkkmewn_oldboy.html** **jpvirsnjld_oldboy.html ruscyxwxai_oldboy.html** **方法1 : date +%N|md5sum** **方法2: echo $RANDOM|md5sum** **方法3: tr -cd 'a-z' < /dev/urandom|head -c10** **方法4: uuidgen** **方法5: openssl rand -base64 10** 生成随机数字 范围0-55 **echo $((RANDOM%56))** [root@m01 ~]# vim /server/scripts/rand_file.sh [root@m01 ~]# cat /server/scripts/rand_file.sh \Վʿ/bin/bash \################################################### ########### \# File Name: /server/scripts/rand_file.sh \# Version: V1.0 \# Author: oldboy \# Organization: www.oldboyedu.com \################################################### ########### for n in {1Վʡ10} do rand=`tr -cd 'a-z' ՎӚdev/urandom |head -c10` touch /oldboy/${rand}_oldboy.html done [root@m01 ~]# sh /server/scripts/rand_file.sh [root@m01 ~]# ll /oldboy/ total 0 -rw-rՎʔrՎʔ 1 root root 0 Feb 23 20:22 bipcxfdkyr_oldboy.html -rw-rՎʔrՎʔ 1 root root 0 Feb 23 20:22 crpfmcwgrs_oldboy.html -rw-rՎʔrՎʔ 1 root root 0 Feb 23 20:22 dvranswjmo_oldboy.html -rw-rՎʔrՎʔ 1 root root 0 Feb 23 20:22 ihfdhekyuc_oldboy.html drwxr-xr-x 3 root root 15 Feb 22 11:12 lidao -rw-rՎʔrՎʔ 1 root root 0 Feb 23 20:22 lqatatmtpl_oldboy.html -rw-rՎʔrՎʔ 1 root root 0 Feb 23 20:22 mtjfurrptm_oldboy.html -rw-rՎʔrՎʔ 1 root root 0 Feb 23 20:22 sejrehebrn_oldboy.html -rw-rՎʔrՎʔ 1 root root 0 Feb 23 20:22 wnnhtasjav_oldboy.html -rw-rՎʔrՎʔ 1 root root 0 Feb 8 09:17 xqgjapyibm_oldboy.html -rw-rՎʔrՎʔ 1 root root 0 Feb 23 20:22 xyjqthcpyn_oldboy.html -rw-rՎʔrՎʔ 1 root root 0 Feb 23 20:22 znthikjvbx_oldboy.html
83、 企业Shell面试题2:批量改名特殊案例
方法1:for for name in `ls /oldboyՎˇ_oldboy.html` do mv $name ${name/oldboy.html/oldgirl.HTML} #变量子 串 done \#可选方法: echo $name |sed 'sՎՎ˂g' \#可选方法: mv $name ${name%_*}_oldgirl.HTML \#方法2:rename rename _oldboy.html _oldgirl.HTML *_oldboy.html \#方法3:命令拼接 [root@m01 oldboy]# ls *_oldboy.html |sed -r 's#^(.*)(_.*)$#mv &#g'
...
84、 企业Shell面试题3:批量创建特殊要求用户案例
for name in oldboy{01Վʡ10} do rand=`tr -cd 'a-zA-Z0-9' ՎӚdev/urandom |head -c10` useradd $name echo $rand|passwd Վʔstdin $name echo $name $rand ՎҴ/root/pass.txt done
85.写一个Shell脚本解决DOS攻击生产案例。
netstat_log=/server/files/netstat.log tmp_file=/server/files/iptables.tmp awk -F'[ :]+' '/^tcp/{print $4}' ${netstat_log} |sort |uniq -c|sort -rn >${tmp_file} while read line do count=${line% *} ip=${line#* } if [ $count -ge 100 -a `iptables -nL |grep -wc "${ip}"` -eq 0 ];then • iptables -I INPUT -s $ip -j DROP fi doneՎӆ{tmp_file}
89.利用bash for循环打印下面这句话中字母数不大于6的单词(
\#方法1:shell while \#ʿ/bin/bash echo 'I am oldboy teacher welcome to oldboy training class.'|sed 'sՎʽ .Վʠ\n#g'|while read line do if [ ${#line} -lt 6 ];then echo $line fi done \#方法2:awk [root@m01 oldboy]# echo I am oldboy teacher welcome to oldboy training class.|sed 'sՎʽ .Վʠ\n#g' [root@m01 oldboy]# echo I am oldboy teacher welcome to oldboy training class.|sed 'sՎʽ .Վʠ\n#g'|awk 'length()<6' [root@m01 oldboy]# echo I am oldboy teacher welcome to oldboy training class.|egrep -o '[a-Z]+' [root@m01 oldboy]# echo I am oldboy teacher welcome to oldboy training class.|egrep -o '[a-Z]+'|awk 'length()<6' [root@m01 oldboy]# echo I am oldboy teacher welcome to oldboy training class.|awk -vRS='[ .]' 'length()<6' [root@m01 oldboy]# echo I am oldboy teacher welcome to oldboy training class.|awk -F '[ .]' '{for(i=1;i<=NF;iՎҡ)if(length($i)<6)print $i}' [root@m01 oldboy]# echo I am oldboy teacher welcome to oldboy training class.|awk -F '[ .]' '{
排除缓存文件或临时文件,需要与开发沟通. #1. 站点目录某个文件被修改. md5sum + 定时任务对比 #2. 站点目录下面多个文件是否能发现. 对比文件数量(之前的数量保 存到文件与当前对比.)
96. 企业Shell面试题15:开发Rsync服务启动脚本案例
rsync Վʔdaemon
pkill rsync
98. 企业Shell面试题17:天津项目学生实践抓阄案例
基于随机点名程序改改.
避免重复.创建临时文件,取出个删除1行.
101. 企业Shell面试题20:单词及字母去重排序案例
root@oldboy-ecs ~]# egrep -o '[a-z]+' oldboy.txt|sort |uniq -c|sort -rn [root@oldboy-ecs ~]# egrep -o '[a-z]' oldboy.txt|sort |uniq -c|sort -rn [root@oldboy-ecs ~]# awk -F"[ ,.]" '{for(i=1;iՎӋNF;iՎҡ)array[$i]Վҡ}END{for(n in array)print n,array[n]}' oldboy.txt |sort -rnk2 [root@oldboy-ecs ~]# awk -F "" '{for(i=1;iՎӋNF;iՎҡ) if($i~/[a-z]/)array[$i]Վҡ}END{for(n in array)print n,array[n]}' oldboy.txt |sort -rnk2 awk -F "" '{ for(i=1;i<=NF;iՎҡ) if($i~/[a-z]/) • array[$i]Վҡ } END{ for(n in array) print n,array[n] }' oldboy.txt |sort -rnk2
..