本文共 7237 字,大约阅读时间需要 24 分钟。
本文章是为了记录笔者平常遇到的一些有趣且重要的Shell编程实例,不涉及特别基础的知识的讲解,但会明确指出每个实例所涉及的知识点和多种思路及一些实用的方法。后续会持续进行更新
一.要求:批量生成文件,要求文件名字随机生成且全部为10位的小写字母
二.思路:先生成随机字符,然后通过方法把字符中的大写字母和数字替换成小写字母,或者直接去掉三.涉及知识点:
生成随机数的方法 (1)使用random 特点:随机数范围为0~32767,加密性不是很好,可以通过和md5sum搭配操作并截取来生成更加没有规律的随机数[root@localhost application]# echo $RANDOM32041[root@localhost application]# echo $RANDOM15603[root@localhost application]# echo $RANDOM |md5sum|cut -c 10-20c5d6e24eebd#cut -c 截取第几位到第几位
(2)使用openssl产生随机数
特点:数字与大小写字符相结合,并且带上特殊字符,可以得到很长的位数[root@localhost application]# openssl rand -base64 20gFPC0GQ7ULl9dzuer3lB7k1bePA=
四.具体实现
通过RANDOM变量实现[root@localhost test]# for i in `seq 10` ; do touch `echo $RANDOM |md5sum|cut -c 1-40|sed 's#[^a-z]##g'|cut -c 1-10`;done[root@localhost test]# lsaeeebaadab baafcbedda bdaaaedfbf dedaacd ecadadbcce edbdebdeb eedcfdfbff fcecdcaeeb feedebcccc ffcaaefaba通过openssl实现[root@localhost test]# for i in `seq 10` ; do touch `openssl rand -base64 40|sed 's#[^a-z]##g' | cut -c 1-10` ;done[root@localhost test]# lsebguimpswn flshyoqoxn izjokaxqxf kdxygjiroj mfaeopjzfh opedlaczfu srvtmnrjhx szbsrnobhe tdrqybsrcc vatddlbizj
一.要求:将以fuxiangyu开头的文件,将其中的abc_替换为空
二.思路:改名可以使用mv命令,通过文本处理工具和管道实现mv命令的拼接,或者可以使用专门的改名工具rename 三:涉及知识点 1.rename的使用 作用:将文件名中指定的内容进行替换rename "被替换的字符串" "替换后的字符串" 文件名[root@localhost test]# rm -rf[root@localhost test]# touch fuxiangyuabc.txt[root@localhost test]# rename "abc" "ABC" fuxiangyuabc.txt [root@localhost test]# ls
2.常见的对字符串改名的方法
(1)使用${string/<被替换字段>/替换字段}[root@localhost test]# a=123abc789[root@localhost test]# echo ${a/abc/456}123456789
(2)使用sed进行替换(拼接mv命令)
[root@localhost test]# a=123abc789[root@localhost test]# echo $a | sed 's#abc#456#g'123456789
四.具体实现
创建文件作操作用[root@localhost test]# touch fuxiangyuabc_{1..10}[root@localhost test]# lsfuxiangyuabc_1 fuxiangyuabc_2 fuxiangyuabc_4 fuxiangyuabc_6 fuxiangyuabc_8fuxiangyuabc_10 fuxiangyuabc_3 fuxiangyuabc_5 fuxiangyuabc_7 fuxiangyuabc_91.使用变量自带的方法拼接mv命令[root@localhost test]# for i in `ls fuxiangyu*`; do mv $i `echo ${i/abc_/}`;done[root@localhost test]# lsfuxiangyu1 fuxiangyu10 fuxiangyu2 fuxiangyu3 fuxiangyu4 fuxiangyu5 fuxiangyu6 fuxiangyu7 fuxiangyu8 fuxiangyu92.使用sed拼接mv命令的方法[root@localhost test]# lsfuxiangyuabc_1 fuxiangyuabc_2 fuxiangyuabc_4 fuxiangyuabc_6 fuxiangyuabc_8fuxiangyuabc_10 fuxiangyuabc_3 fuxiangyuabc_5 fuxiangyuabc_7 fuxiangyuabc_9[root@localhost test]# for i in `ls fuxiangyu*`; do mv $i `echo $i | sed 's#abc_##g'`;done[root@localhost test]# lsfuxiangyu1 fuxiangyu10 fuxiangyu2 fuxiangyu3 fuxiangyu4 fuxiangyu5 fuxiangyu6 fuxiangyu7 fuxiangyu8 fuxiangyu93.使用改名工具rename改名[root@localhost test]# lsfuxiangyuabc_1 fuxiangyuabc_2 fuxiangyuabc_4 fuxiangyuabc_6 fuxiangyuabc_8fuxiangyuabc_10 fuxiangyuabc_3 fuxiangyuabc_5 fuxiangyuabc_7 fuxiangyuabc_9[root@localhost test]# rename "abc_" "" fuxiangyu*[root@localhost test]# lsfuxiangyu1 fuxiangyu10 fuxiangyu2 fuxiangyu3 fuxiangyu4 fuxiangyu5 fuxiangyu6 fuxiangyu7 fuxiangyu8 fuxiangyu9
这个脚本的实现是上述两个例子的结合,下面我们给出具体的实现
要求:创建十个用户,以fuxiangyu作为前缀,后接有“_编号”,比如fuxiangyu_1,并为其生成随机密码,生成的密码保存在根目录下的passwd文件下以下是基本实现功能[root@localhost /]# vim useradd.sh #!/bin/bash [ -f /passwd ] || touch /passwd ###判断存放密码的文件是否存在,如果不存在则创建一个user=fuxiangyu_ ###定义文件名的前缀for i in `seq 10`do useradd $user$i &>dev/null ###创建用户 passwd=`openssl rand -base64 40 |cut -c 1-10` ###使用随机数给用户生成密码 echo $passwd | passwd --stdin $user$i &>/dev/null ###给用户添加密码 [ $? -eq 0 ] && echo "user $user$i is ok" || echo "ERROR" ###判断创建用户是否成功,如果成功输出OK,否则报错 echo "username=$user$i passwd= $passwd" >> /passwd###将用户名和密码的对应打印到文件中done效果[root@localhost /]# bash useradd.sh user fuxiangyu_1 is okuser fuxiangyu_2 is okuser fuxiangyu_3 is okuser fuxiangyu_4 is okuser fuxiangyu_5 is okuser fuxiangyu_6 is okuser fuxiangyu_7 is okuser fuxiangyu_8 is okuser fuxiangyu_9 is okuser fuxiangyu_10 is ok[root@localhost /]# tail -10 /etc/passwdfuxiangyu_1:x:1001:1015::/home/fuxiangyu_1:/bin/bashfuxiangyu_2:x:1002:1016::/home/fuxiangyu_2:/bin/bashfuxiangyu_3:x:1003:1017::/home/fuxiangyu_3:/bin/bashfuxiangyu_4:x:1004:1018::/home/fuxiangyu_4:/bin/bashfuxiangyu_5:x:1005:1019::/home/fuxiangyu_5:/bin/bashfuxiangyu_6:x:1006:1020::/home/fuxiangyu_6:/bin/bashfuxiangyu_7:x:1007:1021::/home/fuxiangyu_7:/bin/bashfuxiangyu_8:x:1008:1022::/home/fuxiangyu_8:/bin/bashfuxiangyu_9:x:1009:1023::/home/fuxiangyu_9:/bin/bashfuxiangyu_10:x:1010:1024::/home/fuxiangyu_10:/bin/bash
一.要求:将上述脚本产生的用户删除掉
二.分析:我们可以使用userdel命令或者修改配置文件/etc/passwd的方法来批量删除符合要求的用户 三.涉及知识点 1.Linux中的用户,一般普通用户和root用户使用的shell是/bin/bash,所以我们可以根据这一特点来找出普通用户[root@localhost /]# cat /etc/passwd | grep /bin/bash |grep -v rootfuxiangyu_1:x:1001:1015::/home/fuxiangyu_1:/bin/bashfuxiangyu_2:x:1002:1016::/home/fuxiangyu_2:/bin/bashfuxiangyu_3:x:1003:1017::/home/fuxiangyu_3:/bin/bashfuxiangyu_4:x:1004:1018::/home/fuxiangyu_4:/bin/bashfuxiangyu_5:x:1005:1019::/home/fuxiangyu_5:/bin/bashfuxiangyu_6:x:1006:1020::/home/fuxiangyu_6:/bin/bashfuxiangyu_7:x:1007:1021::/home/fuxiangyu_7:/bin/bashfuxiangyu_8:x:1008:1022::/home/fuxiangyu_8:/bin/bashfuxiangyu_9:x:1009:1023::/home/fuxiangyu_9:/bin/bashfuxiangyu_10:x:1010:1024::/home/fuxiangyu_10:/bin/bash###首先筛选出使用/bin/bash的用户,然后再使用-v参数过滤出root用户
四.实现
[root@localhost /]# vim userdel.sh #!/bin/bashfor i in `cat /etc/passwd | grep fuxiangyu|awk -F ":" '{print $1}'`do userdel $idone
数据的定时备份其实就是一个简单的定时任务,当然有时还需要对日志进行切割等的操作,这里就不给出太深了
cp /var/log/httpd/access_log /home/log.bak/access_log$(date +%Y%m%d-%H%M%S)将上述语句直接加入到定时任务中即可crontab -e ###进入编辑定时任务的界面00 00 * * * cp /var/log/httpd/access_log /home/log.bak/access_log$(date +%Y%m%d-%H%M%S)
一.要求:找出指定目录下的建立时间超过七天的文件,并删除
二.思路:可以通过find的选项,来寻找符合要求的文件 三.涉及知识点: 1.find命令对文件的查找。可以根据时间,大小和权限等 四.具体实现find /var/log/httpd/ -type f -mmtime +7 -exec rm -rf { } \;具体更多的操作可以参见find的用法注意 -exec的使用 后面要加 “{ } \; ”
一.要求:使用脚本检测192.168.10.0/24网段中的存活的主机
二.思路:使用ping命令或者nmap命令来检测网段中存活的主机 三.具体实现 1.使用ping命令#!/bin/bashnet="192.168.10." ###定义要检测的网段for i in `seq 254` ###设置范围do{ ping -c 2 $net$i &>/dev/null ###执行ping命令,指定次数为两次,并将输出结果放入/dev/null中 [ $? -eq 0 ]&& echo "$net$i is accessible " ###判断ping命令的返回值如果返回值为0,则表示主机可到达,即存活}& ###批量执行ping命令可以提高侠侣done实验效果[root@www /]# bash host_test.sh 192.168.10.10 is accessible 192.168.10.2 is accessible 192.168.10.1 is accessible
2.使用nmap ###nmap的使用方法这里就不再赘述
[root@www /]# vim host_test.sh #!/bin/bashCMD="nmap -sn "ip='192.168.10.0/24'for i in `$CMD $ip|awk -F " for " '{print $2}'`do echo "$i is ok"done实现效果[root@www /]# bash host_test.sh 192.168.10.1 is ok192.168.10.2 is okwww.liusi.com is ok(192.168.10.10) is ok
一.要求:编写脚本实现检测网站是正常工作
二.思路:使用命令curl或者wget来对网站进行检测 三.实现 1.使用wget进行检测#!/bin/basharray=( ###定义检查的对象组 www.baidu.com www.4399.com www.51cto.com www.fuxiangyu999.com)for ((i=0;i<${#array[*]};i++)) do wget --spider -q ${array[$i]} ###wget的--spider选项 [ $? -eq 0 ] && echo " ${array[$i]} is ok " || echo "${array[$i]} is have a trouble" done ###通过wget的返回值来判断网站是否正常运作效果[root@www /]# bash web_check.sh www.baidu.com is ok www.4399.com is ok www.51cto.com is ok www.fuxiangyu999.com is have a trouble
2.使用curl进行检测
转载地址:http://fwttd.baihongyu.com/