00:00
大家好。欢迎大家继续收看上硅谷Linux运维课程。我是沈超老师。这节课我们继续来看经典面试题,少儿编程类的面试题的第三个。网站检测。其实这个在我们讲课和这个录之前上视频的时候。我们其实这个用了很多方法。什么叫网站检测,它这个可能就是什么,我们看一下题吧。那他说。呃,批量检测多个网站是否可以正常访问,诶,我们之前这个,呃。这个在讲课或者录视频的时候,我们其实用了很多方法,比如说。最简单的,我可以通过P。我拼一下这个网站的域名或者IP。如果能信通,证明服务器是正常的,那我证明网站是通的。P的优点是它消耗的资源最少。诶,但是呢,它的缺点是。
01:01
他检测的是我和对方服务器的网络是通的。网是通的。说明他服务器没死心。但是有没有可能是阿帕奇死机了?或者说他网络网站死机了,你在巴黎门口访问不了了。哎,所以PIN检测。他的优点在于他耗费的资源最少。不论是对对方的服务器,还是对我们发起检测这台电脑来讲,消耗的资源都最小。缺点是它的准确度最不高。只能证明我和对方的服务器是通的,对方服务器是存货。但是上海的阿帕奇存没存活不知道。那后来我们就说,那我们可以通过什么查看什么。这个端口。尝试着连接对方的八零端口。来尝试对方是否这个啊?是不是这个正常?那这个时候啊,我们说啊。呃,我们的这个next state。
02:00
不行,为啥?他只能查看我本机的端口,这是查询本机的命令。他不能查对方的八顿口。是不是可以访问,那怎么办呢?我们用n map就可以了,扫描工具啊n map这个我们在视频里用的就是这个对吧。我们在讲课的时候用了它,它可以连接尝试连接对方的八零,这个是准确的,诶所以他这里要求说尽量模拟用户的正时访问,其实用n map扫描八零没问题。只要能连上对方的这个呃八零端口,它就会返回数据,只要能返回就证明对方的八零是这。这个正常NF。那。但是呢,这里啊,他要求有一个什么。用上数组实现。各位,其实我说啊,反正我不是太习惯在十中使用数组,原因很简单。之所以其他语言当中数组用的非常广泛的原因是其他所有的语言数组都数组都会对应大量的应用函数。
03:08
为什么要用数组?简单把数据导到数组里,人家函数直接写好了,直接调用就能生效,不需要你再写算法,还更方便。所以肯定是倒了。数组理论方面。但是12的问题是数组有。但是导进去之后,所有的算法都没有,函数没有,如果要用自己写下,与其这样我还不如不要用数组,而且还有个问题啊。用写在数组里。还有一个问题在于。你这个程序是死的,比如说我,比如说我就要检测这三个网站能不能访问,我把三个网站写进去。那万一我需要检测四个网站呢?我就需要来改代码了。各位,这对程序来讲是不合适的啊,我直接改代码,当然你可以写更复杂的,比如说通过呃别的方法把这个你这个,比如说你新增网站,然后把它新增的东西也写到,直接通过写到数组里,这就会更复杂。
04:05
其实我们说在事中更适合的其实是通过文本。哎,你直接把所有的数据写在文本里。写在文本里,然后呢,你的程序,通过程序来检测文本里的所有的网站能不能访问,这样做的好处在于,比如说我要新增或者修改网站,我只要改文本就行。不需要改代码。我们写代码都有这个要求啊,就是写好了这这个程序应该是通用的。而不是只针对这一个题对吧,或者这一个应用场景,那我这时候如果是文本的话,我是不是可以便于修改对吧,所以我说事其实更这。这个习惯性的最少吧,我们不要说那么死,最少在我的习惯当中,我们更习惯利用文本。但是这道题它本身要求数组,那就为啥说了,人家想要考察一下你对事的数组了,这。
05:00
是个熟练程度对吧,其次呢,我们在这个这个这个这个前面讲的N麦克来访问对吧。N有个缺点啊,N麦有个缺点,N麦是什么?N的原理啊,写错了。N map。NF是一个主动的探测扫描工具,它是什么?我给他八零窗口发包,他要回复我,我检测回复包。检测这样的话来模拟用户访问的是这样的,但是呢,有一些东西当中,我们说啊,我们的攻击脚本或者攻击程序可能都是以n ma发起。有这个可能,所以呢,我们说哎,我。访问这里用另外一种CR,我们用字符的文本访问工具来访问,他会也可以模拟啊,他也可以,那其实我说他只要模拟用户真实访问就可以了,但是我说实话。这个东西更符合正常使用习惯,N更适合一个,比如说站在我们这个。呃,这个这个扫描角度来看呢,它不是一个正常访问工具,好吧,好了,那这里我们分析一下它这里边儿的这个这个情况,因为我们前面也讲过类似的脚本,对吧?好了。
06:10
那。我们说这是一个,这是一个编程思想的考察题啊对。只要考代码,其实都是这样,变成思想类考察了数数组考察了监控,诶你记得要有监控这个东西,其实是我们监控的补充啊,通过这种为什么要写个程序检测网站有面的宕机,原因很简单,监控程序是有监控我们那个监控集群,我们通过了专业的专门的监控集群,比如说ZS。或者开启拉这样的东西,它是有一定延迟的。一般要过十来分钟,看你怎么写吧,一般怎么也得过十来分钟,你才能发现这东西当了。他可能变慢,他可能这个不及时,所以用这样的监控的东西呢,来做一个补充。当然。最主要其实还是要通过专业监控工具来完成,因为我们自己写的东西就是你要实现所有东西监控,其实要写起来也能写,但是很麻烦。
07:06
人家监控工具啥都准备好了对吧,是这个CPU占有率,内存占有率,硬盘率,这个带宽,网站服务器是否宕机,所有都能监控,没必要自己来写对吧,但是他有延迟这玩意儿可以做一个补充啊。所以呢,也提醒大家,监控是我们运维工作的一个正正常的日,这个日常工作。然后考察网络连接的测试方式,因为它加了这样一句话,模拟用户正式访问,那肯定ping就不合理了。对吧,那NF呢,可能这个也不是太合适,我们会用C啊。这个字符这个文本访问这个字符的网页访问工具来完成好了。我们分析来到这里了,我们来先讲讲数组。怕你忘了数组的申平三种方法,数组名等于小括号。数组里的内容什么叫数组?说白了就是一个变量里可以保存多个值。
08:04
一个变量,那怎么区分呢?通过下标,也就是A等于,比如说小括号123。里面保存了三个值,那么调用的时候就是A。中括号零等于一。中括号一。等于二。我们把这个东西叫做它的数组下标,也就是说变,你可以就理解为一个变量里存的多个值,通过里面的子下标来描述或者调用它。来证明他。为什么要这么存?我再说一遍。原因是其他语言当中针对数组有大量的函数存在,比如说随机数,这个随机数,这个随机取数。我把这个数值所有的值导到数组里,我有事先写好的函数,我随机往外跳值。再一个呢,排序。如果我们没有数组,自己要写,比如说随机数,随机这个100个数,我要把它干嘛,我要把它按大到从大到小,或者从小到大排列,我就得自己写算法,这种算法叫冒泡算法,这是呃,编程语言的一个经典算法啊,要不然就是挑最大的牌,然后要不然就挑最小的牌,反正就是就是两个循环,一嵌套就可以。
09:15
但是如果是数组的这个函数都是存在的,直接调用函数就可以直接算,哎,这就是有数,为什么其他语言当中数组是非常重要的这样一个。内容的原因。但是对事来讲,这些玩意儿都没。所有的东西你都得自己来写,都是这样的啊。那知道一下,这是第一种生命方法,第二种呢,同样生命,但是可以把它隔开啊,只要你在写的时候,也就是说可以换行写的时候。你是打这个左括号。只要不打右括号,系统是不执行的,你换行就可以输第二个数,第三个数,直到右括号存在执行。再有一个可以通过进行下标的方式,来直接进行下标的方式,来生请都是可以的,三个方法都可以啊。
10:00
肯定这种最简单,那么是啥?A,我们就等就直接是A吧,小括号,只要看到小括号,当然还有其他方法,还有通过那个呃,这个这个d declare尔命令,直接把它生成,把变量声明成这个数组类型也是可以的啊,还有很多种啊,那最简单的肯定是这个。对吧,那我们就随便是这样一下,它就生效了,然后呢,调用的时候直接我们都知道调用变量的值是需要加do号的,但是这个东西是数组,需要用大括号来调用。然后中间要加小括号,为啥要用大括号,原因就是它需要用中括号来写这个。下标的值,比如说我要调用第一个值。调用第二个值,下标是一的值,那如果要想调用数组中所有入值,把下标写成星号就可以了。把下标写成星号就可以调用了,哎。这就是数组啊。数组的声明和调用方式啊。这个写星就可以调用所有的这个数组值,写下标可以调用指定的值啊,好,这是数组。
11:07
接下来我们简单介绍一下这个curl命令,这个命令呢是我们的一个命令行的网页访问工具,可以进行IPA网页访问,上传下载、用户认证、代理等都可以,功能是非常强大。那我们这里只要知道基本的就行,其实最正常的选项就是C空,啥都不加,直接加域名。加域名就是地址或者是这个IP就可以访问。啊,当然得小心啊。我们现在的这个网站,它不是纯文字的。里面什么动画、图片乱七八糟都一堆,你真要用这个命令行来访问网站,那你就会发现里面打开之后大部分内容是乱码,原因图片、动画这些东西显示不了。哎,所以我们可能在这里不是用它来直接访问网站,那我们干嘛。我们。通过杠W指定一个输出格式,然后我们调用。
12:04
阿帕奇或者是网站呢,返回状态码。我们调用这个东西。那这是什么玩意儿?其实你们或多或少大家都见过。是事,我们干嘛没注意。比如。比如说。访问网站的时候见过404吗?这个状态吧,代表网页没找着,网页丢了。返回状态码,见过502吗?N的搭建的网站啊,特别容易出现502,这里写的是错误的网关,其实是什么?只要N干嘛,你后台它是要调用PPFPM来解析P这个PP语言的。这个东西呢,只要FTM或者数据库MYSQL等等吧,这些东西只要荡掉。阿帕奇访问回去之后得不到返回值。那么N这N啊,它就会给客户端返回502。当然,如果网关断了,它连接不到数据库或者其他的东西,也同样会反馈。
13:02
那这个状态码啊。我们在网络服务的这个。面试题当中面试这个面试题当中我们干嘛会详细的再说,这里我们就看一下,那这两个我们是常见的报错代码,那我们来看看这个状态码二代。和3V2这两个状态嘛。一个是OK,一个是放的。怎么说?如果我们用C去访问某一个网站,他给我返回的状态码是200或者是302,证明这个网站是正常的,能访问的。那也就是说啊,我待会写脚本的时候,我会用C访问这个刚刚的测试网站,然后呢,我会不让他访问网页内容,而只让他给我返回状态码。然后只要状态码是200。或者是三点。这两个状态码就证明网站是正常的,我检测这两个状态码就可以了。看明白了吗?好了,准备工作够了,我们来。
14:00
那我们现在说。这个程序可能比较长,一页放不下,我分了两页,首先先定义了一个数组。那把我的网站放进去,哎,我故意。给了一个什么这个这个这个假网站,就是访问不了,不了了,就有个报错了。然后呢,这些网站现在应该都是能够访问的,呃,这个商硅谷的官网上,硅谷的网上这个教育商城啊,叫这个。网上的这个在线教育平台,这个鼓励学院。度这都能访问的对吧,那这个一个直接用IP访问的,肯定是不能访问的,那我就给一个报错对吧?好。那我就说。呃,用数组最大的缺点就是,如果你要在里面增加网站,你就得改代码对吧啊。然后来进行一个循环。循环。这个数组里有多少个值,循环多少次诶。
15:00
我们上而支持这种循环,这周讲过了,对吧?每次循环把它的数组下标值赋给变量I当中,那也就是说变量I当中保存的是我的当前某每一次循环的时候,就是这个网站,第一次是他,第二次是他,第三次是他,对吧。好。我。这是调用系统命令的这个。格式对吧。通过C,然后呢不返回网页内容,把它直接内容输出到这个丢到回收站,然后呢设置连接时间,尝试时间不超过五秒,然后我只要它的返回状态码。在这个网站中访问这个网站,用CR访回,访问这个网站得到返回状态码,然后用graph去提组成这个管道符。加杠大意的意思是支持,让他支持扩展正则,换句话说这个或者这个竖杠。在这里不是管道符了,这是在字符串里,这个东西是或者的意思,要不然是200,要不然是302,这在我们12中算扩展政策需要用。
16:10
Graph杠大E选项或者用e graph命令才能识别啊,这个我们也都是讲过啊,如果你听不懂,就证明各位你们现有的这个知识是不足以看懂,或者是这个解答这样的面试题了,请你先去回去看我们那个基础课的视频,去看12编程的视频啊。好了。把这个提取出来的值。返回到赋值的变量这个号当中。那也就说啥。如果我提取到了这两个值,我是不是才会把内容附在这里?那换句话说。只要这个值里有内容,我不管内容是什么,只要这个变量中这个靠的这个变量中有值,就证明这个网站能访问。对吧,所以我这里说啥看。只要这个变量中不为空。
17:02
哎。这个感叹号等号取反,不等于不为空。靠了这个这个号了值不为空,这里网页可以访问,因为提取到了这个值嘛,我就输出网站是正常的,把它保存在OK日志里。否则证明这个网站是不是不能放贷,但是我怕有网络延迟,所以我让我的循环先。程序,先休眠十秒,暂停一下。干嘛暂停之后重新再检测,把它再附载变量当中,如果还能检测到值,证明这个网站又通了,可能只是网络延迟的问题。如果两次检测还不行,好了,报错,这个网站无法访问来。也就是说,检测两次准确度更高。但是。这个程序运行时间就会更长。原因,每次循环万一真检测不了,它会休眠十秒钟,如果你觉得十秒太长,可以改小点那。
18:03
这个也同样啊,好了这就结束了,那也就是说最后写入到这个日志里的就是正常网站,写入在这个日志里呢,就是没法正常访问的网站。项目是啥?为了节约时间,同样我还是把这个东西写好了,我直接写好,那么打开看看。好,这个就跟前面都是一样的,都讲过了对吧,先进行数组,然后按数组里面的这个变量的这个下这个下标的数循环,然后进行检测,第一次检测完,如果不行,二次休眠十秒,再进行第二次检测来。这就是这个脚本,那么试一下这个脚本还需要点时间,因为它默认是需要什么。它默认是需要什么这个。呃,是如果有一个访问不了了,他就会休眠十秒,而我刚刚故意是不是写了个1.1.1.1,这个是没法访问的,对吧,所以呢,他肯定会稍微等待一点时间,但是啊。
19:00
这里啊,它等它运行呢,我们回来看,我们就说。那如果我真的需要改网站。我比如说我要增加网站,我是不是就要打开这个test的这个程序,手工是不是来改源代码。这对程序来讲,其实来讲是不太合理的东西。所以我说啊,各位。我们事儿可能更适合的东西其实是掉温带。我们完全可以把这些内容写在文本里。写在一个文本当中。然后通过读取文本的方式cat读文本,然后来循环也完全可以吗?而且这样做的好处是,我如果需要修改这个域名,我只要改文本就行。我没有必要再去改这个什么,这个这个代码,对吧,所以啊事可能。不是,他可以按照这个真正的这个其他语言的这种思想来设计程序。所以我一直说,我给大家也说,给我们的学老师我们也都说。写事儿程序的时候,你。不是说可以完全照着照搬其他的辩证思想。
20:03
他可能跟其他语言不是太一样,他的东西第一不最大的原因,他不需要考虑效率,他就是给你自己用的。不会有成千上万的人访问,所以你把它里边逻辑思路写的越简单越好,实现同样的功能,谁写的简单,逻辑思路简单,我觉得就应该是最好。当然。显得逻辑思路简单,代码就会干嘛更长,执行效率会更低,那这个在其他语言来讲是不行的,但是在事中没问题。OK,好了,应该执行完了,执行完了,那我们到root去。我们看一下。这个错误日志正确日志都生成了,我们看一下,先看看正确日志,诶这三个网站都是OK的,能访问对吧,那再看看错错误日志,这个网站不能访问对吧。那也就是说,我只要看到有错误日志,就证明我发现某一个网站P不通好。这就是这个脚本啊。其实我说各位,我不是太习惯这种,比如说像数族我也不太习惯。
21:03
啊,主要是这样,然后呢,呃,这个呢,就是我们说面试题它就是这样,那我们就要想办法解决,当然我再说。编程的东西它不是这个答案不是固定的,你可以用其他任何方法,只要能实现都行,没问题,我们看的可能就是一个思想,再一个。如果真在这个笔试题当中碰到这样的,真的考语法的,考这种辩论思想的这种面试题。如果你真的,比如说你看这个代码还是挺复杂的,有时候这么长的命令,我说实话你要去背还是挺困难的。背不下来可以写伪代码啊。把思路写出来,反正总比什么都不写强啊,一般来说我知道思路的话,那。这个实现起来问题不大。那这节课的内容就是这样,我们下节课再见。
我来说两句