[游戏]从hacknet到Linux/Unix

从Hacknet到Linux/Unix

Hacknet是一个steam上的游戏,官方的介绍是它是一款给基于终端的黑客模拟器。在游戏中你需要调查失踪的bit,加入黑客组织,完成任务,最后揭开所有的奥秘。
游戏界面是一个看起来贼酷炫的命令行界面,玩家想要黑进其他的服务器,要通过快速输入命令来完成一系列操作最终获取目标服务器的控制权。
但是它仅仅只是个游戏而已吗?哪些命令都是游戏开发者杜撰出来的吗?不不不,里面还是有很多知识值得我们去了解和学习
header.jpg

Hacknet OS是个怎么样的操作系统

首先我们简单说一下主流操作系统的派别。
首先登场的选手是DOS,有很多软件公司都开发过DOS系统,当然,最好的是巨硬爸爸的MS-DOS。巨硬之后发布的win95,win98也都是基于DOS的,就算win2000之后的Windows基于图形化界面,但是任然可以打开cmd.exe运行DOS命令。
接下来像我们走来的是Unix代表队的选手们,1965年,Ken Thompson和Dernis Ritchie为了在自己的电脑上运行“星际旅行”程序(没错是个游戏),开发了这个系统。
be5051f74da220664a95671d49756e11.jpg
但是无论是DOS还是Windows还是Unix,都是收费软件,而且价格不菲。这时候Richard Stallman站了出来,他建立了GNU(全称GNU is not Unix)基金会,计划完全模仿Unix做一个开源免费的操作系统,这就是GNU/Linux操作系统,后来人们习惯称它为Linux。

Unix和Linux虽然根本不同源,但是由于功能上的高度一致,所有可以统称他们*nix
游戏中的Hacknet_OS怎么看都是一个基于*nix的操作系统

再说一说文件系统

说到文件大家应该都不陌生,文件的位置叫做文件的路径。Windows下的路径大概是这样子的。C:\\windows\system32\cmd.exe,它的意思是C盘在windows文件夹里的system32文件夹里的cmd.exe文件。我们日常说的C盘和D盘其实是磁盘中的一个分区,C:\\开头的文件储存在C盘对应的分区里。后来我们习惯性地把和系统相关的软件装在C盘,把下载的文件存在D盘,如果装了ssd就把系统和游戏都装在ssd里……
但是在Unix系统中,一个文件的路径是这样的/etc/apache2/apache2.conf,不仅最前面没有盘符,连斜线方向都不一样。其实严格的说,Unix的所有文件都放在一个称为根目录的大文件/下,而具体哪个文件在哪个驱动器里,是由Unix的“挂载”机制确定的。
Hacknet_OS的/目录下面有四个文件夹
深度截图_选择区域_20180214212035-3.png
毫无疑问在原版的Linux系统里都有对应的文件夹,文件夹中存放的东西也大概和游戏中一致。
/home文件夹存放的是每个用户的个人的文件,如果我的用户名是felinae那么/home/felinae就是我的个人文件夹,我对这个文件夹下的文件具有一切权限。Hacknet中的home文件夹提供了类似的功能但是进行了简化。
游戏中/log中存放的是系统日志,在Linux中这个文件夹是/var/log。与游戏中不同的是,/var/log中的日志是按不同程序归类的,不同程序的日志记录在不同的文件中,但是绝对不会像hacknet中像老妈妈记账一样事无巨细的把所有东西记下来。在游戏中设计/log的原因估计是游戏开发者想让玩家记住跑路前一定要抹掉自己的痕迹。
/bin是binary的意思,指编译好了的可运行的程序,在Linux中/bin中存放着的是最低级,最基本的程序,比如cat, cp, mv这些程序,比较高级像Python这样的程序一般存在/usr/bin中。值得吐槽的是,*nix系统的可运行文件是没有exe的后缀的,也没有dll结尾的动态链接库。
/sys顾名思义存放着一些系统文件,无论是游戏中还是真实世界中这个文件夹里的东西都不要乱动。

Shell究竟是啥

首先shell不是拿来操纵肉鸡的。
shell这个单词的意思是壳,乍一看不知所云,但是把它和与之对应的内核(kernel)对应起来就没那么难以理解了,顾名思义,内核负责的是内部的处理运算,shell负责处理外界对程序的操作,把处理结果返回给外界。
shell种类繁多有基于CLI(命令行)的也有基于GUI(图形化界面)的,但一般说到shell都默认是命令行。shell的功能取决于他后面的内核,MySQL的客户端就是个shell,直接运行Python启动的是Python shell,MATLAB的交互式界面也是shell,连爬虫scrapy运行的时候都会启动一个shell,这些程序都是输入一个命令,然后返回一个执行命令后的结果,一般具有这种功能的程序都是shell。
如果后面的内核是系统内核,windows的内核shell一个是大名鼎鼎的explorer.exe另一个是cmd.exe还有win10开始才出现的powershell。Linux中最基本的shell是sh,最常用的shell是bash,绝大部分Linux的默认shell都是bash(除了alpine这样专注小巧轻量化的),当然也有为了好用而生的zsh,fish。
u41112526892994473589fm27gp0.jpg
(这是cmd.exe)
70f58fb6-ba03-11e4-82c9-c083bf9a6574.png
(这是oh-my-zsh)
没有自动补全的shell不是好shell,在很多shell中,你只用输入命令的前几个字母,按一下tab,shell就会帮你补全整个命令,在hacknet中要大量运用这个技巧提高自己的速度。

那些命令和端口都是真的吗

20180216233357.png
大部分是真的。
mv是移动或者重命名(move),cp是复制(copy),cat是查看文件内容,cd是切换文件夹(change director),rm是删除(remove),shutdown关机,reboot重启
rm -r可以删除文件夹(游戏中明显不能),所以在Linux下可以一波rm -rf --no-preserve-root /直接把根目录删掉,包括运行中的系统内核,最后了连关机都关不掉(shutdown都被删了)
我们注意到,很多电脑会开放一个叫做SSH,端口号一般为22的端口,这几乎是游戏中最简单的一个端口。它的意思是secure shell,是用于远程管理Linux的。只需要提供目标计算机的地址以及口令就可以登录目标计算机,对其进行远程操纵。但是提供口令的这种方式不安全,如果密码泄露或者被别人猜到,攻击者就能完全控制目标计算机。当然,SSH也可以禁用口令登录,通过公私钥来登录,这样几乎断绝了暴力破解的可能,并且与目标计算机之间的通信也通过公私钥加密,断绝了被窃听的可能。
既然SSH是secure shell,那么SCP就是secure copy了,与SSH类似,只要提供目标计算机口令或者私钥,就可以与目标计算机传送文件。无论是向服务器上传文件还是从服务器下载文件都可以用SCP完成。(没错游戏里的upload也是SCP完成的)。
FTP是一个文件传输协议,和SCP不同的是ftp可以设置指定用户名密码登录,也可以设置没有密码还能精确到地控制文件的权限。SCP适合点对点传输文件,但是要建立一个文件共享站点或者老师想要让学生吧作业交到一个统一的地方,FTP绝对是你的首选。
SMTP是发邮件用的,torrent是下载种子用的,MySQL是数据库开放的端口。
80端口是http端口,你上网看网页全靠它,443是https端口,它提供的是加密的http。


总的来说hacknet还是一款很有趣的游戏,想要学习Linux的朋友也可以通过这款游戏对Linux有一个大概的认识,在2月20号以前在steam上12块就可以买到这个游戏,想要入手的盆友们抓紧啦。

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。