00:00
学到这里呢,我们整个对于Linux以及shell编程啊,Shell脚本的学习也就接近尾声了,那在学习的最后,我们还是用一个综合应用案例来对之前学过的内容做一个总结回顾,其实前面我们已经举过一个综合应用的案例了,诶,那就是。每天对于指定的某个目录里边的文件进行归档保存啊,那之前呢,我们其实是使用一些基本的命令,我们前面学习过的内容就已经可以写完这个脚本,那现在呢,我们又学习了正则,而且又学习了一些比较强大的文本处理工具啊,比如说cut和aw k,那现在呢,我们就可以干更多的事情。啊,接下来我们就来举一个比较好玩的案例啊,尽管在实际应用当中,可能我们平常不会这么干,但是这个事情呢,呃,学会了之后,大家可能会觉得这个Linux下的shell编程啊,还是很有趣的,那我们现在是一个什么需求呢?就是去发送消息啊,在Linux上面我们现在有一个服务器嘛,不同的用户可以同时登录我们的服务器。
01:06
那我们同时登录在系统上的所有用户之间是不是可以发送消息进行通信呢?啊,完全是可以做到的,呃,那有同学可能想到,诶,那我是不是得去装一个QQ,装一个微信呢?根本不需要,其实我们可以直接利用Linux自带的一个叫做mes,也就是message和另外一个叫做right的工具向其他登录的用户去发送消息。所以我们看一下当前的需求啊,就是实现一个向某个用户快速发送消息的脚本。输入用户名作为第一个参数啊,也就是我们这个脚本调用的时候,就是前面是一个脚本名称啊,然后执行的时候,后面跟上后面就是一个user的名称。用户名向这个用户发送消息,然后后边跟什么呢?后边跟着的就是我们要发送的话,诶这个随便发,发多少都可以。那我们这个脚本主要的目的在于什么呢?呃,主要就是在于需要去检测用户是否在系统当中,如果不在的话,我们得直接报错啊,然后呢,就是是否用户打开了消息功能啊,我们这里是涉及到一个这个。
02:12
Messages这个功能啊,如果用户那边关闭的话,我们还需要让他打开才能给他发消息,另外还有就是你不能后边这个消息为空,如果为空的话,那也是没有意义的。所以接下来我们就看一看这个脚本到底应该怎么写啊,那在这之前呢,我们首先要说一说这个基本的思路,就是怎么样用这个小工具实现向其他用户发送消息的功能。那接下来我们还是切换到控制台这里来。首先我们这里介绍一个基本的命令啊,其实之前我都已经了解过的啊,我们之前曾经用过一个命令叫做WHOAMI,诶这个大家应该还记得对吧?呃,这这个命令呢,是直接可以查看我们当前啊,正在登录的自己到底是哪个用户,然后用哪一个终端控制台进行登录,然后登录的时间是什么样的,IP是什么样,都可以看到。
03:01
哎,那其实当时我们没有展开说啊,就如果说我们直接敲一个户的话,这本身就是一个命令,它直接可以看当前所登录的所有用户啊,当然了,我们现在只有一个root用户啊,而且用户只登录了一个控制台,比方说我们在登录一个艾特硅谷用户,同样还是哈图标零零登录上来啊,如果我们是who mi的话,这个当然是只看到自己了,那如果是who的话。我们看到当前登录的所有用户一目了然都可以看到,诶,所以接下来我们就看到了,既然艾特硅谷这个用户当前在线,那我是不是可以给他发一个消息呢?诶,在发消息之前,我我们是得确认它到底有没有打开消息发送功能,那这个时候呢,就需要用到一个检测工具,就是所谓的mesg message,哎,我们直接敲一下就可以看到啊,它直接显示的是。Is why,也就是说我们当前啊,Root用户登录上来之后,默认的这个消息功能是打开的,Is why why就是yes嘛,是打开的,诶那我们再看一下,如果要是at硅谷这里的话,他自己可以看一下啊message我们看一下I isy也是打开的,没有问题,哎,那我们对于这个root用户来讲,我要给他发送的话,我不能直接登录,以艾特硅谷身份登录之后,然后再看他到底这个有没有打开啊,那怎么样能够直接看到是否打开开启了这个消息功能呢?
04:26
啊,其实用这个互命令啊,直接可以加一个杠大T参数就可以查看到。当前它是否打开的功能,我们看到前面多了一个加号,这个加号就表示当前的消息功能是打开的啊,所以我们看到啊,当前其实默认情况下,我们当前这个消息功能就是开启的,但是对于不同的Linux发行版呢,这个功能可能它默认的开启情况不一样,比如说乌班图,乌班图它默认的情况下,这个你如果查看的话,就是意思NN就是no,就是默认是关闭的。而Santos呢,默认是开启的,所以现在我们就相对来讲简单了啊啊,当然如果说当前它本身没有开启的话,比方说啊,我们这里边可以怎么样把它关掉呢,哎,Message n这样的话。
05:12
就把它关掉了,我们看现在的root这里就变成减号了啊,那如果说你要对应的开启的话,当然就是message y。接下来就又开启了啊,所以这个本身还是非常简单的,那既然开启了之后,诶,我们就尝试一下,看看能不能给艾特硅谷这个用户发一个消息呢,接下来怎么发呢?这就要用到另外一个命令。就是所谓的right啊,其实本来都非常简单啊,Right使用也非常简单,就是后边跟上你要给谁发送。给艾特硅谷这个用户发送,另外呢,你还得指定他当前的控制台啊,因为艾特硅谷这个用户本身是可以登录多个控制台的嘛,哎,就是当前如果他登录了两个的话,我们可以查看一下。货,然后同样加一个大T,我们看PTS1和PTS2,这都是艾特硅谷登录的当前的这个控制台,诶,那我到底要让他哪个控制台这里收到消息,这个就有所区别了,所以我们应该指定,所以当前使用right命令,然后指定艾特硅谷后边还要跟上对应的控制台,比方说我给PTS1去进行一个发送。
06:21
那接下来我们看到它没有任何的显示,说明我们现在就可以输入对应的信息了啊,比方说我们这里边输入一个hi。At硅谷。我们可以过来看一下,诶,大家看这个艾特硅谷,仔细看的话,叉L上面这里就有一个叹号,哎,表示收到消息了,我们看一眼,诶嗨,At特硅谷果然已经收到了。啊,所以这个其实是非常简单的啊,也非常好玩,非常好用的一个功能,就可以两边去进行通信了,我们实时可以去发送消息啊,那当然了,这个你如果不想再发的话,接下来还可以继续发啊,发一个hello啊,这这里同样可以继续收到啊,这里可以how are you。
07:00
啊,当然了,我们这里边不能随便去按这个,呃,像这个退格键啊,这些都是非法的字符,你如果这边直接这么一敲的话,这边显示的也是这种乱乱字符啊,啊,那我们这里就是how are you。诶,那这里就可以看到对应的这些信息啊,所以当然这个功能没有那么强大,因为本身这个呃,Right和message这个小功能不可能像我们的QQ微信那么好使啊,但是至少他可以发送一些简单的信息过去。好,那有了这个功能,呃,首先我们先把这个退掉吧,如果要退的话,那就CTRLC这里就退掉了,那这边就会发现收到了一个e of啊,我们知道do是表示一个文档的结束啊,那这里就是表示那边发送消息已经结束了,这边你只要回车一下,然后就退出当前接收信息的这个界面了。好啊,那接下来我们其实就是说本来这个功能已经实现了嘛,我们平常就是这么查看,然后去发送就完事了,但是我们会想到。如果说每一次发送的时候,我们都要用户命令去查看当前有谁在啊,是不是在线,然后我们再用这个杠机参数,看它是否打开了消息功能,然后再去给他对应的去发送的话,这个就有点麻烦诶,所以这里边我们就想写一个更加简洁的脚本,呃,每一次直接调用这个脚本,不管他在不在,直接发,呃,不在的话给我一个提示返回就完了嘛,不用每次都去查了,脚本的功能就体现在这儿了,所以接下来呢,我们就在这里还是直接为。
08:28
我们把它就叫做send msg send message点。接下来我们进去之后,先把当前的头写上,并。Bash。好,接下来首先第一步我们应该要做的就是查看这个用户有没有登录。查看用户。用户是否?登录。也就是说看看是不是在线对吧,你总得是在线的用户才能去发消息嘛,所以这里边我们定义一个变量叫login user。
09:03
其实是否登录,我们就是使用那个互命令,直接把它查出来了,把它的username直接提取出来,诶,那接下来就发现这个肯定就是登录的用户嘛,所以我们直接就叫。Logging user,那接下来当然就是要使用互命令去进行查看了啊,那所以这里边呢,我们用到一个Dollar加上小括号,这就是我们说的命令替换用户命令查到的内容直接付给logging user这个变量啊,那who后边我们应该给跟什么呢?诶这里边就相当于我们得去做做这个提取了啊呃,来一个管道,然后呢,我们直接就提取对应的那个要查谁,我们是按照这个。脚本传入的参数,第一个参数就是要查的用户嘛,所以其实就是DOLLAR1,我们就是看那个要把DOLLAR1对应的那一行信息要提取出来,所以这里边呢,我们就直接grape,本质上来讲应该就是要grape dollar1。但是我们发现啊,假如说艾特硅谷这个用户,他登录了两个控制台的话,我们这么提取,这不是提取出来两个吗?啊,另外还有一个问题就是说用户名它有可能有大小写对吧?啊,那我们这里其实是不希望去使用这个大小写去做区分的啊,那这样的话,GR这里可以做一个这样的一个保证,怎么样保证呢?加上一个杠I表示的就是。
10:23
Ignore case,忽略大小写的影响,然后呢,呃,还可以加一个杠M参数。杠M参数指的就是说max count后边我是要跟一个数,比方说我给一个杠M1,这就表示我只拿第一行就行了,它是max count嘛,最大的数量就是我到底匹配多少行,你如果要是有多个登录的这个控制台的话,我只选第一个啊,不要拿那么多,所以这样的话,当前这个定义就没有任何问题了。拿出来之后,这一行数据它还好多东西呢呀,那我们现在必须得要一个。第一个第一列的那个数据,哎,那所以这个第一列的话,我们可以拿各种工具啊,Cut也行,Aw k也行,比方说我们这里直接aw k后边是一个单引号。
11:08
划括号括起来print当前的第一列,那DOLLAR1就完了,所以整体来讲的话,这个还是很简单的一个操作啊,呃,但是我们需要注意,就是把这个获取到之后,那我们得看。就是当前这个用户到底登录了没有,那就要判断了,我按照这个DOLLAR1查出来的到底有没有呢?诶,那如果没有的话,其实我们应该直接报错退出,所以接下来我们来一个if判断。Login user到底有没有?哎,这里就涉及到了另外一个判断啊,叫杠Z,哎,这个杠Z是什么呢?其实就是判断这个这个值到底是否为空ZERO0值啊,那我们这里如果杠Z对于一个字符串来讲,就是判断它呃是否是空的啊。后面跟着的就是Dollar login user。如果。当前它是空的话,那么then。就直接echo一下。
12:01
刚才我们就说啊,这个用户就不在线嘛,所以我们给一个DOLLAR1不在线。哎,这样的话,呃,我们可以加一个感叹号啊,接下来我们再多输出一些消息啊,可以echo一个。当前就应该脚本退出。就不需要再等着了啊,那这个时候我们就直接exit,然后Fi结束当前的判断啊,这是我们基本的一个一个想法啊,就是做这样的一个判断,然后有了这个判断之后,接下来呢,我们还需要再看用户到底是否开启了接收消息的功能,那这一部分呢,我们先。退出去再确认一下,我们看一下啊,这个消息的功能,那是需要用互杠T这个命令来查看,然后呢,哎,得到的结果其实这个加减这个符号啊,应该就是第二列,所以我们同样可以使用这个命令,然后去截取它的第二列啊,对应的用户还得查出来找它的第二列到底是加号还是减号,就可以知道我们当前应该怎么做了,所以接下来。
13:04
我们还是进来。啊,那接下来的这个过程,既然是查看它是否开启功能,也要用到互命令嘛,那我们干脆来做一个复制吧,对吧?呃,下面应该是有。应该是有八行,所以我们来一个Y8Y。到下边来直接复制一下,呃,然后接下来我们这里就不能叫log logging user了。把它叫做我们就叫做isloud吧,是否允许接收消息,然后接下来呢,这里的命令就是who,杠T,然后grip,啊,杠I,同样是忽略大小写,杠M1,只选取一条信息就够了,然后DOLLAR1,把它进行一个匹配,后边呢,这里就不是DOLLAR1了,不是第一列了,Aw k里边截取的是第二列,把它拿出来。同样下面我们要做一个判断,哎,这个拿到的isloud啊,这就应该是要不是加号,要不是减号,所以我们这里边呢,直接来判断is aloud这个值是否等于啊,如果它不等于加号的话,这就有问题,就要报错了退出,哎,那所以这里边我们就这个信息也改一下,这个不叫不在线,这个叫。
14:14
没有。开启。消息功能。啊,然后脚本退出,然后Fi封闭当前的这个衣服判断的分支就可以了啊,然后有了这一部分,我们也写一个对应的注释啊,这部分主要是用来做查看。查看用户是否开启消息功能。然后接下来我们继续要做的操作,如果说用户也登录在线了,然后也开启了消息功能啊,那另外我们还有一个要求是还得去确认一下当前是否有消息发送对吧?诶,那这个消息发送的话,我们当前第一个位置参数这是呃,指定的那个用户名,那第二个参数就应该是消息了,我们就看DOLLAR2到底存不存在,有没有值就行了啊那这个我们也可以直接把前面那个先先复制过来吧。
15:10
啊,那这一行我们就不要了啊,然后在这里去写一行注释,这里我们要查看的是。确认是否有消息发送。然后接下来这个if要判断的那就是杠Z,这个不是Dollar logging user了,而是DOLLAR2直接判断这个,然后如果说他真的为空的话,那我们这里边就应该说没有。消息发送。然后脚本退出exit啊,这就是前面我们基本要做的一些判断啊,保证我们当前是没有问题的,这些如果都保证了,接下来那就是要获取发送的信息去做write发送。首先我们从参数中。获取。要。
16:00
要发送的消息,那我们想这个怎么样去获取呢?这个稍微有点麻烦,因为我们现在你要是所有参数的话都是消息,那就简单了,我们直接Dollar芯啊,或者Dollar at拿出来就完了嘛,现在呢很尴尬,就只有第一个不是,后边的都是,那我们怎么样去获取呢?啊,也简单,我们就想到了,我可以用一个cut啊,Cut我们用这个空格做分割,把它切开,那把第一个排除掉,从第二列开始,往后所有的都拿出来不就完事了吗?哎,所以基于这个想法,使用cut就把它搞定了。我们这里定义一个变量,比方说叫做whole message。完整的信息,那么就,哎,既然是要使用cut命令,我们还是做一个命令替换啊,相当于是调用系统函数了,那就直接cut。啊,我们这里如果直接cut的话,后边需要跟一个文件名称,那Dollar芯,它并不是这个文件名称,所以我们这里边应该是e Dollar芯。
17:00
然后做一个管道输出输出,然后给到cut命令啊,接下来我们cut的话,那就杠D指定当前的分隔符是空格。然后接下来我们要截取的杠F第几列,那就是从第二列开始,一直到最后所有的内容,哎,这就是我们截取这个消息的过程。诶,那我们接下来就可以直接把这个消息发送给对应的用户了,那注意啊,最后write发送的时候,除了用户名后边还得跟上终端的,诶那我们还得再获取一下当前这个用户的终端,所以这个稍微有一点麻烦啊,但是我们会想到跟前面这一个这一句。其实差不多的啊,也是啊,这个其实我们都不需要再去做这个杠T了啊,直接用最初的这个户直接把它复制过来就可以YY。把它做一个复制,然后接下来在下边做一个粘贴啊,那这里的话。我们输入一个写一个注释啊,这里我们主要是要获取用户登录的终端。
18:06
好,那这里边就不是logging user,我们把它叫做。User。Terminal。用户登录的终端。后面就是一个互命令,然后grape-I-M1,然后传入我们当前DOLLAR1用户名称后边的aw k,那现在获取的不是DOLLAR1DOLLAR1是用户名嘛,啊,那如果不加杠七参数的话,第二列就是终端,诶,所以把它也获取到,接下来终于到最后一步了,现在就可以直接写入。要发送的消息。那这个写入呢,呃,涉及到一个问题,就是我们在外面执行的时候,直接write,加上用户名,加上终端,然后再慢慢的我们在控制台去敲要发送的消息,那现在怎么敲呢?其实也也简单啊,我们直接echo一下之前的。
19:03
Whole message?然后通过管道把它传递交给right就可以了,所以接下来,呃,Right后边这里当然就是login user。在后边跟着的就是我们的user terminal。诶,这样的话,把当前所有的内容就搞定了啊,那最后的话,我们可以再来做一个,到底发送成功没有,我们可以来做一个判断,诶,那就是当前得到的Dollar问号。如果不等于零的话,哎,那这个说明就出问题了。我们可以直接在,然后echo一下说。发作失败。那如果要是else的话。也就是说当前返回的这个扣的直接就是零的话,那代表。发送成功。诶,这就是我们整个的流程,哎,当然了,这里我们在if else里边就不用去退出了,因为完成之后肯定是要退出的嘛,这就是整个的流程就做完了。
20:08
啊,所以整体来讲这个过程,呃,说难也不难,但是整体流程里边还是有很多细节需要需要去考量的啊,那我们现在做完了之后保存退出。保存最初,呃,那还是不要忘记把当前的。权限打开,加上可执行权限send message。然后接下来我们就可以。直接调用了,诶,那假如说这里我们什么都不给的话,直接这么一敲,诶,那我们会发现啊,他其实是没有获取到对应的东西,他直接说不在线退出了,这个也是可以的啊,那比方说我们现在想要给小明发一个消息的话,那当然是小明不在线了。然后接下来如果说我们给艾特硅谷发一个消息。那我们知道APP硅谷是消线是在线的,但是当前我们没有给消息啊,那当然也就是脚本退出了,所以现在的话我们就不用做任何的判断啊,直接敲就可以了,然后那么我们给艾特硅谷发送消息的话,后面比方说来一个嗨。
21:08
艾特硅谷。哎,那发送成功,我们来看一眼。哦,这个是有一些问题的,那说明我们前面这个代码应该是有问题,这里是已经建立连接在发送消息了,但是没有发送成功,诶,那说明可能我们当时的这个消息写的有问题啊,我们还是进去看一眼。这个肯定是在最后这里写入要发送的消息的时候,哦,我们看到了这里的这个home message这个变量名给错了,多了一个E。有一些细节我们也是要注意的啊,好把它做一个更改保存,然后接下来重新做一个发送。我们看现在发送成功。这里就收到了嗨,艾特硅谷这样的一个消息,而且我们看到啊,现在是每一次执行脚本,相当于完了之后会退出,那么这里就相当于一个消息已经结束了,E of可以收到啊,那当然了,我们可以不停的发送其他的消息啊,比方说提醒一下,诶这个比方说老板来了。
22:04
Boss is coming。哎,赶紧提醒一下,该摸鱼的时候摸鱼,那老板来了之后就不要摸鱼了,所以我们这个就可以看的非常的明确,这就是一个非常好玩的功能,实时的发送消息,我们可以写一个脚本实现它。
我来说两句