1.判断/tmp/run目录是否存在,如果不存在就建立,如果存在就删除目录里所有文件
#!/bin/bash dir=/tmp/run [-f$dir]&&mv$dir$dir.bak [-d$dir]&&rm-rf$dir/*||mkdir$dir
2.输入一个文件的绝对路径,判断路径是否存在,而且输出是文件还是目录,如果是字符连接,还得输出是有效的连接还是无效的连接
#!/bin/bash read-p"Inputapath:"path if[-L$path-a-e$path];then echo"thisiseffectivelink" elif[-L$path-a!-e$path];then echo"thisisnoteffectivelink" elif[-d$path];then echo"thisisadirector" elif[-f$path];then echo"thisisfile" elif[-e$path];then echo"thisisaothertypefile" else echo"thefileisnotexist" fi
3.交互模式要求输入一个ip,然后脚本判断这个IP 对应的主机是否 能ping 通,输出结果类似于:
Server10.1.1.20isDown!最后要求把结果邮件到本地管理员root@localhost和mail01@localhost
方法一:
#!/bin/bash read-p"输入IP地址:"ip ping-c2$ip>/dev/null2>&1 if[$?-eq0];then echo"Server$ipisOK."|mail-s'checkserver'root@localhost else echo"Server$ipisDown!"|mail-s'checkserver'root@localhost fi
方法二:
#!/bin/bash read-p"Inputyourip:"ip ping-c1$ip&>/dev/null [$?-eq0]&&echo"server$ipisok"|mail-s"checkserver"root@localhost||echo"server$ipisdown"|mail-s"checkserver"root@localhost
方法三:
#!/bin/bash tmpfile=`mktemp` mailaddr="root@localhostmail@localhost" read-p"输入IP地址:"ip ping-c2$ip>/dev/null2>&1 if[$?-eq0];then echo"Server$ipisUp!">>$tmpfile else echo"Server$ipisDown!">>$tmpfile fi cat$tmpfile mail-s"pingserver"$mailaddr< $tmpfile rm -rf $tmpfile
方法四:
#!/bin/bash rootmail="root@localhost" tmpfile=`mktemp` read-p"Inputaip:"ip ping-c1"$ip"&>/dev/null retval=$? if[$retval-eq0];then echo"Server$ipisup">$tmpfile else echo"Server$ipisdown">$tmpfile fi cat$tmpfile mail-s"pingresult"$rootmail< $tmpfile rm -rf $tmpfile
4.写一个脚本,局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里(如果例举整个网段的254个IP花的时间比较长,可以只分类10个ip10.1.1.1~10) 这只是一个局域网内机器检查通讯的一个思路。
#!/bin/bash #清空原来ip文件里的列表 >/tmp/ip_ok >/tmp/ip_down ip=10.1.1 #循环去ping局域网内的主机 for((i=1;i<=10;i++)) do ping -c1 $ip.$i &>/dev/null test$?-eq0&&echo"$ip.$i"|tee-a/tmp/ip_ok||echo"$ip.$i"|tee-a/tmp/ip_down done 思考:以上方法可以实现,但是速度很慢,希望并行执行 #!/bin/bash #清空原来ip文件里的列表 >/tmp/ip_ok >/tmp/ip_down ip=10.1.1 #循环去ping局域网内的主机 for((i=1;i<=10;i++)) do { ping -c1 $ip.$i &>/dev/null test$?-eq0&&echo"$ip.$i"|tee-a/tmp/ip_ok||echo"$ip.$i"|tee-a/tmp/ip_down }& done wait echo"ipisok..."
5.写一个脚本/home/hello.sh,要求当给脚本输入参数hello时,脚本返回world,给脚本输入参数world时,脚本返回hello。而脚本没有参数或者参数错误时,屏幕上输出“usage:/home/hello.sh hello or world”
#!/bin/bash #read-p"Inputastring:"a if[$#-eq0-o$#-gt1];then echo"usage:/home/program/test4.shworld|hello" #echo"usage:`basename$0`world|hello"#更常用的报错写法 elif["$1"="hello"];then echo"world" elif["$1"="world"];then echo"hello" else echo"usage:/home/program/test4.shworld|hello" fi
6.自动搭建nfs服务
#!/bin/bash #关闭防火墙和selinux serviceiptablesstop chkconfigiptablesoff setenforce0&>/dev/null echo"########防火墙和selinux已经关闭########" #测试网络,配置内网yum源 ping-c1192.168.1.10&>/dev/null if[$?-eq0];then echo"########网络ok########" else echo"########请检查你的网络########" exit fi wget-P/etc/yum.repos.d/ftp://192.168.1.10/demo.repo&>/dev/null #安装相关软件 yum-yinstall'nfs*'rpcbind&>/dev/null&&echo"########软件安装ok#######" #发布共享目录并授权 read-p"Inputyoursharedir:"dir [!-d$dir]&&mkdir$dir-p #授权 chmod1777$dir read-p"Inputyoursharehost(192.168.0.0/24(ro)):"host cat>>/etc/exports<< end $dir $host end #启动服务,开机自启动 service rpcbind restart &>/dev/null&&echo"##########rpcbind服务启动成功#############" servicenfsrestart&>/dev/null&&echo"############nfs服务启动成功#############" chkconfigrpcbindon chkconfignfson #测试验证 mkdir/u01&>/dev/null mount.nfslocalhost:$dir/u01 [$?-eq0]&&echo"nfs服务测试ok,可以正常使用!" umount/u01
7.将/etc/passwd里的用户名分类,分为管理员用户,系统用户,普通用户。
分析: 1.根据用户的uid来判断用户种类 2.用户的信息保存在/etc/passwd文件中,需要在该文件中获取UID 3.根据用户的uid去判断 管理员:root0 系统用户:1-499ftpapache...65534nfsnobody 普通用户:500-60000
#!/bin/bash foriin`cat/etc/passwd|cut-d:-f1,3` do uid=`echo$i|cut-d:-f2` name=`echo$i|cut-d:-f1` [$uid-eq0]&&echo$name>>/tmp/adminuser [$uid-gt0-a$uid-lt500-o$uid-eq65534]&&echo$name>>/tmp/systemuser [$uid-ge500-a$uid-ne65534]&&echo$name>>/tmp/normaluser done
8.写一个倒计时脚本,要求显示离2018年1月1日(元旦节)的凌晨0点,还有多少天,多少时,多少分,多少秒。
分析: 1.该脚本应该是一个死循环,除非当前系统时间等于1月1日的凌晨0点,要退出循环,并且打印元旦快乐break 2.计算未来时间(1月1日的凌晨0点)和当前系统时间的时间差时间单位相同并且以相同的时间为一个基准 需要定义2个变量: 现在时间和未来时间 date命令-d%s 3.计算 假如1月1日和现在时间相差100000s 1天=86400s 1小时=3600s 1分钟=60 $[100000/86400]=天 $[$[100000%86400]/3600]=小时 $[$[100000%3600]/60]=分钟
#!/bin/bash goal=`date+%s-d20181001` whiletrue或者untilfalse do now=`date+%s` if[$[$goal-$now]-eq0];then break fi day=$[($goal-$now)/86400] hour=$[($goal-$now)%86400/3600] minute=$[($goal-$now)%3600/60] second=$[($goal-$now)%60] clear echo"离2018年1月1日还有$day天:$hour时:$minute分:$second秒" sleep1 done echo"元旦节快乐!!!"
9.写一个脚本把一个目录内的所有空文件都删除,最后输出删除的文件的个数。
分析: 1.如何判断文件是空文件-s判断文件内容为非空;判断空文件则!-seg:[!-sfile] 2.定义一个变量count=0来保存删除文件的个数,掌握四则运算letcount++ 3.交互式定义变量让用户自己决定清理哪个目录/data/logs/10个文件循环次数由目录里的文件个数决定find命令
#!/bin/bash read-p"输入一个你要删除空文件的目录:"dir count=0 foriin`find$dir-typef` do [!-s$i]&&rm-rf$i&&letcount++##-s表示非空 done echo"删除的个数为:"$count
10.写一个脚本,将跳板机上yunwei用户的公钥推送到局域网内可以ping通的所有机器上 10.1.1.1~10.1.1.254
分析: 环境: jumper-server有yunwei用户 app1-appn局域网内所有可以ping通的机器 1.在跳板上创建yunwei用户,并且生成一对秘钥 2.检测当前局域网中哪些ip是能ping通哪些是不能ping通循环语句并发的去检查 3.在脚本中所有的交互动作需要用到expect实现 yunwei用户sudo授权: visudo ##Allowroottorunanycommandsanywhere rootALL=(ALL)ALL yunweiALL=(root)NOPASSWD:ALL,!/sbin/shutdown,!/sbin/init,!/bin/rm-rf/
#!/bin/bash #检查局域网中哪些ip是可以ping通,并保存到一个文件 ip1=10.1.1 for((i=1;i<=10;i++)) do { ping -c1 $ip1.$i &>/dev/null [$?-eq0]&&echo"$ip1.$i">>ip_up.txt }& done wait #yunwei用户生成一对秘钥(有交互) [!-f~/.ssh/id_rsa]&&ssh-keygen-P''-f~/.ssh/id_rsa #将yunwe用户的公钥远程拷贝到指定的服务器100循环 ##判断expect程序是否安装 { rpm-qexpect [$?-ne0]&&sudoyum-yinstallexpect whilereadip2 do /usr/bin/expect<<-EOF spawn ssh-copy-id root@$ip2 expect { "yes/no" {send "yes ";exp_continue} "password:" {send "123 "} } expect eof EOF done/dev/null #测试验证 remote_ip=`tail-1ip_up.txt` sshroot@$remote_iphostname [$?-eq0]&&echo"公钥推送完毕...."
#!/bin/bash #pushpublickeytoaap-servers #将局域网内可以ping通的主机ip保存到一个文件 >ip_up.txt foriin{2..10} do { ip=10.1.1.$i ping-c1$ip&>/dev/null [$?-eq0]&&echo$ip|tee-aip_up.txt }&//并行放到后台运行 done wait//等待进程结束 #将yunwei用户目录下的公钥推送到可以ping的服务器上 #1.判断yunwei用户下有没有公钥 [!-f~/.ssh/id_rsa.pub]&&ssh-keygen-P""-f~/.ssh/id_rsa #2.将id_rsa.pub公钥远程推送到指定服务器 #2.1判断expect程序是否安装,没安装则安装它 { rpm-qexpect [$?-ne0]&&sudoyum-yinstallexpect forremote_ipin`catip_up.txt` do /usr/bin/expect<<-EOF spawn ssh-copy-id root@$remote_ip expect { "yes/no" { send "yes ";exp_continue } "password:" { send "123 " } } expect eof EOF done } &>/dev/null #测试验证 test_ip=`tail-1ip_up.txt` sshroot@$test_iphostname test$?-eq0&&echo"公钥推送成功。"
#!/bin/bash [!-f~/.ssh/id_rsa.pub]&&ssh-keygen-P""-f~/.ssh/id_rsa rpm-qexpect [$?-ne0]&&sudoyum-yinstallexpect foriin{130..140} do ip=192.168.44.$i ping-c1$ip [$?-ne0]&&continue echo$ip>>ip_up.txt /usr/bin/expect<<-EOF spawn ssh-copy-id root@$ip expect { "yes/no" { send "yes ";exp_continue } "password:" { send "123456 " } } expect eof EOF done #测试验证 test_ip=`tail -1 ip_up.txt` ssh root@$test_ip hostname test $? -eq 0 && echo "公钥推送成功。"
11.
任务/背景:
现有的跳板机虽然实现了统一入口来访问生产服务器,yunwei用户权限太大可以操作跳板机上的所有目录文件,存在数据被误删的安全隐患,所以希望你做一些安全策略来保证跳板机的正常使用。
具体要求:
只允许yunwei用户通过跳板机远程连接后台的应用服务器做一些维护操作
公司运维人员远程通过yunwei用户连接跳板机时,跳出以下菜单供选择:
欢迎使用Jumper-server,请选择你要操作的主机: 1.DB1-Master 2.DB2-Slave 3.Web1 4.Web2 q.exit
当用户选择相应主机后,直接免密码登录成功
如果用户不输入一直提示用户输入,直到用户选择退出
思路:
需要当yunwei用户登录时执行一个脚本(该脚本放到哪里?)yunwei用户的家目录里的.bashrc
脚本中需要打印一个菜单供用户选择(case…esac)
免密码登录(上面第10个脚本推公钥的脚本)
#!/bin/bash #公钥推送成功 trap''12319 #打印菜单用户选择 menu(){ cat<<-EOF 欢迎使用Jumper-server,请选择你要操作的主机: 1. DB1-Master 2. DB2-Slave 3. Web1 4. Web2 h. help q. exit EOF } #调用函数来打印菜单 menu while true do read -p "请输入你要选择的主机[h for help]:" host #通过case语句来匹配用户所输入的主机 case $host in 1|DB1) ssh root@10.1.1.1 ;; 2|DB2) ssh root@10.1.1.2 ;; 3|web1) ssh root@10.1.1.250 ;; h|help) clear;menu ;; q|quit) exit ;; esac done #!/bin/bash #jumper-server #菜单打印 trap '' 1 2 3 while true do cat <<-END 欢迎使用Jumper-server,请选择你要操作的主机: 1. DB1-Master 2. DB2-Slave 3. Web1 4. Web2 5. exit END #让用户选择相应的操作 read -p "请输入你要操作的主机:" host case $host in 1) ssh root@10.1.1.2 ;; 2) ssh root@10.1.1.3 ;; 3) ssh root@10.1.1.4 ;; 5) exit ;; *) clear echo "输入错误,请重新输入..." ;; esac done
12.写一个脚本,统计web服务的不同连接状态个数
#!/bin/bash #count_http_80_state #统计每个状态的个数 declare-ASTATE states=`ss-ant|grep80|cut-d''-f1` foriin$states do letSTATE[$i]++ done #通过遍历数组里的索引和元素打印出来 forjin${!STATE[@]} do echo$j:${STATE[$j]} done
13.写一个自动搭建apache服务的脚本,要求如下:
1、用户输入web服务器的IP、域名以及数据根目录 2、如果用户不输入则一直提示输入,直到输入为止 3、当访问www.test.cc时可以访问到数据根目录里的首页文件“thisistestpage”
#!/bin/bash #定义函数实现用户不输入则一直提示输入,直到输入为止 input_fun(){ input_var='' while[-z$input_var] do read-p"$1"input_var done echo$input_var } #调用函数并且获取用户输入web服务器的IP、域名以及数据根目录 IP=`input_fun请输入你的IP地址:` name=`input_fun请输入你的域名:` dir=`input_fun请输入你的数据根目录:` #将ip与主机名输入到hosts文件里 cat>>/etc/hosts<$dir/index.html #yum安装apache yum-yinstallhttpd&>/dev/null #发布虚拟主机 cat>>/etc/httpd/conf/httpd.conf<<-EOF NameVirtualHost *:80 ServerAdminwebmaster@dummy-host.example.com DocumentRoot$dir ServerName$name ErrorLoglogs/dummy-host.example.com-error_log CustomLoglogs/dummy-host.example.com-access_logcommon EOF #启动 servicehttpdrestart&>/dev/null echo"====apache启动成功====" #测试验证 curlhttp://$name
14.需求:写一个脚本让用户输入基本信息(姓名,性别,年龄),如不输入一直提示输入,最后根据用户的信息输出相对应的内容
思路:
循环直到输入字符串不为空 -z -n
根据用户输入信息做出匹配判断
#!/bin/bash #该函数实现用户如果不输入内容则一直循环直到用户输入为止,并且将用户输入的内容打印出来 input_fun() { input_var="" output_var=$1 while[-z$input_var] do read-p"$output_var"input_var done echo$input_var } 或者 fun(){ read-p"请输入您的姓名:"name if[-z$name];then fun else echo"你好,$name!" fi } fun #调用函数并且获取用户的姓名、性别、年龄分别赋值给name、sex、age变量 name=$(input_fun请输入你的姓名:) sex=$(input_fun请输入你的性别:) age=$(input_fun请输入你的年龄:) #根据用户输入的性别进行匹配判断 #根据用户所输入的内容进行判断输入 case$sexin man|男) if[$age-ge18-a$age-le25];then echo"哥们,娶媳妇了吗" elif[$age-gt25-a$age-le35];then echo"要担起家庭的责任" elif[$age-lt18];then echo"小伙子不错" else echo"$name先生,你油腻了吗?" fi ;; woman|女) echo"$name小姐姐你好漂亮" ;; *) echo"你是泰国来的吗?" ;; esac
15.写一个初始化系统的脚本
1)自动修改主机名(如:ip是192.168.0.88,则主机名改为server88.itcast.cc) a.更改文件非交互式sed /etc/sysconfig/network b.将本主机的IP截取出来赋值给一个变量ip;再然后将ip变量里以.分割的最后一位赋值给另一个变量ip1 2)自动配置可用的yum源 3)自动关闭防火墙和selinux
#!/bin/bash ip=`ifconfigeth1|sed-n'2p'|sed's/.*addr:(.*)Bcast.*/1/g'` ip1=`echo$ip|cut-d.-f4` #修改主机名 sed-i"/HOSTNAME=/cHOSTNAME=server$ip1.itcast.cc"/etc/sysconfig/network echo"$ipserver$ip1.itcast.cc">>/etc/hosts #配置yum源 mount/dev/sr0/mnt/&>/dev/null cat>/etc/yum.repos.d/local.repo<<-EOF [local] name=local yum baseurl=file:///mnt enabled=1 gpgcheck=0 EOF #关闭防火墙和selinux service iptables stop &>/dev/null setenforce0&>/dev/null #sed-i'/SELINUX=/cSELINUX=disabled'/etc/selinux/config
16.写一个搭建ftp服务的脚本,要求如下:
1)不支持本地用户登录 2)匿名用户可以上传新建删除 3)匿名用户限速500KBps
#!/bin/bash #安装软件 read-p"请输入需要安装的软件:"s yum-yinstall$s&>/dev/null #备份配置文件 c=/etc/vsftpd/vsftpd.conf cp$c$c.bak #修改配置文件 sed-i'/local_enable/clocal_enable=NO'$c sed-i'$aanon_upload_enable=YES'$c sed-i'$aanon_mkdir_write_enable=YES'$c sed-i'$aanon_other_write_enable=YES'$c sed-i'$aanon_max_rate=512000'$c #启动服务 servicevsftpdrestart&>/dev/null echo'vsftpd启动成功' #测试验证 chmod777/var/ftp/pub touch/var/ftp/pub/1.txt ip=`ifconfigeth1|sed-n'2p'|sed's/.*addr:(.*)Bcast.*/1/g'` cd/tmp lftp$ip<
17.写一个自动检测磁盘使用率的脚本,当磁盘使用空间达到90%以上时,需要发送邮件给相关人员
#!/bin/bash #Name:check_space.sh #Desc:checkdiskspace /bin/df-h>df.txt use=`catdf.txt|awk'{print$5}'|grep-o'[0-9]+'` foriin$use do [$i-ge90]&&echonoticediskspace:`grep$idf.txt`|mailtom done rm-fdf.txt
18.写一个脚本监控系统内存和交换分区使用情况
#!/bin/bash OIFS=$IFS初始化默认分隔符 IFS=" "定义默认分隔符 file=`free-m|sed-nr'/Mem|Swap/p'|awk'{print$4,$2}'` mem=`echo$file|head-1` swap=`echo$file|tail-1` echo$mem|awk'{if(($1/$2)*100<=50) print "物理内存空间需要留意,剩余"$1"M";else print "物理内存在正常范围"}' echo $swap |awk '{if(($1/$2)*100<=50) print "交换空间需要留意,剩余"$1"M";else print "交换空间在正常范围"}'#!/bin/bash #监控系统内存和交换分区使用情况 #/shell05/free.sh #取当前时间 date>>/tmp/date.txt #取物理内存free值 echo"Mem-free:`free-m|grepMem|awk'{print$4}'`M">>/tmp/mem-free.txt #取缓冲区free值 echo"buffers/cache-free:`free-m|grep-|awk'{print$4}'`M">>/tmp/buffers-free.txt #取Swap区free值 echo"Swap-free:`free-m|grepSwap|awk'{print$4}'`M">>/tmp/swap-free.txt #将时间与相关数据重新写入新文件 paste/tmp/date.txt/tmp/mem-free.txt/tmp/buffers-free.txt/tmp/swap-free.txt>/tmp/free.txt #发送监控邮件 mail-s"内存监控报告"root@localhost< /tmp/free.txt
19.输入一个IP地址,使用脚本判断其合法性:必须符合ip地址规范,第1、4位不能以0开头,不能大于255不能小于0
#!/bin/bash #ValidIP #/shell05/valid.sh read-p"请输入要检查的IP:"IP ifecho$IP|grep-E"^([0-9]{1,3}.){3}[0-9]{1,3}$"&>/dev/null;then a1=`echo$IP|cut-d.-f1` a2=`echo$IP|cut-d.-f2` a3=`echo$IP|cut-d.-f3` a4=`echo$IP|cut-d.-f4` if[$a1-gt0-a$a1-le255-a$a2-le255-a$a3-le255-a$a4-gt0-a$a4-le255];then echo"$IPavailable!" else echo"$IPnotavailable!" fi else echo"IPformaterror!" fi
审核编辑:刘清
-
局域网
+关注
关注
5文章
749浏览量
46276 -
TMP
+关注
关注
0文章
15浏览量
31851 -
NFS
+关注
关注
1文章
53浏览量
26097 -
Shell
+关注
关注
1文章
365浏览量
23348
原文标题:这19个Shell脚本值得收藏!
文章出处:【微信号:网络技术干货圈,微信公众号:网络技术干货圈】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论