0%

据说是小米招聘运维工程师的题目

第一部分:Linux基础

题目1:

有一百个图片文件,它们的地址都是
http://down.xiaomi.com/img/1.png
http://down.xiaomi.com/img/2.png

一直到http://down.xiaomi.com/img/100.png
批量下载这100个图片文件,并找出其中大于500KB的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
同相册的图片地址会有一定的规律,可以用:

[root@localhost ~]# echo http://down.xiaomi.com/img/{001..100}.png > url.txt

得到图片的地址是用空格分开的,再用vim编辑url文件,把空格替换成回车(\r)
:s/ /\r/g

在用wget命令批量下载:
[root@localhost ~]# wget -i url.txt -P ./photo
wget命令的-i参数是从指定的文件读取地址,-P参数是把下载的文件放到指定的路径下。

找出其中大于500KB的文件
[root@localhost ~]# find ./photo -type f -size +500k
1
2
3
4
5
6
7
8
9
10
11
#/bin/bash

echo "downloading the picture......"
for i in {1..100}
do
wget "http://down.xiaomi.com/img/$i.png"
done

echo "download done!"
echo "find the file which is big than 500k"
find . -type f -size +500c -print

题目2:

一个文本文件info.txt的内容如下:

aa,201
zz,502
bb,1
ee,42

每行都是按照逗号分隔,其中第二列都是数字,请对该文件按照第二列数字从大到小排列。

1
2
3
4
5
[root@localhost ~]# sort  -n -r -k 2 -t',' info.txt 
zz,502
aa,201
ee,42
bb,1

题目3:

查看当前Linux服务器是否监听80端口,如果在监听,请找出其进程ID,并结束该进程。

1
2
3
[root@localhost ~]# netstat -an | grep -i listen | grep 80
[root@localhost ~]# lsof -i:80
[root@localhost ~]# kill -9 PID
1
2
3
4
5
6
7
8
方法一:使用for 
for i in `netstat -tanp |grep 3306 |awk '{print $NF}' |cut -d "/" -f 1`;do kill -9 $i;done

方法二:使用xargs
netstat -tanp |grep 3306 |awk '{print $NF}' |cut -d "/" -f 1 |xargs -I '{}' kill -9 {}

方法三:使用awk
netstat -tanp |grep 3306 |awk '{print $NF}' |cut -d "/" -f 1 |awk '{print "kill -9 "$0}' |bash

题目4:

使用curl或wget命令获取http服务的header信息。

1
2
3
4
5
6
7
8
[root@localhost ~]# curl -I http://www.xiaomi.com
HTTP/1.1 301 Moved Permanently
Server: Tengine
Date: Thu, 16 Nov 2017 06:44:46 GMT
Content-Type: text/html
Content-Length: 275
Connection: close
Location: https://www.mi.com

题目5:

关于Linux的用户账号,下面说法正确的有:

A.用户的密码,是以明文形式存储在 /etc/passwd 文件中的

B.用户的密码,是以密文形式存储在 /etc/passwd 文件中的

C.用户的密码,是以密文形式存储在 /etc/shadow 文件中的

D.用户登录的时候,会把用户的密码明文与保存的密码做对比

题目6:

对于N块硬盘组成的硬盘阵列,下面的说法哪个是错误的:

A.raid1 与 raid5 相比,读取数据的速度 raid5 更快

B.raid1 与 raid5 相比,raid5 的磁盘空间利用率更高

C.raid1 在 (N-1)块磁盘损坏的情况下,不影响数据的完整性

D.raid0 相比于raid1、raid5,读写速度最快

题目7:

负载均衡,你了解的常用软件有哪些?请写出至少三种以上,并评价各自的缺点。

1
2
3
4
5
6
7
Nginx的缺点是:
1. Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点。
2. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决。

LVS的缺点是:
1. 软件本身不支持正则表达式处理(仅仅支持4层负载均衡),不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。
2. 如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了,特别后面有 Windows Server的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言Nginx/HAProxy+Keepalived就简单多了。

题目8:

执行 $ time sleep 2,输出如下:

real 0m2.003s
user 0m0.004s
sys 0m0.000s

请说明 real、user、sys三者具体代表的意思和区别。

1
2
3
4
5
当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。

real时间是指挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片,和进程被阻塞时所花费的时间。
user时间是指进程花费在用户模式中的CPU时间,这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。
sys时间是指花费在内核模式中的CPU时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的CPU时间。

题目9:

nginx rewrite 规则中 last、break、redirect、permanent 的含义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
rewite

在server块下,会优先执行rewrite部分,然后才会去匹配location块
server中的rewrite break和last没什么区别,都会去匹配location,所以没必要用last再发起新的请求,可以留空

location中的rewirte:

