100个LinuxShell脚本经典案例
给大家分享100个Linux Shell脚本经典案例,另外本篇文档也已经整理成pdf,易失效,请及时保存~链接:https://pan.baidu.com/s/1H8RhYJJWWeoLPd7WUaTi0A?pwd=nawp
提取码:nawp
1、编写hello world脚本 #!/bin/bash # 编写hello world脚本 echo "Hello World!"
2、通过位置变量创建 Linux 系统账户及密码 #!/bin/bash # 通过位置变量创建 Linux 系统账户及密码 #$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数 useradd "$1" echo "$2" | passwd ‐‐stdin "$1"
3、备份日志 #!/bin/bash # 每周 5 使用 tar 命令备份/var/log 下的所有日志文件 # vim /root/logbak.sh # 编写备份脚本,备份后的文件名包含日期标签,防止后面的备份将前面的备份数据覆盖 # 注意 date 命令需要使用反引号括起来,反引号在键盘键上面 tar -czf log-`date +%Y%m%d`.tar.gz /var/log # crontab ‐e #编写计划任务,执行备份脚本 00 03 * * 5 /root/logbak.sh
4、一键部署 LNMP(RPM 包版本) #!/bin/bash # 一键部署 LNMP(RPM 包版本) # 使用 yum 安装部署 LNMP,需要提前配置好 yum 源,否则该脚本会失败 # 本脚本使用于 centos7.2 或 RHEL7.2 yum ‐y install httpd yum ‐y install mariadb mariadb‐devel mariadb‐server yum ‐y install php php‐mysql systemctl start httpd mariadb systemctl enable httpd mariadb
5、监控内存和磁盘容量,小于给定值时报警 #!/bin/bash # 实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M时,发送报警邮件给root管理员 # 提取根分区剩余空间 disk_size=$(df / | awk "///{print $4}") # 提取内存剩余空间 mem_size=$(free | awk "/Mem/{print $4}") while : do # 注意内存和磁盘提取的空间大小都是以 Kb 为单位 if [ $disk_size -le 512000 -a $mem_size -le 1024000 ] then mail ‐s "Warning" root <游戏 game=(石头 剪刀 布) num=$[RANDOM%3] computer=${game[$num]} # 通过随机数获取计算机的出拳 # 出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是 3 中不同的可能 echo "请根据下列提示选择您的出拳手势" echo "1.石头" echo "2.剪刀" echo "3.布" read -p "请选择 1‐3:" person case $person in 1) if [ $num -eq 0 ] then echo "平局" elif [ $num -eq 1 ] then echo "你赢" else echo "计算机赢" fi;; 2) if [ $num -eq 0 ] then echo "计算机赢" elif [ $num -eq 1 ] then echo "平局" else echo "你赢" fi;; 3) if [ $num -eq 0 ] then echo "你赢" elif [ $num -eq 1 ] then echo "计算机赢" else echo "平局" fi;; *) echo "必须输入 1‐3 的数字" esac
12、编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(for 版本) #!/bin/bash # 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机 # 状态(for 版本) for i in {1..254} do # 每隔0.3秒ping一次,一共ping2次,并以1毫秒为单位设置ping的超时时间 ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i &>/dev/null if [ $? -eq 0 ];then echo "192.168.4.$i is up" else echo "192.168.4.$i is down" fi done
13、编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(while 版本) #!/bin/bash # 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机 # 状态(while 版本) i=1 while [ $i -le 254 ] do ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i &>/dev/null if [ $? -eq 0 ];then echo "192.168.4.$i is up" else echo "192.168.4.$i is down" fi let i++ done
14、编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(多进程版) #!/bin/bash # 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机 # 状态(多进程版) #定义一个函数,ping 某一台主机,并检测主机的存活状态 myping(){ ping ‐c 2 ‐i 0.3 ‐W 1 $1 &>/dev/null if [ $? -eq 0 ];then echo "$1 is up" else echo "$1 is down" fi } for i in {1..254} do myping 192.168.4.$i & done # 使用&符号,将执行的函数放入后台执行 # 这样做的好处是不需要等待ping第一台主机的回应,就可以继续并发ping第二台主机,依次类推。
15、编写脚本,显示进度条 #!/bin/bash # 编写脚本,显示进度条 jindu(){ while : do echo -n "#" sleep 0.2 done } jindu & cp -a $1 $2 killall $0 echo "拷贝完成"
16、进度条,动态时针版本;定义一个显示进度的函数,屏幕快速显示| / ‐ #!/bin/bash # 进度条,动态时针版本 # 定义一个显示进度的函数,屏幕快速显示| / ‐ rotate_line(){ INTERVAL=0.5 #设置间隔时间 COUNT="0" #设置4个形状的编号,默认编号为 0(不代表任何图像) while : do COUNT=`expr $COUNT + 1` #执行循环,COUNT 每次循环加 1,(分别代表4种不同的形状) case $COUNT in #判断 COUNT 的值,值不一样显示的形状就不一样 "1") #值为 1 显示‐ echo -e "‐""bc" sleep $INTERVAL ;; "2") #值为 2 显示,第一个是转义 echo -e """bc" sleep $INTERVAL ;; "3") #值为 3 显示| echo -e "|bc" sleep $INTERVAL ;; "4") #值为 4 显示/ echo -e "/bc" sleep $INTERVAL ;; *) #值为其他时,将 COUNT 重置为 0 COUNT="0";; esac done } rotate_line
17、9*9 乘法表 #!/bin/bash # 9*9 乘法表(编写 shell 脚本,打印 9*9 乘法表) for i in `seq 9` do for j in `seq $i` do echo -n "$j*$i=$[i*j] " done echo done
18、使用死循环实时显示 eth0 网卡发送的数据包流量 #!/bin/bash # 使用死循环实时显示 eth0 网卡发送的数据包流量 while : do echo "本地网卡 eth0 流量信息如下: " ifconfig eth0 | grep "RX pack" | awk "{print $5}" ifconfig eth0 | grep "TX pack" | awk "{print $5}" sleep 1 done
19、使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息 #!/bin/bash # 使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码 # 本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息 for i in `cat user.txt` do useradd $i echo "123456" | passwd ‐‐stdin $i done
20、编写批量修改扩展名脚本 #!/bin/bash # 编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件 # 执行脚本时,需要给脚本添加位置参数 # 脚本名 txt doc(可以将 txt 的扩展名修改为 doc) # 脚本名 doc jpg(可以将 doc 的扩展名修改为 jpg) for i in `ls *.$1` do mv $i ${i%.*}.$2 done
21、使用 expect 工具自动交互密码远程其他主机安装 httpd 软件 #!/bin/bash # 使用 expect 工具自动交互密码远程其他主机安装 httpd 软件 # 删除~/.ssh/known_hosts 后,ssh 远程任何主机都会询问是否确认要连接该主机 rm ‐rf ~/.ssh/known_hosts expect </dev/null if [ $? -ne 0 ];then useradd -s /sbin/nologin nginx fi if [ -f nginx‐1.8.0.tar.gz ];then tar -xf nginx‐1.8.0.tar.gz cd nginx‐1.8.0 yum -y install gcc pcre‐devel openssl‐devel zlib‐devel make ./configure ‐‐prefix=/usr/local/nginx ‐‐with‐http_ssl_module make make install ln -s /usr/local/nginx/sbin/nginx /usr/sbin/ cd .. else echo "没有 Nginx 源码包" fi } install_mysql() { yum -y install gcc gcc‐c++ cmake ncurses‐devel perl id mysql &>/dev/null if [ $? -ne 0 ];then useradd -s /sbin/nologin mysql fi if [ -f mysql‐5.6.25.tar.gz ];then tar -xf mysql‐5.6.25.tar.gz cd mysql‐5.6.25 cmake . make make install /usr/local/mysql/scripts/mysql_install_db ‐‐user=mysql ‐‐datadir=/usr/local/mysql/data/ ‐‐basedir=/usr/local/mysql/ chown -R root.mysql /usr/local/mysql chown -R mysql /usr/local/mysql/data /bin/cp -f /usr/local/mysql/support‐files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld /bin/cp -f /usr/local/mysql/support‐files/my‐default.cnf /etc/my.cnf echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf ldconfig echo "PATH=$PATH:/usr/local/mysql/bin/" >> /etc/profile export PATH else echo "没有 mysql 源码包" exit fi } install_php() { #安装 php 时没有指定启动哪些模块功能,如果的用户可以根据实际情况自行添加额外功能如‐‐with‐gd 等 yum -y install gcc libxml2‐devel if [ -f mhash‐0.9.9.9.tar.gz ];then tar -xf mhash‐0.9.9.9.tar.gz cd mhash‐0.9.9.9 ./configure make make install cd .. if [ ! ‐f /usr/lib/libmhash.so ];then ln -s /usr/local/lib/libmhash.so /usr/lib/ fi ldconfig else echo "没有 mhash 源码包文件" exit fi if [ -f libmcrypt‐2.5.8.tar.gz ];then tar -xf libmcrypt‐2.5.8.tar.gz cd libmcrypt‐2.5.8 ./configure make make install cd .. if [ ! -f /usr/lib/libmcrypt.so ];then ln -s /usr/local/lib/libmcrypt.so /usr/lib/ fi ldconfig else echo "没有 libmcrypt 源码包文件" exit fi if [ -f php‐5.4.24.tar.gz ];then tar -xf php‐5.4.24.tar.gz cd php‐5.4.24 ./configure ‐‐prefix=/usr/local/php5 ‐‐with‐mysql=/usr/local/mysql ‐‐enable‐fpm ‐‐ enable‐mbstring ‐‐with‐mcrypt ‐‐with‐mhash ‐‐with‐config‐file‐path=/usr/local/php5/etc ‐‐with‐ mysqli=/usr/local/mysql/bin/mysql_config make && make install /bin/cp -f php.ini‐production /usr/local/php5/etc/php.ini /bin/cp -f /usr/local/php5/etc/php‐fpm.conf.default /usr/local/php5/etc/php‐fpm.conf cd .. else echo "没有 php 源码包文件" exit fi } while : do menu choice case $select in 1) install_nginx ;; 2) install_mysql ;; 3) install_php ;; 4) exit ;; *) echo Sorry! esac done
23、编写脚本快速克隆 KVM 虚拟机 #!/bin/bash # 编写脚本快速克隆 KVM 虚拟机 # 本脚本针对 RHEL7.2 或 Centos7.2 # 本脚本需要提前准备一个 qcow2 格式的虚拟机模板, # 名称为/var/lib/libvirt/images /.rh7_template 的虚拟机模板 # 该脚本使用 qemu‐img 命令快速创建快照虚拟机 # 脚本使用 sed 修改模板虚拟机的配置文件,将虚拟机名称、UUID、磁盘文件名、MAC 地址 # exit code: # 65 ‐> user input nothing # 66 ‐> user input is not a number # 67 ‐> user input out of range # 68 ‐> vm disk image exists IMG_DIR=/var/lib/libvirt/images BASEVM=rh7_template read -p "Enter VM number: " VMNUM if [ $VMNUM -le 9 ];then VMNUM=0$VMNUM fi if [ -z "${VMNUM}" ]; then echo "You must input a number." exit 65 elif [[ ${VMNUM} =~ [a‐z] ]; then echo "You must input a number." exit 66 elif [ ${VMNUM} -lt 1 -o ${VMNUM} -gt 99 ]; then echo "Input out of range" exit 67 fi NEWVM=rh7_node${VMNUM} if [ -e $IMG_DIR/${NEWVM}.img ]; then echo "File exists." exit 68 fi echo -en "Creating Virtual Machine disk image...... " qemu‐img create -f qcow2 ‐b $IMG_DIR/.${BASEVM}.img $IMG_DIR/${NEWVM}.img &> /dev/null echo -e "e[32;1m[OK]e[0m" #virsh dumpxml ${BASEVM} > /tmp/myvm.xml cat /var/lib/libvirt/images/.rhel7.xml > /tmp/myvm.xml sed -i "/${BASEVM}/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml sed -i "/uuid/s/.*</uuid>/$(uuidgen)</uuid>/" /tmp/myvm.xml sed -i "/${BASEVM}.img/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml # 修改 MAC 地址,本例使用的是常量,每位使用该脚本的用户需要根据实际情况修改这些值 # 最好这里可以使用便利,这样更适合于批量操作,可以克隆更多虚拟机 sed -i "/mac /s/a1/0c/" /tmp/myvm.xml echo -en "Defining new virtual machine...... " virsh define /tmp/myvm.xml &> /dev/null echo -e "e[32;1m[OK]e[0m"
24、点名器脚本 #!/bin/bash # 编写一个点名器脚本 # 该脚本,需要提前准备一个 user.txt 文件 # 该文件中需要包含所有姓名的信息,一行一个姓名,脚本每次随机显示一个姓名 while : do #统计 user 文件中有多少用户 line=`cat user.txt |wc ‐l` num=$[RANDOM%line+1] sed -n "${num}p" user.txt sleep 0.2 clear done
25、查看有多少远程的 IP 在连接本机 #!/bin/bash # 查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计) # 使用 netstat ‐atn 可以查看本机所有连接的状态,‐a 查看所有, # -t仅显示 tcp 连接的信息,‐n 数字格式显示 # Local Address(第四列是本机的 IP 和端口信息) # Foreign Address(第五列是远程主机的 IP 和端口信息) # 使用 awk 命令仅显示第 5 列数据,再显示第 1 列 IP 地址的信息 # sort 可以按数字大小排序,最后使用 uniq 将多余重复的删除,并统计重复的次数 netstat -atn | awk "{print $5}" | awk "{print $1}" | sort -nr | uniq -c
26、对 100 以内的所有正整数相加求和(1+2+3+4...+100) #!/bin/bash # 对 100 以内的所有正整数相加求和(1+2+3+4...+100) #seq 100 可以快速自动生成 100 个整数 sum=0 for i in `seq 100` do sum=$[sum+i] done echo "总和是:$sum"
27、统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个 #!/bin/bash # 统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个 # awk 使用‐F 选项指定文件内容的分隔符是/或者: # 条件判断$7:$8 大于等于 13:30,并且要求,$7:$8 小于等于 14:30 # 最后使用 wc ‐l 统计这样的数据有多少行,即多少个 awk -F "[ /:]" "$7":"$8>="13:30" && $7":"$8<="14:30"" /var/log/httpd/access_log |wc -l
28、统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么 #!/bin/bash # 统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么 # awk 使用‐F 选项指定文件内容的分隔符是/或者: # 条件判断$7:$8 大于等于 13:30,并且要求,$7:$8 小于等于 14:30 # 日志文档内容里面,第 1 列是远程主机的 IP 地址,使用 awk 单独显示第 1 列即可 awk -F "[ /:]" "$7":"$8>="13:30" && $7":"$8<="14:30"{print $1}" /var/log/httpd/access_log
29、打印国际象棋棋盘 #!/bin/bash # 打印国际象棋棋盘 # 设置两个变量,i 和 j,一个代表行,一个代表列,国际象棋为 8*8 棋盘 # i=1 是代表准备打印第一行棋盘,第 1 行棋盘有灰色和蓝色间隔输出,总共为 8 列 # i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列 # 棋盘的规律是 i+j 如果是偶数,就打印蓝色色块,如果是奇数就打印灰色色块 # 使用 echo ‐ne 打印色块,并且打印完成色块后不自动换行,在同一行继续输出其他色块 for i in {1..8} do for j in {1..8} do sum=$[i+j] if [ $[sum%2] -eq 0 ];then echo -ne " 33[46m 33[0m" else echo -ne " 33[47m 33[0m" fi done echo done
30、统计每个远程 IP 访问了本机 apache 几次? #!/bin/bash # 统计每个远程 IP 访问了本机 apache 几次? awk "{ip[$1]++}END{for(i in ip){print ip[i],i}}" /var/log/httpd/access_log
31、统计当前 Linux 系统中可以登录计算机的账户有多少个 #!/bin/bash # 统计当前 Linux 系统中可以登录计算机的账户有多少个 #方法 1: grep "bash#34; /etc/passwd | wc -l #方法 2: awk -f: "/bash$/{x++}end{print x}" /etc/passwd
32、统计/var/log 有多少个文件,并显示这些文件名 #!/bin/bash # 统计/var/log 有多少个文件,并显示这些文件名 # 使用 ls 递归显示所有,再判断是否为文件,如果是文件则计数器加 1 cd /var/log sum=0 for i in `ls -r *` do if [ -f $i ];then let sum++ echo "文件名:$i" fi done echo "总文件数量为:$sum"
33、自动为其他脚本添加解释器信息
Docker+K8s+Jenkins 主流技术全解视频资料【干货免费分享】 #!/bin/bash # 自动为其他脚本添加解释器信息#!/bin/bash,如脚本名为 test.sh 则效果如下: # ./test.sh abc.sh 自动为 abc.sh 添加解释器信息 # ./test.sh user.sh 自动为 user.sh 添加解释器信息 # 先使用 grep 判断对象脚本是否已经有解释器信息,如果没有则使用 sed 添加解释器以及描述信息 if ! grep -q "^#!" $1; then sed "1i #!/bin/bash" $1 sed "2i #Description: " fi # 因为每个脚本的功能不同,作用不同,所以在给对象脚本添加完解释器信息,以及 Description 后还希望 # 继续编辑具体的脚本功能的描述信息,这里直接使用 vim 把对象脚本打开,并且光标跳转到该文件的第 2 行 vim +2 $1
34、自动化部署 varnish 源码包软件 #!/bin/bash # 自动化部署 varnish 源码包软件 # 本脚本需要提前下载 varnish‐3.0.6.tar.gz 这样一个源码包软件,该脚本即可用自动源码安装部署软件 yum -y install gcc readline‐devel pcre‐devel useradd -s /sbin/nologin varnish tar -xf varnish‐3.0.6.tar.gz cd varnish‐3.0.6 # 使用 configure,make,make install 源码安装软件包 ./configure ‐‐prefix=/usr/local/varnish make && make install # 在源码包目录下,将相应的配置文件拷贝到 Linux 系统文件系统中 # 默认安装完成后,不会自动拷贝或安装配置文件到 Linux 系统,所以需要手动 cp 复制配置文件 # 并使用 uuidgen 生成一个随机密钥的配置文件 cp redhat/varnish.initrc /etc/init.d/varnish cp redhat/varnish.sysconfig /etc/sysconfig/varnish cp redhat/varnish_reload_vcl /usr/bin/ ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/ ln -s /usr/local/varnish/bin/* /usr/bin mkdir /etc/varnish cp /usr/local/varnish/etc/varnish/default.vcl /etc/varnish/ uuidgen > /etc/varnish/secret
35、编写 nginx 启动脚本 #!/bin/bash # 编写 nginx 启动脚本 # 本脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本 # 如果本脚本名为/etc/init.d/nginx,则 service nginx start 就可以启动该服务 # service nginx stop 就可以关闭服务 # service nginx restart 可以重启服务 # service nginx status 可以查看服务状态 program=/usr/local/nginx/sbin/nginx pid=/usr/local/nginx/logs/nginx.pid start(){ if [ -f $pid ];then echo "nginx 服务已经处于开启状态" else $program fi stop(){ if [ -! -f $pid ];then echo "nginx 服务已经关闭" else $program -s stop echo "关闭服务 ok" fi } status(){ if [ -f $pid ];then echo "服务正在运行..." else echo "服务已经关闭" fi } case $1 in start) start;; stop) stop;; restart) stop sleep 1 start;; status) status;; *) echo "你输入的语法格式错误" esac
36、自动对磁盘分区、格式化、挂载 #!/bin/bash # 自动对磁盘分区、格式化、挂载 # 对虚拟机的 vdb 磁盘进行分区格式化,使用<<将需要的分区指令导入给程序 fdisk # n(新建分区),p(创建主分区),1(分区编号为 1),两个空白行(两个回车,相当于将整个磁盘分一个区) # 注意:1 后面的两个回车(空白行)是必须的! fdisk /dev/vdb << EOF n p 1 wq EOF #格式化刚刚创建好的分区 mkfs.xfs /dev/vdb1 #创建挂载点目录 if [ -e /data ]; then exit fi mkdir /data #自动挂载刚刚创建的分区,并设置开机自动挂载该分区 echo "/dev/vdb1 /data xfs defaults 1 2" >> /etc/fstab mount -a
37、自动优化 Linux 内核参数 #!/bin/bash # 自动优化 Linux 内核参数 #脚本针对 RHEL7 cat >> /usr/lib/sysctl.d/00‐system.conf <> $log_file done
40、根据 md5 校验码,检测文件是否被修改 #!/bin/bash # 根据 md5 校验码,检测文件是否被修改 # 本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目录或文件 # 本脚本在目标数据没有被修改时执行一次,当怀疑数据被人篡改,再执行一次 # 将两次执行的结果做对比,MD5 码发生改变的文件,就是被人篡改的文件 for i in $(ls /etc/*.conf) do md5sum "$i" >> /var/log/conf_file.log done
41、检测 MySQL 服务是否存活 #!/bin/bash # 检测 MySQL 服务是否存活 # host 为你需要检测的 MySQL 主机的 IP 地址,user 为 MySQL 账户名,passwd 为密码 # 这些信息需要根据实际情况修改后方可使用 host=192.168.51.198 user=root passwd=123456 mysqladmin -h "$host" -u "$user" -p"$passwd" ping &>/dev/null if [ $? -eq 0 ] then echo "MySQL is UP" else echo "MySQL is down" fi
42、备份 MySQL 的 shell 脚本(mysqldump版本) #!/bin/bash # 备份 MySQL 的 shell 脚本(mysqldump版本) # 定义变量 user(数据库用户名),passwd(数据库密码),date(备份的时间标签) # dbname(需要备份的数据库名称,根据实际需求需要修改该变量的值,默认备份 mysql 数据库) user=root passwd=123456 dbname=mysql date=$(date +%Y%m%d) # 测试备份目录是否存在,不存在则自动创建该目录 [ ! -d /mysqlbackup ] && mkdir /mysqlbackup # 使用 mysqldump 命令备份数据库 mysqldump -u "$user" -p "$passwd" "$dbname" > /mysqlbackup/"$dbname"-${date}.sql
43、将文件中所有的小写字母转换为大写字母 #!/bin/bash # 将文件中所有的小写字母转换为大写字母 # $1是位置参数,是你需要转换大小写字母的文件名称 # 执行脚本,给定一个文件名作为参数,脚本就会将该文件中所有的小写字母转换为大写字母 tr "[a‐z]" "[A‐Z]" < $1
44、非交互自动生成 SSH 密钥文件 #!/bin/bash # 非交互自动生成 SSH 密钥文件 # ‐t 指定 SSH 密钥的算法为 RSA 算法;‐N 设置密钥的密码为空;‐f 指定生成的密钥文件>存放在哪里 rm -rf ~/.ssh/{known_hosts,id_rsa*} ssh‐keygen -t RSA -N "" -f ~/.ssh/id_rsa
45、检查特定的软件包是否已经安装 #!/bin/bash # 检查特定的软件包是否已经安装 if [ $# -eq 0 ];then echo "你需要制定一个软件包名称作为脚本参数" echo "用法:$0 软件包名称 ..." fi # $@提取所有的位置变量的值,相当于$* for package in "$@" do if rpm -q ${package} &>/dev/null ;then echo -e "${package} 33[32m 已经安装 33[0m" else echo -e "${package} 33[34;1m 未安装 33[0m" fi done
46、监控 HTTP 服务器的状态(测试返回码) #!/bin/bash # 监控 HTTP 服务器的状态(测试返回码) # 设置变量,url为你需要检测的目标网站的网址(IP 或域名),比如百度 url=http://http://183.232.231.172/index.html # 定义函数 check_http: # 使用 curl 命令检查 http 服务器的状态 # ‐m 设置curl不管访问成功或失败,最大消耗的时间为 5 秒,5 秒连接服务为相应则视为无法连接 # ‐s 设置静默连接,不显示连接时的连接速度、时间消耗等信息 # ‐o 将 curl 下载的页面内容导出到/dev/null(默认会在屏幕显示页面内容) # ‐w 设置curl命令需要显示的内容%{http_code},指定curl返回服务器的状态码 check_http() { status_code=$(curl -m 5 -s -o /dev/null -w %{http_code} $url) } while : do check_http date=$(date +%Y%m%d‐%H:%M:%S) # 生成报警邮件的内容 echo "当前时间为:$date $url 服务器异常,状态码为${status_code}. 请尽快排查异常." > /tmp/http$.pid # 指定测试服务器状态的函数,并根据返回码决定是发送邮件报警还是将正常信息写入日志 if [ $status_code -ne 200 ];then mail -s Warning root < /tmp/http$.pid else echo "$url 连接正常" >> /var/log/http.log fi sleep 5 done
47、自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7) #!/bin/bash # 自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7) # # 设置变量定义需要添加到防火墙规则的服务和端口号 # 使用 firewall‐cmd ‐‐get‐services 可以查看 firewall 支持哪些服务 service="nfs http ssh" port="80 22 8080" # 循环将每个服务添加到防火墙规则中 for i in $service do echo "Adding $i service to firewall" firewall‐cmd --add-service=${i} done #循环将每个端口添加到防火墙规则中 for i in $port do echo "Adding $i Port to firewall" firewall‐cmd --add-port=${i}/tcp done #将以上设置的临时防火墙规则,转换为永久有效的规则(确保重启后有效) firewall‐cmd --runtime-to-permanent
48、使用脚本自动创建逻辑卷 #!/bin/bash # 使用脚本自动创建逻辑卷 # 清屏,显示警告信息,创建将磁盘转换为逻辑卷会删除数据 clear echo -e " 33[32m !!!!!!警告(Warning)!!!!!! 33[0m" echo echo "+++++++++++++++++++++++++++++++++++++++++++++++++" echo "脚本会将整个磁盘转换为 PV,并删除磁盘上所有数据!!!" echo "This Script will destroy all data on the Disk" echo "+++++++++++++++++++++++++++++++++++++++++++++++++" echo read -p "请问是否继续 y/n?:" sure # 测试用户输入的是否为 y,如果不是则退出脚本 [ $sure != y ] && exit # 提示用户输入相关参数(磁盘、卷组名称等数据),并测试用户是否输入了这些值,如果没有输入,则脚本退出 read -p "请输入磁盘名称,如/dev/vdb:" disk [ -z $disk ] && echo "没有输入磁盘名称" && exit read -p "请输入卷组名称:" vg_name [ -z $vg_name ] && echo "没有输入卷组名称" && exit read -p "请输入逻辑卷名称:" lv_name [ -z $lv_name ] && echo "没有输入逻辑卷名称" && exit read -p "请输入逻辑卷大小:" lv_size [ -z $lv_size ] && echo "没有输入逻辑卷大小" && exit # 使用命令创建逻辑卷 pvcreate $disk vgcreate $vg_name $disk lvcreate -L ${lv_size}M -n ${lv_name} ${vg_name}
49、显示 CPU 厂商信息 #!/bin/bash # 显示 CPU 厂商信息 awk "/vendor_id/{print $3}" /proc/cpuinfo | uniq
50、删除某个目录下大小为 0 的文件 #!/bin/bash # 删除某个目录下大小为 0 的文件 #/var/www/html 为测试目录,脚本会清空该目录下所有 0 字节的文件 dir="/var/www/html" find $dir -type f -size 0 -exec rm -rf {} ;
51、查找 Linux 系统中的僵尸进程 #!/bin/bash # 查找 Linux 系统中的僵尸进程 # awk 判断 ps 命令输出的第 8 列为 Z 是,显示该进程的 PID 和进程命令 ps aux | awk "{if($8 == "Z"){print $2,$11}}"
52、提示用户输入年份后判断该年是否为闰年 #!/bin/bash # 提示用户输入年份后判断该年是否为闰年 # 能被4整除并且并不能被100整除的年份是闰年 # 能被400整除的年份也是闰年 read -p "请输入一个年份:" year if [ "$year" = "" ];then echo "没有输入年份" exit fi #使用正则测试变量 year 中是否包含大小写字母 if [[ "$year" =~ [a‐Z] ]];then echo "你输入的不是数字" exit fi # 判断是否为闰年 if [ $[year % 4] -eq 0 ] && [ $[year % 100] -ne 0 ];then echo "$year年是闰年" elif [ $[year % 400] -eq 0 ];then echo "$year年是闰年" else echo "$year年不是闰年" fi
53、生成随机密码(urandom 版本) #!/bin/bash # 生成随机密码(urandom 版本) # /dev/urandom 文件是 Linux 内置的随机设备文件 # cat /dev/urandom 可以看看里面的内容,ctrl+c 退出查看 # 查看该文件内容后,发现内容有些太随机,包括很多特殊符号,我们需要的密码不希望使用这些符号 # tr ‐dc "_A‐Za‐z0‐9" < /dev/urandom # 该命令可以将随机文件中其他的字符删除,仅保留大小写字母,数字,下划线,但是内容还是太多 # 我们可以继续将优化好的内容通过管道传递给 head 命令,在大量数据中仅显示头 10 个字节 # 注意 A 前面有个下划线 tr -dc "_A‐Za‐z0‐9"