Linux CLI 与权限:在没有鼠标的世界里生存

“功能修改完成了!”……可部署呢?

入职三个月,在试用期快结束的时候,我第一次拿到了真正的实务任务。虽然只是一个非常简单的功能修改,但我还是一半紧张、一半兴奋地在自己工位上的电脑,也就是 localhost 上改完了代码,连测试也全部完美通过。

“组长,所有本地测试都通过了!”

组长点了点头,直接让我部署。 “辛苦了。那么把代码提交到 GitLab,也就是类似 GitHub 的源码仓库里,然后部署到生产服务器上吧。”

部署? 我慌忙翻起试用期时拿到的交接文档。文档里写满了我完全看不懂的术语。

我先照着要求把代码传上去了。现在只剩最后一步,“连接生产服务器”。我甚至真的准备从座位上站起来。因为我以为会像电视剧里那样,得亲自走进冷气开得很足的机房(IDC),在服务器旁边的键盘上敲命令。

带我的前辈看到这一幕,笑着把我叫住。 “你去哪? 坐在位置上用 SSH 连进去就行了。”

第一次面对黑色屏幕

我打开一个叫 SSH(Secure Shell) 的程序,输入前辈告诉我的 IP 地址和密码,然后按下回车。要是在 Windows 里,迎接我的本该是五彩缤纷的桌面。可出现在显示器上的,只有一块漆黑背景上的闪烁光标。

ubuntu@ip-172-31-0-1:~$ _

没有可以用鼠标点击的图标,也不能右键新建文件夹。我慌乱地乱按了一阵键盘,后来敲了一个 ls,结果文件列表就这样以纯文本形式刷了出来。

“啊,原来这就是只听说过的 CLI(Command Line Interface) 啊。”

但真正的恐惧,是在我尝试执行文件的时候才到来的。我运行了手册里写着的 update 脚本,本来在 Windows 里双击一下就能搞定的事,在这里却只换来一条红色报错信息。

Permission denied(权限被拒绝)

明明是我的服务器,我却连执行都做不到? Linux 为什么会这么不近人情?

服务器不会提供友好的图形界面,GUI。它只给你文本,也就是 CLI。

数字物流中心的仓库管理员

让我们回到“数字物流中心”这个世界观。如果装着 Windows 的笔记本是“舒适的个人办公室”,那 Linux 服务器就是一座只为物流处理而建造的“巨大仓库”。这座仓库里堆着成千上万个箱子,也就是文件。

如果仓库管理员要一个个走过去查看箱子,GUI,再一把钥匙一把钥匙地开门,点击,工作速度一定会慢得离谱。所以 Linux 使用一种叫“命令”的对讲机。

“把 1 号区域的所有箱子都列出来!” (ls) “把 3 号箱子搬到 5 号区域!” (mv) “执行这个箱子!” (./start.sh)

不是因为没有鼠标才不方便。恰恰相反,正因为熟练之后你能以比鼠标快上百倍的速度控制成千上万个文件,所以才故意把图形界面去掉了。

与其一趟一趟跑,不如通过对讲机,也就是命令,直接下达指令。那样更快,也更强大。

[Code Verification] 权限(Permission)的绝对法则

最折磨 Linux 初学者的,正是“权限(Permission)”问题。Windows 里点一下“以管理员身份运行”,大部分事情就解决了。可 Linux 会对每一个文件严格判断“谁(Who)可以做什么(What)”。

想在终端里活下来,你就必须能读懂 ls -l 输出的那串像外星语一样的内容。

$ ls -l myscript.sh
-rwxr-xr--  1  owner  group  1024  Jan 1 12:00  myscript.sh

分析:最前面的 -rwxr-xr-- 才是关键。去掉开头表示文件的 - 之后,要按每 3 个字符一组来读。

自己写的脚本执行不了? 十有八九是因为没有执行权限,也就是 x。这时候,初学者往往会因为着急而念出禁忌咒语 chmod 777

# 絕對不該做的行為
$ chmod 777 myscript.sh

777 的意思是:“我也行,你也行,路过的狗也行,谁都可以修改并执行这个文件。” 这等于把安全大门彻底敞开。实际工作里这是绝对禁忌。你必须养成只赋予最小必要权限的习惯,比如 chmod +x 这样。

chmod 777 的确方便,但它也为攻击者打开了一条方便之路。

实务建议:克服终端恐惧症

刚入职时,前辈让我用 PuTTY 作为服务器连接工具。但我在网上搜索后,找到了一个更好的工具,叫 MobaXterm。这个程序只要通过 SSH 连接,左边就会通过 SFTP 显示一份文件列表,就像我自己电脑上的资源管理器一样。

所以即使我不懂终端命令,也常常靠双击文件来修改和保存。但如果你只依赖这种“取巧办法”,就永远无法真正和 Linux 熟起来。因为在紧急故障场景里,你根本没有时间等 GUI 工具慢慢打开。

结语:掌控环境的人

离开名为 Windows 的温室,去适应名为 Linux 的野外,确实很痛苦。但一旦跨过这份痛苦,你就会获得一种鼠标永远无法带来的强大控制力。

Linux 已经不再是未知领域。但依然还有一个根本问题没有解决。如果我的笔记本,也就是开发环境,装的是 Java 17,而 Linux 服务器,也就是部署环境,装的是 Java 8 呢? 又或者 Linux 里有而我的 Windows 里没有的库呢?

“可是在我电脑上能跑啊?” 这种借口,往往就来自操作系统差异和库版本差异。有没有办法从根本上消除这种环境差异? 能不能把我笔记本上的环境原封不动地冻结下来,再带到服务器上去?

有一种技术,真的把这种看似离谱的想象变成了现实。下一次,我们就来聊聊那个超越虚拟化、掀起容器革命的 Docker。

發佈留言