Linux. shell编程习题集

本文集合了多种实用的Shell脚本,涵盖日志备份、系统监控、软件部署、网络扫描、用户管理等多个方面,旨在帮助系统管理员和开发者提高效率,解决日常运维中的常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、编写hello world脚本

  1. #!/bin/bash
  2. # 编写hello world脚本
  3. echo "Hello World!"

2、通过位置变量创建 Linux 系统账户及密码

  1. #!/bin/bash
  2. # 通过位置变量创建 Linux 系统账户及密码
  3. #$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数
  4. useradd "$1"
  5. echo "$2" | passwd ‐‐stdin "$1"

3、备份日志

  1. #!/bin/bash
  2. # 每周 5 使用 tar 命令备份/var/log 下的所有日志文件
  3. # vim /root/logbak.sh
  4. # 编写备份脚本,备份后的文件名包含日期标签,防止后面的备份将前面的备份数据覆盖
  5. # 注意 date 命令需要使用反引号括起来,反引号在键盘<tab>键上面
  6. tar -czf log-`date +%Y%m%d`.tar.gz /var/log
  7. # crontab ‐e #编写计划任务,执行备份脚本
  8. 00 03 * * 5 /root/logbak.sh

4、一键部署 LNMP(RPM 包版本)

  1. #!/bin/bash
  2. # 一键部署 LNMP(RPM 包版本)
  3. # 使用 yum 安装部署 LNMP,需要提前配置好 yum 源,否则该脚本会失败
  4. # 本脚本使用于 centos7.2 或 RHEL7.2
  5. yum ‐y install httpd
  6. yum ‐y install mariadb mariadb‐devel mariadb‐server
  7. yum ‐y install php php‐mysql
  8. systemctl start httpd mariadb
  9. systemctl enable httpd mariadb

5、监控内存和磁盘容量,小于给定值时报警

  1. #!/bin/bash
  2. # 实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M时,发送报警邮件给root管理员
  3. # 提取根分区剩余空间
  4. disk_size=$(df / | awk '/\//{print $4}')
  5. # 提取内存剩余空间
  6. mem_size=$(free | awk '/Mem/{print $4}')
  7. while :
  8. do
  9. # 注意内存和磁盘提取的空间大小都是以 Kb 为单位
  10. if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]
  11. then
  12. mail ‐s "Warning" root <<EOF
  13. Insufficient resources,资源不足
  14. EOF
  15. fi
  16. done

6、猜数字游戏

  1. #!/bin/bash
  2. # 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,
  3. # 猜小了或猜大了,直至用户猜对脚本结束。
  4. # RANDOM 为系统自带的系统变量,值为 0‐32767的随机数
  5. # 使用取余算法将随机数变为 1‐100 的随机数
  6. num=$[RANDOM%100+1]
  7. echo "$num"
  8. # 使用 read 提示用户猜数字
  9. # 使用 if 判断用户猜数字的大小关系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),
  10. # ‐lt(小于),‐le(小于等于)
  11. while :
  12. do
  13. read -p "计算机生成了一个 1‐100 的随机数,你猜: " cai
  14. if [ $cai -eq $num ]
  15. then
  16. echo "恭喜,猜对了"
  17. exit
  18. elif [ $cai -gt $num ]
  19. then
  20. echo "Oops,猜大了"
  21. else
  22. echo "Oops,猜小了"
  23. fi
  24. done

7、检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员(使用字串对比版本)

  1. #!/bin/bash
  2. # 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不
  3. # 是,则提示您非管理员(使用字串对比版本)
  4. if [ $USER == "root" ]
  5. then
  6. yum ‐y install vsftpd
  7. else
  8. echo "您不是管理员,没有权限安装软件"
  9. fi

8、检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员(使用 UID 数字对比版本)

  1. #!/bin/bash
  2. # 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不
  3. # 是,则提示您非管理员(使用 UID 数字对比版本)
  4. if [ $UID -eq 0 ];then
  5. yum ‐y install vsftpd
  6. else
  7. echo "您不是管理员,没有权限安装软件"
  8. fi

9、编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默认的 123456 作为默认密码。

  1. #!/bin/bash
  2. # 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户
  3. # 不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默
  4. # 认的 123456 作为默认密码。
  5. read -p "请输入用户名: " user
  6. #使用‐z 可以判断一个变量是否为空,如果为空,提示用户必须输入账户名,并退出脚本,退出码为 2
  7. #没有输入用户名脚本退出后,使用$?查看的返回码为 2
  8. if [ -z $user ];then
  9. echo "您不需输入账户名"
  10. exit 2
  11. fi
  12. #使用 stty ‐echo 关闭 shell 的回显功能
  13. #使用 stty echo 打开 shell 的回显功能
  14. stty -echo
  15. read -p "请输入密码: " pass
  16. stty echo
  17. pass=${pass:‐123456}
  18. useradd "$user"
  19. echo "$pass" | passwd ‐‐stdin "$user"

