老男孩培训班shell考核的几个题

简介:

老男孩原题网址:http://oldboy.blog.51cto.com/2561410/1632876

写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,大写字母3个,含有2个特殊字符的密码":#mkpasswd -l 10 -C 3 -s 2

如题要设定一个"长度为8,全部都是大写字母":#mkpasswd -l 8 -C 8 -d 0 -c 0 -s 0(要把其他的参数定位为0)

有了密码,可以写脚本了:

1
2
3
4
5
6
7
8
9
#!/bin/bash
#writen by ChrisChan@2016-3-14
for  in  $(seq 1 15);        
             do
         echo user $i :$(mkpasswd -l 8 -C 2) >> useradd.txt 
         useradd -d /usr/user $i  -m user $i     #使用useradd添加用户
         echo  $i  is ok!     #提示已经完成一个项目        
         sleep 1     #沉睡1秒        
        done



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

wKiom1bmYICivjd2AAAuf1zEYsE576.png

1
2
3
4
5
6
7
8
9
#Author:ChrisChan
#E-mail:chenx1242@163.com
#!/bin/bash
for  in  $(seq 1 10);
       do
         name=$(mkpasswd -l 10 -c 10 -s 0 -d 0 -C 0)
         echo  $name "_oldboy.html"  is created!
         touch  $name "_oldboy.html"
       done



面试题3:将以上文件名中的oldboy全部改成oldgirl(用for循环实现),并且html改成大写。(请用至少两种方法实现

【思路1】先试用grep命令把所有后缀为_oldboy.html的文件全部集合,然后用for循环提取出前面随机的部分,然后使用mv 一一对应改名。

【思路2】同样先用grep将所有后缀为_oldboy.html的文件名整合到一个叫name的文件里,然后使用sed进行匹配更改,同时生成对应的“前缀_oldgirl.HTML"文件,然后再mv原有的文件到新的文件里。

这里只写"思路1":

1
2
3
4
5
6
7
8
9
#!/bin/bash
#writen by ChrisChan@2016-3-14
file=$(ls |grep  _oldboy.html |grep  -v .sh)
for  in  $file ;
        do
         first=$(echo  $i |cut  -d _  -f  1)
         mv  $i  $first "_oldgirl.HTML"
         echo  $first  is OK~ 
        done



面试题5:写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些。

【思路】如何判断用户是否在线?ping他呗!

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
#writen by ChrisChan@2016-3-14
for  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  "\033[1;32m 203.90.146.$i is online \033[0m"     #加重颜色显示online 
                 else
                       echo -e  "\033[1;35m 203.90.146.$i is offline \033[0m"     #同上
         fi
       done


注意,这个方法虽然直观简单,但是由于是单线程,非常非常的浪费时间,真要是ping200多个,估计要花5~6分钟。所以最好使用多线程


那多线程怎么做?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#writen by ChrisChan@2016-3-14
for  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  "\033[1;32m 203.90.146.$i is online \033[0m"     #加重颜色显示online                 
             else                        
                 echo -e  "\033[1;35m 203.90.146.$i is offline \033[0m"     #同上        
         fi
         }&        
    done
     wait
     echo  "all over!"


多了一个&和wait,没了。效果立竿见影,不信的话,可以#date && sh 这个脚本.sh && date,看看时间差。


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

【思路1】nginx的nginx.conf可以设置access_log的格式,remote_addr就是客户请求地址,一般来说这个默认是在第一位。然后从这个access_log里查询ip地址。

注意,这里使用read line而不是for,因为checkip.txt的格式是“XX IP地址”的形式,如果用for的话,会按空格切块i,而read line是整条语句的输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
writen by ChrisChan @2016 -3-15
log=/usr/local/nginx/logs/checkip.txt     #设定路径
function  add_iptables(){     #设定一个函数叫add_iptables
     while  read line     #使用read line而不是for循环
     do
         count=$(echo  $line |awk  '{print $1}' )
         ip=$(echo  $line |awk  '{print $2}' )
         if  [ count  -ge  100 ]
             then
             iptables -I INPUT -s  $ip  -j DROP
             echo  $ip  is DROPPED
         fi
     done< $log     #使用<输入重定向,把line输入进去
}
function  main(){
     while  true
     do
         awk  '{print $1}'  access_log |sort |uniq  -c >/usr/local/nginx/logs/checkip.txt          add_iptables
         sleep 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}

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#writen by ChrisChan @ 2016-3-14
content= "I am oldboy teacher and welcome to oldboy training class."
for  in  $content ;
         do
         if  [ ${ #i} -le 6 ];
         then
              echo  $i
         fi
         done

判断字符串长度的方法还有一个命令,是#expr length "要检查长度的字符串",但是这两个方法的脚本是很类似的。这个应该算是思路2了,不重复写了。

但是要注意!expr length这个方法比较费时间,计算大额数字的时候,明显不如${#变量}的方法,所以还是更推荐${#变量}的方法,好记还内置函数。


面试题12:打印选择菜单,一键安装Web服务:

[root@oldboyscripts]# sh menu.sh

    1.[install lamp]

    2.[install lnmp]

    3.[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"后退出脚本;

3、当输入3时,退出当前菜单及脚本;

4、当输入任何其它字符,给出提示“Input error”后退出脚本。

5、要对执行的脚本进行相关条件判断,例如:脚本是否存在,是否可执行等。

【思路】case语句里面嵌套if语句,直线思路,注意一下fi;;收尾。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash/
#writen by ChrisChan @ 2016-3-15
echo -e  "1.[install lamp] \n \n 2.[install lnmp] \n \n 3.[exit]"
read choose
case  "$choose"  in "1" )
if  [ -e /server/scripts/lamp.sh ];
then
     echo  "startinstalling lamp."  && sh /server/scripts/lamp.sh
else
     echo  "文件不存在"  && exit 91
fi;;
"2" )
if  [ -e /server/scripts/lnmp.sh ];
then
     echo  "startinstalling lnmp."  && sh /server/scripts/lnmp.sh
else
     echo  "文件不存在"  && exit 92
fi;;
"3" )echo  "退出本脚本"  && exit 99;;*)echo  "Input Error"  && exit 100;;esac



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

