老男孩培训班shell考核的几个题
老男孩培训班shell考核的几个题
老男孩原题网址:
写shell是一个很好玩的事儿,每次看见别人的想法,就手痒痒想用shell写出来,因为每一次写对了都会有成就感,但是写shell会成瘾,写了一个又想看看下一个,搞的nginx和dns这几天都没怎么看,于是就没有把20道题都写出来。shell答案不是死板的,但是思路基本都是一样的。本人所写的这几个都亲自测试过,均好使。
面试题4:批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位大写英文字母)。
【思路】设定随机密码的方法有很多种,这里说一种比较简单的方法。
#yum install expect,然后使用mkpasswd命令来设定密码,这个命令的基本参数如下:
-l 密码长度,默认是10;
-C 大写字母个数,默认是2;
-c 小写字母个数,默认是2;
-d 数字个数,默认是2;
-s 特殊字符,默认是1.
如果要设定一个长度为10,大写字母个,含有2个特殊字符的密码:#mkpasswd -l 10 -C -s 2
如题要设定一个长度为8,全部都是大写字母:#mkpasswd -l 8 -C 8 -d 0 -c 0 -s 0(要把其他的参数定位为0)
有了密码,可以写脚本了:
#!/bin/bash #writen by ChrisChan@2016--14 for i in $(seq 1 15); doecho user$i:$(mkpasswd -l 8 -C 2) >> useradd -d /usr/user$i -m user$i #使用useradd添加用户echo $i is ok! #提示已经完成一个项目 sleep 1 #沉睡1秒 done
面试题2:使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,例如:
#Author:ChrisChan #E-mail:chenx1242@16 #!/bin/bash for i in $(seq 1 10);doname=$(mkpasswd -l 10 -c 10 -s 0 -d 0 -C 0)echo $name_oldboy.html is created!touch $name_oldboy.htmldone
面试题:将以上文件名中的oldboy全部改成oldgirl(用for循环实现),并且html改成大写。(请用至少两种方法实现)
【思路1】先试用grep命令把所有后缀为_oldboy.html的文件全部集合,然后用for循环提取出前面随机的部分,然后使用mv 一一对应改名。
【思路2】同样先用grep将所有后缀为_oldboy.html的文件名整合到一个叫name的文件里,然后使用sed进行匹配更改,同时生成对应的“前缀_oldgirl.HTML文件,然后再mv原有的文件到新的文件里。
这里只写思路1:
#!/bin/bash #writen by ChrisChan@2016--14 file=$(ls|grep _oldboy.html|grep -v .sh) for i in $file;dofirst=$(echo $i|cut -d _ -f 1)mv $i $first_oldgirl.HTMLecho $first is OK~ done
面试题5:写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些。
【思路】如何判断用户是否在线?ping他呗!
#!/bin/bash #writen by ChrisChan@2016--14 for i in $(seq 1 255);doping 10.0.0.$i -c 2 >> /dev/null 2>&1 #无论ping到ping不到都不在前台显示tai=$(echo $?)if [ $tai == 0 ];thenecho -e \0[1;2m 20.90.146.$i is online \0[0m #加重颜显示online elseecho -e \0[1;5m 20.90.146.$i is offline \0[0m #同上fidone
注意,这个方法虽然直观简单,但是由于是单线程,非常非常的浪费时间,真要是ping200多个,估计要花5~6分钟。所以最好使用多线程。
那多线程怎么做?
#!/bin/bash #writen by ChrisChan@2016--14 for i in $(seq 1 255); do{ ping 10.0.0.$i -c 2 >> /dev/null 2>&1 #无论ping到ping不到都不在前台显示 tai=$(echo $?) if [ $tai == 0 ]; then echo -e \0[1;2m 20.90.146.$i is online \0[0m #加重颜显示online else echo -e \0[1;5m 20.90.146.$i is offline \0[0m #同上 fi}& donewaitecho all over!
多了一个&和wait,没了。效果立竿见影,不信的话,可以#date && sh 这个脚本.sh && date,看看时间差。
实战题6:写一个脚本解决DOS***生产案例,根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔分钟。防火墙命令为:iptables -I IPUT -s 对应的ip -j DROP。(请用至少两种方法实现!)
【思路1】nginx的可以设置access_log的格式,remote_addr就是客户请求地址,一般来说这个默认是在第一位。然后从这个access_log里查询ip地址。
注意,这里使用read line而不是for,因为的格式是“XX IP地址”的形式,如果用for的话,会按空格切块i,而read line是整条语句的输出。
#!/bin/bash writen by ChrisChan@2016--15 log=/usr/local/nginx/logs/ #设定路径 function add_iptables(){ #设定一个函数叫add_iptableswhile read line #使用read line而不是for循环docount=$(echo $line|awk {print $1} )ip=$(echo $line|awk {print $2} )if [ count -ge 100 ]theniptables -I IPUT -s $ip -j DROPecho $ip is DROPPEDfidone<$log #使用<输入重定向,把line输入进去 } function main(){while truedoawk {print $1} access_log|sort|uniq -c >/usr/local/nginx/logs/ add_iptablessleep 180 #每隔180秒done} main
【思路2】使用netstat -an来查看ip链接情况,重定向到一个文件里,然后后面的写法都是一样的。
面试题10:bash for循环打印下面这句话中字母数不大于6的单词。(请用至少两种方法实现!)I am oldboy teacher and welcome to oldboy training class.
【思路】反馈字符串数字个数的方法,echo ${#变量}。比如 a=I love this game!&& echo ${#a}
#!/bin/bash #writen by ChrisChan @ 2016--14 content=I am oldboy teacher and welcome to oldboy training class. for i in $content;doif [ ${#i} -le 6 ];thenecho $ifidone
判断字符串长度的方法还有一个命令,是#expr length 要检查长度的字符串,但是这两个方法的脚本是很类似的。这个应该算是思路2了,不重复写了。
但是要注意!expr length这个方法比较费时间,计算大额数字的时候,明显不如${#变量}的方法,所以还是更推荐${#变量}的方法,好记还内置函数。
面试题12:打印选择菜单,一键安装Web服务:
[root@oldboyscripts]# sh menu.sh
1.[install lamp]
2.[install lnmp]
.[exit]
pls input the num you want:
要求:
1、当用户输入1时,输出“startinstalling lamp.”然后执行/server/scripts/lamp.sh,脚本内容输出lampis installed后退出脚本;
2、当用户输入2时,输出“startinstalling lnmp.”然后执行/server/scripts/lnmp.sh输出lnmpis installed后退出脚本;
、当输入时,退出当前菜单及脚本;
4、当输入任何其它字符,给出提示“Input error”后退出脚本。
5、要对执行的脚本进行相关条件判断,例如:脚本是否存在,是否可执行等。
【思路】case语句里面嵌套if语句,直线思路,注意一下fi;;收尾。
#!/bin/bash/ #writen by ChrisChan @ 2016--15 echo -e 1.[install lamp] \n \n 2.[install lnmp] \n \n .[exit] read choose case $choose in1) if [ -e /server/scripts/lamp.sh ]; thenecho startinstalling lamp. && sh /server/scripts/lamp.sh elseecho 文件不存在 && exit 91 fi;; 2) if [ -e /server/scripts/lnmp.sh ]; thenecho startinstalling lnmp. && sh /server/scripts/lnmp.sh elseecho 文件不存在 && exit 92 fi;; )echo 退出本脚本 && exit 99;;*)echo Input Error && exit 100;;esac
面试题15:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每分钟执行一次(10分钟时间完成)。
【思路】先备份一下web目录,起名起名叫backupwww。然后用for循环挨个diff,然后把diff结果累计输入到一个的文件里,如果这个不等于0,那么证明文件有发生了变化。脚本写完之后,crontab -e一下。
面试题17:实践抓阄题目:需要挑选5个学生,因此需要一个抓阄的程序:
要求:1、执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能在出现相同数字。
2、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出继续等待别的学生输入。
【思路】生成随机数不难,#echo $[$RADOM%99],但是如何要生成不重复的五个数字(5个学生抓阄)?其实很简单,先确定这个文件里的sort|uniq -c|wc-l =5,然后再random就行。
.html写得非常详细,可以借鉴一下。
面试题18:已知下面的字符串是通过RADOM随机数变量md5sum|cut-c 1-8截取后的结果,请这些字符串对应的md5sum前的RADOM对应数字?
21029299
00205d1c
ada1677
1f6d12dd
890684b
【思路】这属于暴力内容,待续~~
转载于:
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上一篇:eclipse最全快捷键使用说明
下一篇:所学何事?
推荐阅读
留言与评论(共有 20 条评论) |
本站网友 石斛的作用 | 12分钟前 发表 |
效果立竿见影,不信的话,可以#date && sh 这个脚本.sh && date,看看时间差 | |
本站网友 潍坊市坊子区 | 15分钟前 发表 |
#!/bin/bash/ #writen by ChrisChan @ 2016--15 echo -e 1.[install lamp] \n \n 2.[install lnmp] \n \n .[exit] read choose case $choose in1) if [ -e /server/scripts/lamp.sh ]; thenecho startinstalling lamp. && sh /server/scripts/lamp.sh elseecho 文件不存在 && exit 91 fi;; 2) if [ -e /server/scripts/lnmp.sh ]; thenecho startinstalling lnmp. && sh /server/scripts/lnmp.sh elseecho 文件不存在 && exit 92 fi;; )echo 退出本脚本 && exit 99;;*)echo Input Error && exit 100;;esac面试题15:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每分钟执行一次(10分钟时间完成) | |
本站网友 通联资本管理有限公司 | 24分钟前 发表 |
并且html改成大写 | |
本站网友 上海嘉定房屋出租 | 8分钟前 发表 |
#mkpasswd -l 8 -C 8 -d 0 -c 0 -s 0(要把其他的参数定位为0)有了密码,可以写脚本了 | |
本站网友 芋贵人 | 20分钟前 发表 |
并且html改成大写 | |
本站网友 上海中山公园 | 25分钟前 发表 |
但是要注意!expr length这个方法比较费时间,计算大额数字的时候,明显不如${#变量}的方法,所以还是更推荐${#变量}的方法,好记还内置函数 | |
本站网友 深圳不孕不育 | 5分钟前 发表 |
chenx1242@16 #!/bin/bash for i in $(seq 1 10);doname=$(mkpasswd -l 10 -c 10 -s 0 -d 0 -C 0)echo $name_oldboy.html is created!touch $name_oldboy.htmldone面试题:将以上文件名中的oldboy全部改成oldgirl(用for循环实现) | |
本站网友 宾果游戏 | 4分钟前 发表 |
【思路2】同样先用grep将所有后缀为_oldboy.html的文件名整合到一个叫name的文件里,然后使用sed进行匹配更改,同时生成对应的“前缀_oldgirl.HTML文件,然后再mv原有的文件到新的文件里 | |
本站网友 奥克索 | 6分钟前 发表 |
实战题6:写一个脚本解决DOS***生产案例,根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔分钟 | |
本站网友 消化酶 | 4分钟前 发表 |
【思路2】同样先用grep将所有后缀为_oldboy.html的文件名整合到一个叫name的文件里,然后使用sed进行匹配更改,同时生成对应的“前缀_oldgirl.HTML文件,然后再mv原有的文件到新的文件里 | |
本站网友 鲜奶可以加热吗 | 21分钟前 发表 |
那多线程怎么做?#!/bin/bash #writen by ChrisChan@2016--14 for i in $(seq 1 255); do{ ping 10.0.0.$i -c 2 >> /dev/null 2>&1 #无论ping到ping不到都不在前台显示 tai=$(echo $?) if [ $tai == 0 ]; then echo -e \0[1;2m 20.90.146.$i is online \0[0m #加重颜显示online else echo -e \0[1;5m 20.90.146.$i is offline \0[0m #同上 fi}& donewaitecho all over!多了一个&和wait,没了 | |
本站网友 深圳市皮肤病医院 | 15分钟前 发表 |
面试题4:批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位大写英文字母) | |
本站网友 阜阳房产 | 12分钟前 发表 |
面试题18:已知下面的字符串是通过RADOM随机数变量md5sum|cut-c 1-8截取后的结果,请这些字符串对应的md5sum前的RADOM对应数字?2102929900205d1cada16771f6d12dd890684b【思路】这属于暴力内容,待续~~ 转载于 | |
本站网友 后悔权 | 12分钟前 发表 |
【思路】生成随机数不难,#echo $[$RADOM%99],但是如何要生成不重复的五个数字(5个学生抓阄)?其实很简单,先确定这个文件里的sort|uniq -c|wc-l =5,然后再random就行 | |
本站网友 无线ap软件 | 14分钟前 发表 |
这里只写思路1 | |
本站网友 积玉桥租房 | 1分钟前 发表 |
2 | |
本站网友 mfcclub会员登录 | 24分钟前 发表 |
要求:1 | |
本站网友 linux视频教程 | 21分钟前 发表 |
#yum install expect,然后使用mkpasswd命令来设定密码,这个命令的基本参数如下:-l 密码长度,默认是10;-C 大写字母个数,默认是2;-c 小写字母个数,默认是2;-d 数字个数,默认是2;-s 特殊字符,默认是1.如果要设定一个长度为10,大写字母个,含有2个特殊字符的密码 | |
本站网友 广西移动网 | 25分钟前 发表 |
(请用至少两种方法实现!)【思路1】nginx的可以设置access_log的格式,remote_addr就是客户请求地址,一般来说这个默认是在第一位 |