10、输入三个数并进行升序排序

  1. #!/bin/bash
  2. # 依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
  3. read -p "请输入一个整数:" num1
  4. read -p "请输入一个整数:" num2
  5. read -p "请输入一个整数:" num3
  6. # 不管谁大谁小,最后都打印 echo "$num1,$num2,$num3"
  7. # num1 中永远存最小的值,num2 中永远存中间值,num3 永远存最大值
  8. # 如果输入的不是这样的顺序,则改变数的存储顺序,如:可以将 num1 和 num2 的值对调
  9. tmp=0
  10. # 如果 num1 大于 num2,就把 num1 和和 num2 的值对调,确保 num1 变量中存的是最小值
  11. if [ $num1 -gt $num2 ];then
  12. tmp=$num1
  13. num1=$num2
  14. num2=$tmp
  15. fi
  16. # 如果 num1 大于 num3,就把 num1 和 num3 对调,确保 num1 变量中存的是最小值
  17. if [ $num1 -gt $num3 ];then
  18. tmp=$num1
  19. num1=$num3
  20. num3=$tmp
  21. fi
  22. # 如果 num2 大于 num3,就把 num2 和 num3 对标,确保 num2 变量中存的是小一点的值
  23. if [ $num2 -gt $num3 ];then
  24. tmp=$num2
  25. num2=$num3
  26. num3=$tmp
  27. fi
  28. echo "排序后数据(从小到大)为:$num1,$num2,$num3"

11、石头、剪刀、布游戏

  1. #!/bin/bash
  2. # 编写脚本,实现人机<石头,剪刀,布>游戏
  3. game=(石头 剪刀 布)
  4. num=$[RANDOM%3]
  5. computer=${game[$num]}
  6. # 通过随机数获取计算机的出拳
  7. # 出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是 3 中不同的可能
  8. echo "请根据下列提示选择您的出拳手势"
  9. echo "1.石头"
  10. echo "2.剪刀"
  11. echo "3.布"
  12. read -p "请选择 1‐3:" person
  13. case $person in
  14. 1)
  15. if [ $num -eq 0 ]
  16. then
  17. echo "平局"
  18. elif [ $num -eq 1 ]
  19. then
  20. echo "你赢"
  21. else
  22. echo "计算机赢"
  23. fi;;
  24. 2)
  25. if [ $num -eq 0 ]
  26. then
  27. echo "计算机赢"
  28. elif [ $num -eq 1 ]
  29. then
  30. echo "平局"
  31. else
  32. echo "你赢"
  33. fi;;
  34. 3)
  35. if [ $num -eq 0 ]
  36. then
  37. echo "你赢"
  38. elif [ $num -eq 1 ]
  39. then
  40. echo "计算机赢"
  41. else
  42. echo "平局"
  43. fi;;
  44. *)
  45. echo "必须输入 1‐3 的数字"
  46. esac

12、编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(for 版本)

  1. #!/bin/bash
  2. # 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
  3. # 状态(for 版本)
  4. for i in {1..254}
  5. do
  6. # 每隔0.3秒ping一次,一共ping2次,并以1毫秒为单位设置ping的超时时间
  7. ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i &>/dev/null
  8. if [ $? -eq 0 ];then
  9. echo "192.168.4.$i is up"
  10. else
  11. echo "192.168.4.$i is down"
  12. fi
  13. done

13、编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(while 版本) 

  1. #!/bin/bash
  2. # 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
  3. # 状态(while 版本)
  4. i=1
  5. while [ $i -le 254 ]
  6. do
  7. ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i &>/dev/null
  8. if [ $? -eq 0 ];then
  9. echo "192.168.4.$i is up"
  10. else
  11. echo "192.168.4.$i is down"
  12. fi
  13. let i++
  14. done

14、编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(多进程版)

  1. #!/bin/bash
  2. # 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
  3. # 状态(多进程版)
  4. #定义一个函数,ping 某一台主机,并检测主机的存活状态
  5. myping(){
  6. ping ‐c 2 ‐i 0.3 ‐W 1 $1 &>/dev/null
  7. if [ $? -eq 0 ];then
  8. echo "$1 is up"
  9. else
  10. echo "$1 is down"
  11. fi
  12. }
  13. for i in {1..254}
  14. do
  15. myping 192.168.4.$i &
  16. done
  17. # 使用&符号,将执行的函数放入后台执行
  18. # 这样做的好处是不需要等待ping第一台主机的回应,就可以继续并发ping第二台主机,依次类推。

15、编写脚本,显示进度条

  1. #!/bin/bash
  2. # 编写脚本,显示进度条
  3. jindu(){
  4. while :
  5. do
  6. echo -n '#'
  7. sleep 0.2
  8. done
  9. }
  10. jindu &
  11. cp -a $1 $2
  12. killall $0
  13. echo "拷贝完成"

16、进度条,动态时针版本;定义一个显示进度的函数,屏幕快速显示|  / ‐ \

  1. #!/bin/bash
  2. # 进度条,动态时针版本
  3. # 定义一个显示进度的函数,屏幕快速显示| / ‐ \
  4. rotate_line(){
  5. INTERVAL=0.5 #设置间隔时间
  6. COUNT="0" #设置4个形状的编号,默认编号为 0(不代表任何图像)
  7. while :
  8. do
  9. COUNT=`expr $COUNT + 1` #执行循环,COUNT 每次循环加 1,(分别代表4种不同的形状)
  10. case $COUNT in #判断 COUNT 的值,值不一样显示的形状就不一样
  11. "1") #值为 1 显示‐
  12. echo -e '‐'"\b\c"
  13. sleep $INTERVAL
  14. ;;
  15. "2") #值为 2 显示\\,第一个\是转义
  16. echo -e '\\'"\b\c"
  17. sleep $INTERVAL
  18. ;;
  19. "3") #值为 3 显示|
  20. echo -e "|\b\c"
  21. sleep $INTERVAL
  22. ;;
  23. "4") #值为 4 显示/
  24. echo -e "/\b\c"
  25. sleep $INTERVAL
  26. ;;
  27. *) #值为其他时,将 COUNT 重置为 0
  28. COUNT="0";;
  29. esac
  30. done
  31. }
  32. rotate_line

