说明

该文章是看到老男孩博客 ​​https://blog.51cto.com/oldboy/1632876?from=singlemessage&isappinstalled=0​​ 的题目,自己抽取了一些能在本地模拟的。30道题贴合实际项目经验,争取用30道题目来强化自己的shell知识。

另外有别人做的一些方法:​​https://blog.csdn.net/csndhu/article/details/78913646​

题目1

使用for循环在/oldboy目录下通过随机小写10个字母,加固定字符串oldboy批量创建10个html文件,名称例如为:

[root@oldboy oldboy]# ls
coaolvajcq_oldboy.html qnvuxvicni_oldboy.html vioesjmcbu_oldboy.html
gmkhrancxh_oldboy.html tmdjormaxr_oldboy.html wzewnojiwe_oldboy.html
jdxexendbe_oldboy.html ugaywanjlm_oldboy.html xzzruhdzda_oldboy.html
qcawgsrtkp_oldboy.html vfrphtqjpc_oldboy.html
#我的思路:
1、for循环。
2、随机数创建小写字母,放到for循环里面。
产生随机数3个命令工具:openssl,mkpasswd,/dev/urandom

function Test1() {
suffix='_oldboy.html'
for (( i = 0; i < 10; i++ )); do
random=`cat /dev/urandom | tr -dc a-z | head -c 64 | cut -c 1-10`
touch ${random}${suffix}
done
}
Test1

题目2

请用至少两种方法实现!

将以上文件名中的oldboy全部改成oldgirl(用for循环实现),并且html改成大写。

#思路:这里面用到for循环,大小写转换,替换(sed,awk都可以替换,转为大小写)
1、for循环。
2、for循环里面批量个修改名字,修改名字的时候用sed替换(oldboy全部改成oldgirl),再用sed把html转为大写。用tr转为大写(他是转的单个字符,这里不是很合适),或者用awk转为大写。
#方法1:
#!/bin/bash
Test2_1() {
namelist=`ls *oldboy.html`
for i in $namelist
do
filename=`ls $i | sed 's/oldboy/oldgirl/g' | sed 's/html$/HTML/g'`
mv ${i} ${filename}
done
}
Test2_1

#方法2:
#!/bin/bash
Test2_2() {
namelist=`ls *oldboy.html`
for i in $namelist
do
filename=`ls $i | sed 's/oldboy/oldgirl/g' | awk '{sub(/.html/,".HTML");print $0}'`
mv ${i} ${filename}
done
}
Test2_2


题目3

批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)。

思路:for循环01-10,获取随机数作为密码
function CreateUser() {
username='oldboy'
for i in {01..10}
do
useradd ${username}${i}
password=`cat /dev/urandom | tr -dc [:alpha:]] | head -c 64 | cut -c 1-8`
echo $password | passwd --stdin ${username}${i}
echo ${username}${i}--$password >> /root/username.txt
done
}
CreateUser

#删除用户
DelUser(){
username='oldboy'
for j in {01..10}
do
userdel -rf $username$j
done
}
DelUser

题目4

#请用至少两种方法实现!
bash for循环打印下面这句话中字母数不大于6的单词(昆仑万维面试题)。
I am oldboy teacher welcome to oldboy training class.

#!/bin/bash
function Test() {
clist='I am oldboy teacher welcome to oldboy training class.'
for i in $clist
do
#注意双中括号支持<,>,不支持<=,>=,遇到这情况替换为字母形式-le小于等于
if [[ `expr length ${i}` -le 6 ]]; then
#expr也可以写成if [[ $(expr length ${i}) -le 6 ]];
echo $i
fi
done
}
Test

题目5

企业20(中企动力)::用shell处理以下内容

1、按单词出现频率降序排序!

2、按字母出现频率降序排序!

the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation

#我的思路1:
1、先把所有符号替换成空格,这样文件就是一个个字符串了,中间以空格分开。
2、for循环一个个字母,输出到txt文件,这个文件每个单词是一行,
一行一行的那这样就可以满足sort根据行来排序了,也可以用uniq输出出现的频率,
然后根据频率排序。

Paixu1() {
str='the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation'
text=$(echo $str | sed 's/\.\|\,/ /g')
for i in $text
do
echo $i >> test20.sort
done
#uniq前面一定更要加上sort参数,否则会出错
cat test20.sort | sort | uniq -c | sort -r
}
Paixu1

#思路2:获取字符,在awk里面加个for循环,把每个字母打印出来。
Paixu2() {
str='the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation'
text=$(echo $str | sed 's/\.\|\,/ /g')
for i in $text
do
echo $i | awk -F '' '{for(h=1;h<=NF;h++)print $h}' >> test20.char
done
#uniq前面一定更要加上sort参数,否则会出错
cat test20.char | sort | uniq -c | sort -rg
}

企业实战题6

写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些(方法有很多)


企业实战题7

请用至少两种方法实现!写一个脚本解决DOS生产案例
提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:iptables -I INPUT -s 10.0.1.10 -j DROP。


答案见: http://blog.51cto.com/oldboy/2141081

企业实战题8

面试及实战考试题:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次(10分钟时间完成)。


​​​企业实战题9

批量检查多个网站地址是否正常  

要求:shell数组方法实现,检测策略尽量模拟用户访问思路

http://www.etiantian.org

http://www.taobao.com

http://oldboy.blog.51cto.com

http://10.0.0.7 

wget ,curl获取某个网站地址是否可通。