【思路】先备份一下web目录,起名起名叫backupwww。然后用for循环挨个diff,然后把diff结果累计输入到一个result.txt的文件里,如果这个result.txt不等于0,那么证明文件有发生了变化。脚本写完之后,crontab -e一下。


面试题17:实践抓阄题目:需要挑选5个学生,因此需要一个抓阄的程序:

要求:1、执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能在出现相同数字。

2、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出继续等待别的学生输入

【思路】生成随机数不难,#echo $[$RANDOM%99],但是如何要生成不重复的五个数字(5个学生抓阄)?其实很简单,先确定这个文件里的sort|uniq -c|wc-l =5,然后再random就行。

http://www.z-dig.com/the-lottery-of-shell-script-example.html写得非常详细,可以借鉴一下。


面试题18:已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?

21029299

00205d1c

a3da1677

1f6d12dd

890684b

【思路】这属于暴力破解内容,待续~~


 本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1750965


相关文章
|
NoSQL JavaScript 前端开发
MongoDB系列--深入理解MongoDB聚合(Aggregation )
MongoDB中聚合(aggregate) 操作将来自多个document的value组合在一起,并通过对分组数据进行各种操作处理,并返回计算后的数据结果,主要用于处理数据(诸如统计平均值,求和等)。MongoDB提供三种方式去执行聚合操作:聚合管道(aggregation pipeline)、Map-Reduce函数以及单一的聚合命令(count、distinct、group)。
2012 0
MongoDB系列--深入理解MongoDB聚合(Aggregation )
|
8月前
|
人工智能 调度 UED
这个AI能把PSD变视频!人物/场景/道具任意组合!SkyReels-A2:昆仑万维推出的可控多元素视频生成框架
SkyReels-A2是昆仑万维推出的创新视频生成框架,通过扩散模型和图像-文本联合嵌入技术,实现多元素精准组合与高质量视频输出。
399 25
这个AI能把PSD变视频!人物/场景/道具任意组合!SkyReels-A2:昆仑万维推出的可控多元素视频生成框架
|
SQL 存储 分布式计算
ODPS技术架构深度剖析与实战指南——从零开始掌握阿里巴巴大数据处理平台的核心要义与应用技巧
【10月更文挑战第9天】ODPS是阿里巴巴推出的大数据处理平台,支持海量数据的存储与计算,适用于数据仓库、数据挖掘等场景。其核心组件涵盖数据存储、计算引擎、任务调度、资源管理和用户界面,确保数据处理的稳定、安全与高效。通过创建项目、上传数据、编写SQL或MapReduce程序,用户可轻松完成复杂的数据处理任务。示例展示了如何使用ODPS SQL查询每个用户的最早登录时间。
1675 1
|
10月前
|
存储 开发框架 Devops
eino — 基于go语言的大模型应用开发框架(一)
Eino 是一个受开源社区优秀LLM应用开发框架(如LangChain和LlamaIndex)启发的Go语言框架,强调简洁性、可扩展性和可靠性。它提供了易于复用的组件、强大的编排框架、简洁明了的API、最佳实践集合及实用的DevOps工具,支持快速构建和部署LLM应用。Eino不仅兼容多种模型库(如OpenAI、Ollama、Ark),还提供详细的官方文档和活跃的社区支持,便于开发者上手使用。
2201 8
|
存储 算法 索引
【数据结构入门精讲 | 第四篇】考研408、企业面试表专项习题
【数据结构入门精讲 | 第四篇】考研408、企业面试表专项习题
765 0
|
消息中间件 缓存 资源调度
最实用的高并发任务执行架构设计 | 架构篇(2)
最实用的高并发任务执行架构设计 | 架构篇
最实用的高并发任务执行架构设计 | 架构篇(2)
|
Java 程序员 Spring
“解密Java文本读取:File与MultipartFile“
“解密Java文本读取:File与MultipartFile“
449 0
|
网络协议 Linux 文件存储
Postfix 邮件服务器的配置
Postfix是一种功能强大且功能多样的邮件传输代理。在本文中,我们已经了解了如何使用postfix 和 dovecot为基于系统用户帐户的单个域实现基本电子邮件服务器。我们几乎没有涉及基于 postfix 的系统的真正功能,但希望能为新用户构建提供坚实的工作基础。
2178 0
|
JSON Java 数据格式
Java:jackson处理LocalDateTime序列化的时候报错InvalidDefinitionException
Java:jackson处理LocalDateTime序列化的时候报错InvalidDefinitionException
1862 0
|
新零售 搜索推荐
数智洞察 | 新零售的跃迁趋势:从零售1.0到4.0
编者按: 新零售在几年时间内完成了从一株幼苗到参天大树的成长,而就像所有行业、公司、商业模式的成功都离不开社会与时代的土壤一样,新零售也深深根植在独特的时代背景中,并且从时代趋势中持续汲取生长营养。让我们看看哪些时代背景与经济社会趋势,构成了新零售的生长土壤。 全文约3067字,建议阅读时间9分钟。
818 0