17、9*9 乘法表

  1. #!/bin/bash
  2. # 9*9 乘法表(编写 shell 脚本,打印 9*9 乘法表)
  3. for i in `seq 9`
  4. do
  5. for j in `seq $i`
  6. do
  7. echo -n "$j*$i=$[i*j] "
  8. done
  9. echo
  10. done

18、使用死循环实时显示 eth0 网卡发送的数据包流量

  1. #!/bin/bash
  2. # 使用死循环实时显示 eth0 网卡发送的数据包流量
  3. while :
  4. do
  5. echo '本地网卡 eth0 流量信息如下: '
  6. ifconfig eth0 | grep "RX pack" | awk '{print $5}'
  7. ifconfig eth0 | grep "TX pack" | awk '{print $5}'
  8. sleep 1
  9. done

19、使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息

  1. #!/bin/bash
  2. # 使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码
  3. # 本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息
  4. for i in `cat user.txt`
  5. do
  6. useradd $i
  7. echo "123456" | passwd ‐‐stdin $i
  8. done

20、编写批量修改扩展名脚本

  1. #!/bin/bash
  2. # 编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件
  3. # 执行脚本时,需要给脚本添加位置参数
  4. # 脚本名 txt doc(可以将 txt 的扩展名修改为 doc)
  5. # 脚本名 doc jpg(可以将 doc 的扩展名修改为 jpg)
  6. for i in `ls *.$1`
  7. do
  8. mv $i ${i%.*}.$2
  9. done

21、使用 expect 工具自动交互密码远程其他主机安装 httpd 软件

  1. #!/bin/bash
  2. # 使用 expect 工具自动交互密码远程其他主机安装 httpd 软件
  3. # 删除~/.ssh/known_hosts 后,ssh 远程任何主机都会询问是否确认要连接该主机
  4. rm ‐rf ~/.ssh/known_hosts
  5. expect <<EOF
  6. spawn ssh 192.168.4.254
  7. expect "yes/no" {send "yes\r"}
  8. # 根据自己的实际情况将密码修改为真实的密码字串
  9. expect "password" {send "密码\r"}
  10. expect "#" {send "yum ‐y install httpd\r"}
  11. expect "#" {send "exit\r"}
  12. EOF

22、一键部署 LNMP(源码安装版本)

  1. #!/bin/bash
  2. # 一键部署 LNMP(源码安装版本)
  3. menu()
  4. {
  5. clear
  6. echo " ##############‐‐‐‐Menu‐‐‐‐##############"
  7. echo "# 1. Install Nginx"
  8. echo "# 2. Install MySQL"
  9. echo "# 3. Install PHP"
  10. echo "# 4. Exit Program"
  11. echo " ########################################"
  12. }
  13. choice()
  14. {
  15. read -p "Please choice a menu[1‐9]:" select
  16. }
  17. install_nginx()
  18. {
  19. id nginx &>/dev/null
  20. if [ $? -ne 0 ];then
  21. useradd -s /sbin/nologin nginx
  22. fi
  23. if [ -f nginx‐1.8.0.tar.gz ];then
  24. tar -xf nginx‐1.8.0.tar.gz
  25. cd nginx‐1.8.0
  26. yum -y install gcc pcre‐devel openssl‐devel zlib‐devel make
  27. ./configure ‐‐prefix=/usr/local/nginx ‐‐with‐http_ssl_module
  28. make
  29. make install
  30. ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
  31. cd ..
  32. else
  33. echo "没有 Nginx 源码包"
  34. fi
  35. }
  36. install_mysql()
  37. {
  38. yum -y install gcc gcc‐c++ cmake ncurses‐devel perl
  39. id mysql &>/dev/null
  40. if [ $? -ne 0 ];then
  41. useradd -s /sbin/nologin mysql
  42. fi
  43. if [ -f mysql‐5.6.25.tar.gz ];then
  44. tar -xf mysql‐5.6.25.tar.gz
  45. cd mysql‐5.6.25
  46. cmake .
  47. make
  48. make install
  49. /usr/local/mysql/scripts/mysql_install_db ‐‐user=mysql ‐‐datadir=/usr/local/mysql/data/
  50. ‐‐basedir=/usr/local/mysql/
  51. chown -R root.mysql /usr/local/mysql
  52. chown -R mysql /usr/local/mysql/data
  53. /bin/cp -f /usr/local/mysql/support‐files/mysql.server /etc/init.d/mysqld
  54. chmod +x /etc/init.d/mysqld
  55. /bin/cp -f /usr/local/mysql/support‐files/my‐default.cnf /etc/my.cnf
  56. echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
  57. ldconfig
  58. echo 'PATH=\$PATH:/usr/local/mysql/bin/' >> /etc/profile
  59. export PATH
  60. else
  61. echo "没有 mysql 源码包"
  62. exit
  63. fi
  64. }
  65. install_php()
  66. {
  67. #安装 php 时没有指定启动哪些模块功能,如果的用户可以根据实际情况自行添加额外功能如‐‐with‐gd 等
  68. yum -y install gcc libxml2‐devel
  69. if [ -f mhash‐0.9.9.9.tar.gz ];then
  70. tar -xf mhash‐0.9.9.9.tar.gz
  71. cd mhash‐0.9.9.9
  72. ./configure
  73. make
  74. make install
  75. cd ..
  76. if [ ! ‐f /usr/lib/libmhash.so ];then
  77. ln -s /usr/local/lib/libmhash.so /usr/lib/
  78. fi
  79. ldconfig
  80. else
  81. echo "没有 mhash 源码包文件"
  82. exit
  83. fi
  84. if [ -f libmcrypt‐2.5.8.tar.gz ];then
  85. tar -xf libmcrypt‐2.5.8.tar.gz
  86. cd libmcrypt‐2.5.8
  87. ./configure
  88. make
  89. make install
  90. cd ..
  91. if [ ! -f /usr/lib/libmcrypt.so ];then
  92. ln -s /usr/local/lib/libmcrypt.so /usr/lib/
  93. fi
  94. ldconfig
  95. else
  96. echo "没有 libmcrypt 源码包文件"
  97. exit
  98. fi
  99. if [ -f php‐5.4.24.tar.gz ];then
  100. tar -xf php‐5.4.24.tar.gz
  101. cd php‐5.4.24
  102. ./configure ‐‐prefix=/usr/local/php5 ‐‐with‐mysql=/usr/local/mysql ‐‐enable‐fpm ‐‐
  103. enable‐mbstring ‐‐with‐mcrypt ‐‐with‐mhash ‐‐with‐config‐file‐path=/usr/local/php5/etc ‐‐with‐
  104. mysqli=/usr/local/mysql/bin/mysql_config
  105. make && make install
  106. /bin/cp -f php.ini‐production /usr/local/php5/etc/php.ini
  107. /bin/cp -f /usr/local/php5/etc/php‐fpm.conf.default /usr/local/php5/etc/php‐fpm.conf
  108. cd ..
  109. else
  110. echo "没有 php 源码包文件"
  111. exit
  112. fi
  113. }
  114. while :
  115. do
  116. menu
  117. choice
  118. case $select in
  119. 1)
  120. install_nginx
  121. ;;
  122. 2)
  123. install_mysql
  124. ;;
  125. 3)
  126. install_php
  127. ;;
  128. 4)
  129. exit
  130. ;;
  131. *)
  132. echo Sorry!
  133. esac
  134. done