不写last和break - 那么流程就是依次执行这些rewrite
1. rewrite break - url重写后,直接使用当前资源,不再执行location里余下的语句,完成本次请求,地址栏url不变
2. rewrite last - url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变
3. rewrite redirect – 返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时)
4. rewrite permanent – 返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url

使用last会对server标签重新发起请求

如果location中rewrite后是对静态资源的请求,不需要再进行其他匹配,一般要使用break或不写,直接使用当前location中的数据源,完成本次请求
如果location中rewrite后,还需要进行其他处理,如动态fastcgi请求(.php,.jsp)等,要用last继续发起新的请求
(根的location使用last比较好, 因为如果有.php等fastcgi请求还要继续处理)

使用alias指定源:必须使用last

if语句主要用来判断一些在rewrite语句中无法直接匹配的条件,比如检测文件存在与否,http header,cookie等

location匹配规则及优先级

= 严格匹配这个查询。如果找到,停止搜索。
^~ 匹配路径的前缀,如果找到,停止搜索。
~ 为区分大小写的正则匹配
~* 为不区分大小写匹配
优先级: =, ^~, ~/~*, 无
break语句

放在server块rewrite语句前面
如果是直接请求某个真实存在的文件,则用break语句停止rewrite检查
if (-f $request_filename) {
break;
}

题目10:

WEB 服务 cookies 和 session 的区别。

1
2
3
4
5
6
7
8
9
1、cookie数据存放在客户的浏览器上,session数据放在服务器上 
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
4、单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能大于3K。

出处:http://blog.csdn.net/u010168160/article/details/47128443

更多解释:
https://www.zhihu.com/question/19786827

题目11:

http 1.0 和 http 1.1下有何区别?http 2.0的主要变化或优势有哪些?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HTTP 协议老的标准是HTTP/1.0,目前最通用的标准是HTTP/1.1。  

在同一个tcp的连接中可以传送多个HTTP请求和响应,多个请求和响应可以重叠,多个请求和响应可以同时进行,更加多的请求头和响应头(比如HTTP1.0没有host的字段)。

它们最大的区别:
1、在 HTTP/1.0 中,大多实现为每个请求/响应交换使用新的连接。HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。

2、在 HTTP/1.1 中,一个连接可用于一次或多次请求/响应交换,尽管连接可能由于各种原因被关闭。HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。

相比 HTTP/1.x,HTTP/2 在底层传输做了很大的改动和优化:

1.HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式。二进制格式在协议的解析和优化扩展上带来更多的优势和可能。
2.HTTP/2 对消息头采用 HPACK 进行压缩传输,能够节省消息头占用的网络的流量。而 HTTP/1.x 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。头压缩能够很好的解决该问题。
3.多路复用,直白的说就是所有的请求都是通过一个 TCP 连接并发完成。HTTP/1.x 虽然通过 pipeline 也能并发请求,但是多个请求之间的响应会被阻塞的,所以 pipeline 至今也没有被普及应用,而 HTTP/2 做到了真正的并发请求。同时,流还支持优先级和流量控制。
4.Server Push:服务端能够更快的把资源推送给客户端。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 再发送这些请求。当客户端需要的时候,它已经在客户端了。

第二部分:安全部分

题目12:

请列举WEB常见安全问题(不少于三项),阐述其原理、危害。

题目13:

请列举常见DOS攻击类型,并分别介绍其原理和防御方法。

1
http://blog.csdn.net/libin_1/article/details/8116091

题目14:

服务器遭到入侵,作为安全管理人员,你应做如何处理?

1
https://www.cnblogs.com/lidong94/p/7161793.html

第三部分:网络部分

题目15:

请简述TCP的三次握手过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TCP(Transmission Control Protocol) 传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)

Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,主机A与主机B开始传送数据。


在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.

题目16:

发现系统中存在大量TIME_WAIT,分析原因并提出三条以上优化建议。

1
2
http://blog.sina.com.cn/s/blog_5d74fde50102x3di.html
http://kerry.blog.51cto.com/172631/105233/

第四部分:Python部分

题目17:

xrange和range的异同。

1
2
3
range range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列。

xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。

题目18:

列表 A 和 B,使用Python快速获取 A 和 B 中的共有元素。

1
2
3
4
5
(set(A) & set(B))

for i in A:
if i in B:
print i

题目19:

有20台服务器,需要在所有机器上 echo “123”,要求同时并行操作5台服务器,请使用Python或shell写出相关代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# encoding:utf-8

import time
import sys
import os
import threadpool

def cmd(ip):
#需先设置远程无密码执行命令
os.system(‘ssh ip echo "123" 2>&1’)
time.sleep(2)

pool = threadpool.ThreadPool(5) #创建一个线程池,包括线程数10个
requests = threadpool.makeRequests(cmd, ip_list) #传递函数和参数
[pool.putRequest(req) for req in requests] #将请求放入线程池进行处理
pool.wait()