23、编写脚本快速克隆 KVM 虚拟机

  1. #!/bin/bash
  2. # 编写脚本快速克隆 KVM 虚拟机
  3. # 本脚本针对 RHEL7.2 或 Centos7.2
  4. # 本脚本需要提前准备一个 qcow2 格式的虚拟机模板,
  5. # 名称为/var/lib/libvirt/images /.rh7_template 的虚拟机模板
  6. # 该脚本使用 qemu‐img 命令快速创建快照虚拟机
  7. # 脚本使用 sed 修改模板虚拟机的配置文件,将虚拟机名称、UUID、磁盘文件名、MAC 地址
  8. # exit code:
  9. # 65 ‐> user input nothing
  10. # 66 ‐> user input is not a number
  11. # 67 ‐> user input out of range
  12. # 68 ‐> vm disk image exists
  13. IMG_DIR=/var/lib/libvirt/images
  14. BASEVM=rh7_template
  15. read -p "Enter VM number: " VMNUM
  16. if [ $VMNUM -le 9 ];then
  17. VMNUM=0$VMNUM
  18. fi
  19. if [ -z "${VMNUM}" ]; then
  20. echo "You must input a number."
  21. exit 65
  22. elif [[ ${VMNUM} =~ [a‐z] ]; then
  23. echo "You must input a number."
  24. exit 66
  25. elif [ ${VMNUM} -lt 1 -o ${VMNUM} -gt 99 ]; then
  26. echo "Input out of range"
  27. exit 67
  28. fi
  29. NEWVM=rh7_node${VMNUM}
  30. if [ -e $IMG_DIR/${NEWVM}.img ]; then
  31. echo "File exists."
  32. exit 68
  33. fi
  34. echo -en "Creating Virtual Machine disk image......\t"
  35. qemu‐img create -f qcow2 ‐b $IMG_DIR/.${BASEVM}.img $IMG_DIR/${NEWVM}.img &> /dev/null
  36. echo -e "\e[32;1m[OK]\e[0m"
  37. #virsh dumpxml ${BASEVM} > /tmp/myvm.xml
  38. cat /var/lib/libvirt/images/.rhel7.xml > /tmp/myvm.xml
  39. sed -i "/<name>${BASEVM}/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
  40. sed -i "/uuid/s/<uuid>.*<\/uuid>/<uuid>$(uuidgen)<\/uuid>/" /tmp/myvm.xml
  41. sed -i "/${BASEVM}\.img/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
  42. # 修改 MAC 地址,本例使用的是常量,每位使用该脚本的用户需要根据实际情况修改这些值
  43. # 最好这里可以使用便利,这样更适合于批量操作,可以克隆更多虚拟机
  44. sed -i "/mac /s/a1/0c/" /tmp/myvm.xml
  45. echo -en "Defining new virtual machine......\t\t"
  46. virsh define /tmp/myvm.xml &> /dev/null
  47. echo -e "\e[32;1m[OK]\e[0m"

24、点名器脚本

  1. #!/bin/bash
  2. # 编写一个点名器脚本
  3. # 该脚本,需要提前准备一个 user.txt 文件
  4. # 该文件中需要包含所有姓名的信息,一行一个姓名,脚本每次随机显示一个姓名
  5. while :
  6. do
  7. #统计 user 文件中有多少用户
  8. line=`cat user.txt |wc ‐l`
  9. num=$[RANDOM%line+1]
  10. sed -n "${num}p" user.txt
  11. sleep 0.2
  12. clear
  13. done

25、查看有多少远程的 IP 在连接本机

  1. #!/bin/bash
  2. # 查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计)
  3. # 使用 netstat ‐atn 可以查看本机所有连接的状态,‐a 查看所有,
  4. # -t仅显示 tcp 连接的信息,‐n 数字格式显示
  5. # Local Address(第四列是本机的 IP 和端口信息)
  6. # Foreign Address(第五列是远程主机的 IP 和端口信息)
  7. # 使用 awk 命令仅显示第 5 列数据,再显示第 1 列 IP 地址的信息
  8. # sort 可以按数字大小排序,最后使用 uniq 将多余重复的删除,并统计重复的次数
  9. netstat -atn | awk '{print $5}' | awk '{print $1}' | sort -nr | uniq -c

26、对 100 以内的所有正整数相加求和(1+2+3+4...+100)

  1. #!/bin/bash
  2. # 对 100 以内的所有正整数相加求和(1+2+3+4...+100)
  3. #seq 100 可以快速自动生成 100 个整数
  4. sum=0
  5. for i in `seq 100`
  6. do
  7. sum=$[sum+i]
  8. done
  9. echo "总和是:$sum"

27、统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个

  1. #!/bin/bash
  2. # 统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个
  3. # awk 使用‐F 选项指定文件内容的分隔符是/或者:
  4. # 条件判断$7:$8 大于等于 13:30,并且要求,$7:$8 小于等于 14:30
  5. # 最后使用 wc ‐l 统计这样的数据有多少行,即多少个
  6. awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"' /var/log/httpd/access_log |wc -l

28、统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么 

  1. #!/bin/bash
  2. # 统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么
  3. # awk 使用‐F 选项指定文件内容的分隔符是/或者:
  4. # 条件判断$7:$8 大于等于 13:30,并且要求,$7:$8 小于等于 14:30
  5. # 日志文档内容里面,第 1 列是远程主机的 IP 地址,使用 awk 单独显示第 1 列即可
  6. awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"{print $1}' /var/log/httpd/access_log

29、打印国际象棋棋盘

  1. #!/bin/bash
  2. # 打印国际象棋棋盘
  3. # 设置两个变量,i 和 j,一个代表行,一个代表列,国际象棋为 8*8 棋盘
  4. # i=1 是代表准备打印第一行棋盘,第 1 行棋盘有灰色和蓝色间隔输出,总共为 8 列
  5. # i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列
  6. # 棋盘的规律是 i+j 如果是偶数,就打印蓝色色块,如果是奇数就打印灰色色块
  7. # 使用 echo ‐ne 打印色块,并且打印完成色块后不自动换行,在同一行继续输出其他色块
  8. for i in {1..8}
  9. do
  10. for j in {1..8}
  11. do
  12. sum=$[i+j]
  13. if [ $[sum%2] -eq 0 ];then
  14. echo -ne "\033[46m \033[0m"
  15. else
  16. echo -ne "\033[47m \033[0m"
  17. fi
  18. done
  19. echo
  20. done

30、统计每个远程 IP 访问了本机 apache 几次?

  1. #!/bin/bash
  2. # 统计每个远程 IP 访问了本机 apache 几次?
  3. awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log

31、统计当前 Linux 系统中可以登录计算机的账户有多少个

  1. #!/bin/bash
  2. # 统计当前 Linux 系统中可以登录计算机的账户有多少个
  3. #方法 1:
  4. grep "bash$" /etc/passwd | wc -l
  5. #方法 2:
  6. awk -f: '/bash$/{x++}end{print x}' /etc/passwd

32、统计/var/log 有多少个文件,并显示这些文件名

  1. #!/bin/bash
  2. # 统计/var/log 有多少个文件,并显示这些文件名
  3. # 使用 ls 递归显示所有,再判断是否为文件,如果是文件则计数器加 1
  4. cd /var/log
  5. sum=0
  6. for i in `ls -r *`
  7. do
  8. if [ -f $i ];then
  9. let sum++
  10. echo "文件名:$i"
  11. fi
  12. done
  13. echo "总文件数量为:$sum"

33、自动为其他脚本添加解释器信息

  1. #!/bin/bash
  2. # 自动为其他脚本添加解释器信息#!/bin/bash,如脚本名为 test.sh 则效果如下:
  3. # ./test.sh abc.sh 自动为 abc.sh 添加解释器信息
  4. # ./test.sh user.sh 自动为 user.sh 添加解释器信息
  5. # 先使用 grep 判断对象脚本是否已经有解释器信息,如果没有则使用 sed 添加解释器以及描述信息
  6. if ! grep -q "^#!" $1; then
  7. sed '1i #!/bin/bash' $1
  8. sed '2i #Description: '
  9. fi
  10. # 因为每个脚本的功能不同,作用不同,所以在给对象脚本添加完解释器信息,以及 Description 后还希望
  11. # 继续编辑具体的脚本功能的描述信息,这里直接使用 vim 把对象脚本打开,并且光标跳转到该文件的第 2 行
  12. vim +2 $1

34、自动化部署 varnish 源码包软件

  1. #!/bin/bash
  2. # 自动化部署 varnish 源码包软件
  3. # 本脚本需要提前下载 varnish‐3.0.6.tar.gz 这样一个源码包软件,该脚本即可用自动源码安装部署软件
  4. yum -y install gcc readline‐devel pcre‐devel
  5. useradd -s /sbin/nologin varnish
  6. tar -xf varnish‐3.0.6.tar.gz
  7. cd varnish‐3.0.6
  8. # 使用 configure,make,make install 源码安装软件包
  9. ./configure ‐‐prefix=/usr/local/varnish
  10. make && make install
  11. # 在源码包目录下,将相应的配置文件拷贝到 Linux 系统文件系统中
  12. # 默认安装完成后,不会自动拷贝或安装配置文件到 Linux 系统,所以需要手动 cp 复制配置文件
  13. # 并使用 uuidgen 生成一个随机密钥的配置文件
  14. cp redhat/varnish.initrc /etc/init.d/varnish
  15. cp redhat/varnish.sysconfig /etc/sysconfig/varnish
  16. cp redhat/varnish_reload_vcl /usr/bin/
  17. ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/
  18. ln -s /usr/local/varnish/bin/* /usr/bin
  19. mkdir /etc/varnish
  20. cp /usr/local/varnish/etc/varnish/default.vcl /etc/varnish/
  21. uuidgen > /etc/varnish/secret

35、编写 nginx 启动脚本

  1. #!/bin/bash
  2. # 编写 nginx 启动脚本
  3. # 本脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本
  4. # 如果本脚本名为/etc/init.d/nginx,则 service nginx start 就可以启动该服务
  5. # service nginx stop 就可以关闭服务
  6. # service nginx restart 可以重启服务
  7. # service nginx status 可以查看服务状态
  8. program=/usr/local/nginx/sbin/nginx
  9. pid=/usr/local/nginx/logs/nginx.pid
  10. start(){
  11. if [ -f $pid ];then
  12. echo "nginx 服务已经处于开启状态"
  13. else
  14. $program
  15. fi
  16. stop(){
  17. if [ -! -f $pid ];then
  18. echo "nginx 服务已经关闭"
  19. else
  20. $program -s stop
  21. echo "关闭服务 ok"
  22. fi
  23. }
  24. status(){
  25. if [ -f $pid ];then
  26. echo "服务正在运行..."
  27. else
  28. echo "服务已经关闭"
  29. fi
  30. }
  31. case $1 in
  32. start)
  33. start;;
  34. stop)
  35. stop;;
  36. restart)
  37. stop
  38. sleep 1
  39. start;;
  40. status)
  41. status;;
  42. *)
  43. echo "你输入的语法格式错误"
  44. esac

36、自动对磁盘分区、格式化、挂载

  1. #!/bin/bash
  2. # 自动对磁盘分区、格式化、挂载
  3. # 对虚拟机的 vdb 磁盘进行分区格式化,使用<<将需要的分区指令导入给程序 fdisk
  4. # n(新建分区),p(创建主分区),1(分区编号为 1),两个空白行(两个回车,相当于将整个磁盘分一个区)
  5. # 注意:1 后面的两个回车(空白行)是必须的!
  6. fdisk /dev/vdb << EOF
  7. n
  8. p
  9. 1
  10. wq
  11. EOF
  12. #格式化刚刚创建好的分区
  13. mkfs.xfs /dev/vdb1
  14. #创建挂载点目录
  15. if [ -e /data ]; then
  16. exit
  17. fi
  18. mkdir /data
  19. #自动挂载刚刚创建的分区,并设置开机自动挂载该分区
  20. echo '/dev/vdb1 /data xfs defaults 1 2' >> /etc/fstab
  21. mount -a

37、自动优化 Linux 内核参数

  1. #!/bin/bash
  2. # 自动优化 Linux 内核参数
  3. #脚本针对 RHEL7
  4. cat >> /usr/lib/sysctl.d/00‐system.conf <<EOF
  5. fs.file‐max=65535
  6. net.ipv4.tcp_timestamps = 0
  7. net.ipv4.tcp_synack_retries = 5
  8. net.ipv4.tcp_syn_retries = 5
  9. net.ipv4.tcp_tw_recycle = 1
  10. net.ipv4.tcp_tw_reuse = 1
  11. net.ipv4.tcp_fin_timeout = 30
  12. #net.ipv4.tcp_keepalive_time = 120
  13. net.ipv4.ip_local_port_range = 1024 65535
  14. kernel.shmall = 2097152
  15. kernel.shmmax = 2147483648
  16. kernel.shmmni = 4096
  17. kernel.sem = 5010 641280 5010 128
  18. net.core.wmem_default=262144
  19. net.core.wmem_max=262144
  20. net.core.rmem_default=4194304
  21. net.core.rmem_max=4194304
  22. net.ipv4.tcp_fin_timeout = 10
  23. net.ipv4.tcp_keepalive_time = 30
  24. net.ipv4.tcp_window_scaling = 0
  25. net.ipv4.tcp_sack = 0
  26. EOF
  27. sysctl –p

38、切割 Nginx 日志文件(防止单个文件过大,后期处理很困难)

  1. #mkdir /data/scripts
  2. #vim /data/scripts/nginx_log.sh
  3. #!/bin/bash
  4. # 切割 Nginx 日志文件(防止单个文件过大,后期处理很困难)
  5. logs_path="/usr/local/nginx/logs/"
  6. mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log
  7. kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
  8. # chmod +x /data/scripts/nginx_log.sh
  9. # crontab ‐e #脚本写完后,将脚本放入计划任务每天执行一次脚本
  10. 0 1 * * * /data/scripts/nginx_log.sh

39、检测 MySQL 数据库连接数量

  1. #!/bin/bash
  2. # 检测 MySQL 数据库连接数量
  3. # 本脚本每 2 秒检测一次 MySQL 并发连接数,可以将本脚本设置为开机启动脚本,或在特定时间段执行
  4. # 以满足对 MySQL 数据库的监控需求,查看 MySQL 连接是否正常
  5. # 本案例中的用户名和密码需要根据实际情况修改后方可使用
  6. log_file=/var/log/mysql_count.log
  7. user=root
  8. passwd=123456
  9. while :
  10. do
  11. sleep 2
  12. count=`mysqladmin -u "$user" -p "$passwd" status | awk '{print $4}'`
  13. echo "`date +%Y‐%m‐%d` 并发连接数为:$count" >> $log_file
  14. done

40、根据 md5 校验码,检测文件是否被修改

  1. #!/bin/bash
  2. # 根据 md5 校验码,检测文件是否被修改
  3. # 本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目录或文件
  4. # 本脚本在目标数据没有被修改时执行一次,当怀疑数据被人篡改,再执行一次
  5. # 将两次执行的结果做对比,MD5 码发生改变的文件,就是被人篡改的文件
  6. for i in $(ls /etc/*.conf)
  7. do
  8. md5sum "$i" >> /var/log/conf_file.log
  9. done

41、检测 MySQL 服务是否存活

  1. #!/bin/bash
  2. # 检测 MySQL 服务是否存活
  3. # host 为你需要检测的 MySQL 主机的 IP 地址,user 为 MySQL 账户名,passwd 为密码
  4. # 这些信息需要根据实际情况修改后方可使用
  5. host=192.168.51.198
  6. user=root
  7. passwd=123456
  8. mysqladmin -h '$host' -u '$user' -p'$passwd' ping &>/dev/null
  9. if [ $? -eq 0 ]
  10. then
  11. echo "MySQL is UP"
  12. else
  13. echo "MySQL is down"
  14. fi

42、备份 MySQL 的 shell 脚本(mysqldump版本)

  1. #!/bin/bash
  2. # 备份 MySQL 的 shell 脚本(mysqldump版本)
  3. # 定义变量 user(数据库用户名),passwd(数据库密码),date(备份的时间标签)
  4. # dbname(需要备份的数据库名称,根据实际需求需要修改该变量的值,默认备份 mysql 数据库)
  5. user=root
  6. passwd=123456
  7. dbname=mysql
  8. date=$(date +%Y%m%d)
  9. # 测试备份目录是否存在,不存在则自动创建该目录
  10. [ ! -d /mysqlbackup ] && mkdir /mysqlbackup
  11. # 使用 mysqldump 命令备份数据库
  12. mysqldump -u "$user" -p "$passwd" "$dbname" > /mysqlbackup/"$dbname"-${date}.sql

43、将文件中所有的小写字母转换为大写字母

  1. #!/bin/bash
  2. # 将文件中所有的小写字母转换为大写字母
  3. # $1是位置参数,是你需要转换大小写字母的文件名称
  4. # 执行脚本,给定一个文件名作为参数,脚本就会将该文件中所有的小写字母转换为大写字母
  5. tr "[a‐z]" "[A‐Z]" < $1

44、非交互自动生成 SSH 密钥文件

  1. #!/bin/bash
  2. # 非交互自动生成 SSH 密钥文件
  3. # ‐t 指定 SSH 密钥的算法为 RSA 算法;‐N 设置密钥的密码为空;‐f 指定生成的密钥文件>存放在哪里
  4. rm -rf ~/.ssh/{known_hosts,id_rsa*}
  5. ssh‐keygen -t RSA -N '' -f ~/.ssh/id_rsa

45、检查特定的软件包是否已经安装

  1. #!/bin/bash
  2. # 检查特定的软件包是否已经安装
  3. if [ $# -eq 0 ];then
  4. echo "你需要制定一个软件包名称作为脚本参数"
  5. echo "用法:$0 软件包名称 ..."
  6. fi
  7. # $@提取所有的位置变量的值,相当于$*
  8. for package in "$@"
  9. do
  10. if rpm -q ${package} &>/dev/null ;then
  11. echo -e "${package}\033[32m 已经安装\033[0m"
  12. else
  13. echo -e "${package}\033[34;1m 未安装\033[0m"
  14. fi
  15. done

46、监控 HTTP 服务器的状态(测试返回码)

  1. #!/bin/bash
  2. # 监控 HTTP 服务器的状态(测试返回码)
  3. # 设置变量,url为你需要检测的目标网站的网址(IP 或域名),比如百度
  4. url=http://http://183.232.231.172/index.html
  5. # 定义函数 check_http:
  6. # 使用 curl 命令检查 http 服务器的状态
  7. # ‐m 设置curl不管访问成功或失败,最大消耗的时间为 5 秒,5 秒连接服务为相应则视为无法连接
  8. # ‐s 设置静默连接,不显示连接时的连接速度、时间消耗等信息
  9. # ‐o 将 curl 下载的页面内容导出到/dev/null(默认会在屏幕显示页面内容)
  10. # ‐w 设置curl命令需要显示的内容%{http_code},指定curl返回服务器的状态码
  11. check_http()
  12. {
  13. status_code=$(curl -m 5 -s -o /dev/null -w %{http_code} $url)
  14. }
  15. while :
  16. do
  17. check_http
  18. date=$(date +%Y%m%d‐%H:%M:%S)
  19. # 生成报警邮件的内容
  20. echo "当前时间为:$date
  21. $url 服务器异常,状态码为${status_code}.
  22. 请尽快排查异常." > /tmp/http$$.pid
  23. # 指定测试服务器状态的函数,并根据返回码决定是发送邮件报警还是将正常信息写入日志
  24. if [ $status_code -ne 200 ];then
  25. mail -s Warning root < /tmp/http$$.pid
  26. else
  27. echo "$url 连接正常" >> /var/log/http.log
  28. fi
  29. sleep 5
  30. done

47、自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)

  1. #!/bin/bash
  2. # 自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)
  3. #
  4. # 设置变量定义需要添加到防火墙规则的服务和端口号
  5. # 使用 firewall‐cmd ‐‐get‐services 可以查看 firewall 支持哪些服务
  6. service="nfs http ssh"
  7. port="80 22 8080"
  8. # 循环将每个服务添加到防火墙规则中
  9. for i in $service
  10. do
  11. echo "Adding $i service to firewall"
  12. firewall‐cmd --add-service=${i}
  13. done
  14. #循环将每个端口添加到防火墙规则中
  15. for i in $port
  16. do
  17. echo "Adding $i Port to firewall"
  18. firewall‐cmd --add-port=${i}/tcp
  19. done
  20. #将以上设置的临时防火墙规则,转换为永久有效的规则(确保重启后有效)
  21. firewall‐cmd --runtime-to-permanent

48、使用脚本自动创建逻辑卷

  1. #!/bin/bash
  2. # 使用脚本自动创建逻辑卷
  3. # 清屏,显示警告信息,创建将磁盘转换为逻辑卷会删除数据
  4. clear
  5. echo -e "\033[32m !!!!!!警告(Warning)!!!!!!\033[0m"
  6. echo
  7. echo "+++++++++++++++++++++++++++++++++++++++++++++++++"
  8. echo "脚本会将整个磁盘转换为 PV,并删除磁盘上所有数据!!!"
  9. echo "This Script will destroy all data on the Disk"
  10. echo "+++++++++++++++++++++++++++++++++++++++++++++++++"
  11. echo
  12. read -p "请问是否继续 y/n?:" sure
  13. # 测试用户输入的是否为 y,如果不是则退出脚本
  14. [ $sure != y ] && exit
  15. # 提示用户输入相关参数(磁盘、卷组名称等数据),并测试用户是否输入了这些值,如果没有输入,则脚本退出
  16. read -p "请输入磁盘名称,如/dev/vdb:" disk
  17. [ -z $disk ] && echo "没有输入磁盘名称" && exit
  18. read -p "请输入卷组名称:" vg_name
  19. [ -z $vg_name ] && echo "没有输入卷组名称" && exit
  20. read -p "请输入逻辑卷名称:" lv_name
  21. [ -z $lv_name ] && echo "没有输入逻辑卷名称" && exit
  22. read -p "请输入逻辑卷大小:" lv_size
  23. [ -z $lv_size ] && echo "没有输入逻辑卷大小" && exit
  24. # 使用命令创建逻辑卷
  25. pvcreate $disk
  26. vgcreate $vg_name $disk
  27. lvcreate -L ${lv_size}M -n ${lv_name} ${vg_name}

49、显示 CPU 厂商信息

  1. #!/bin/bash
  2. # 显示 CPU 厂商信息
  3. awk '/vendor_id/{print $3}' /proc/cpuinfo | uniq

50、删除某个目录下大小为 0 的文件

  1. #!/bin/bash
  2. # 删除某个目录下大小为 0 的文件
  3. #/var/www/html 为测试目录,脚本会清空该目录下所有 0 字节的文件
  4. dir="/var/www/html"
  5. find $dir -type f -size 0 -exec rm -rf {} \;

51、查找 Linux 系统中的僵尸进程

  1. #!/bin/bash
  2. # 查找 Linux 系统中的僵尸进程
  3. # awk 判断 ps 命令输出的第 8 列为 Z 是,显示该进程的 PID 和进程命令
  4. ps aux | awk '{if($8 == "Z"){print $2,$11}}'

52、提示用户输入年份后判断该年是否为闰年

  1. #!/bin/bash
  2. # 提示用户输入年份后判断该年是否为闰年
  3. # 能被4整除并且并不能被100整除的年份是闰年
  4. # 能被400整除的年份也是闰年
  5. read -p "请输入一个年份:" year
  6. if [ "$year" = "" ];then
  7. echo "没有输入年份"
  8. exit

2、通过位置变量创建 Linux 系统账户及密码

  1. #!/bin/bash
  2. # 通过位置变量创建 Linux 系统账户及密码
  3. #$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数
  4. useradd "$1"
  5. echo "$2" | passwd ‐‐stdin "$1"

3、备份日志

  1. #!/bin/bash
  2. # 每周 5 使用 tar 命令备份/var/log 下的所有日志文件
  3. # vim /root/logbak.sh
  4. # 编写备份脚本,备份后的文件名包含日期标签,防止后面的备份将前面的备份数据覆盖
  5. # 注意 date 命令需要使用反引号括起来,反引号在键盘<tab>键上面
  6. tar -czf log-`date +%Y%m%d`.tar.gz /var/log
  7. # crontab ‐e #编写计划任务,执行备份脚本
  8. 00 03 * * 5 /root/logbak.sh

4、一键部署 LNMP(RPM 包版本)

  1. #!/bin/bash
  2. # 一键部署 LNMP(RPM 包版本)
  3. # 使用 yum 安装部署 LNMP,需要提前配置好 yum 源,否则该脚本会失败
  4. # 本脚本使用于 centos7.2 或 RHEL7.2
  5. yum ‐y install httpd
  6. yum ‐y install mariadb mariadb‐devel mariadb‐server
  7. yum ‐y install php php‐mysql
  8. systemctl start httpd mariadb
  9. systemctl enable httpd mariadb

5、监控内存和磁盘容量,小于给定值时报警

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值