Linux 与远程机器
你写的程序最后多半跑在一台没有显示器的 Linux 机器上。这一篇讲怎么在上面干活。
- Linux 是什么,它和你在用的系统差在哪里;
- 服务器上为什么只有命令行,没有桌面;
- 你熟悉的那几个命令在 Linux 上分别叫什么;
- 用 SSH 连到另一台机器,第一次连接会看到什么;
- 权限那一串字母怎么读,
sudo为什么危险。
一、Linux 是另一个操作系统
操作系统管的是同一批东西:文件放在哪、程序怎么运行、谁能动谁。Windows 和 macOS 管这一套,Linux 也管这一套,只是分工的细节不一样。
对你来说,最直接的差别有三条:
- 没有统一的安装包。软件由各发行版自己的仓库分发,装东西用命令,不靠双击安装包。
- 路径只有正斜杠。Windows 的
C:\Users\你、macOS 的/Users/你,在 Linux 上都写作/home/你;而且没有盘符,整台机器只有一个根目录/。 - 大小写敏感。
Note.txt与note.txt是两个不同的文件。Windows 上混着用不报错,macOS 默认也不区分,这一条最容易让人栽跟头。
日常学习不用装 Linux。等你需要把程序放到服务器上长期运行时,才需要真的进去操作。
二、服务器上为什么只有命令行
服务器放在机房的机架上,通常没有显示器、没有键盘、没有鼠标。它只需要两件事:一直开着,以及让人能从远处连进来。
画面传过来是又慢又占带宽的。一行文字只有几百字节,一次请求一次响应,在几十毫秒内就能完成。所以服务器的界面就是命令行,而且这不是历史遗留,是当下的设计选择。
由此推出一个实际结论:在服务器上,你没法「打开一个窗口看看」。所有判断都要靠命令的输出。这也是第 4 篇讲的「读报错」在 Linux 上更重要的原因。
三、六个命令的 Linux 对照
第 3 篇那几个命令在 Linux 上都有对应物,名字不同,作用一样。下表第三列是 macOS 的写法,它本身就是类 Linux 系统,多数命令与 Linux 相同:
| 要做的事 | Windows | Linux | macOS |
|---|---|---|---|
| 列出当前目录 | dir | ls(看隐藏文件加 -a) | ls |
| 切换目录 | cd 路径 | cd 路径 | cd 路径 |
| 看自己在哪 | pwd | pwd | pwd |
| 新建目录 | mkdir 名字 | mkdir 名字 | mkdir 名字 |
| 看文件内容 | type 文件名 | cat 文件名 | cat 文件名 |
| 复制文件 | copy 源 目标 | cp 源 目标 | cp 源 目标 |
| 删除文件 | del 文件名 | rm 文件名 | rm 文件名 |
真正需要单独记的只有三个新命令,它们都跟「文件很多、输出很长」有关:
less 文件名:分页看长文件。按空格翻页,按q退出。看日志基本都靠它。grep 关键词 文件名:在文件里找含关键词的行。日志几千行时,先用它缩小范围。tail -n 50 文件名:只看最后 50 行。程序刚崩的时候,最相关的信息几乎都在末尾。
ls 写成 LS 会报「command not found」,cd My Files 会被拆成两个参数。
路径里有空格时必须加引号,写成 cd "My Files"。这两类错误在 Windows 上不会出现,所以第一次上 Linux 的人经常在这里卡住。macOS 同样区分大小写、同样需要引号。
四、用 SSH 连到另一台机器
SSH(Secure Shell)是一条加密的通道,把你的键盘输入送到另一台机器,把它的输出送回你的屏幕。连上之后,你打的每条命令都在对面执行。
两套系统都自带 SSH 客户端,不需要额外安装:
$ ssh 用户名@机器地址
The authenticity of host '10.0.0.5' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?
这段提示的意思是:我以前没见过这台机器,你确认它是你要连的那台吗。第一次连一台新机器时都会出现,输入 yes 回车即可。它会把这台机器的指纹记到本地,下次不再问。
如果这次看到的指纹和上次不一样,SSH 会直接拒绝连接并给出警告。这种情况要认真对待:可能是机器重装了系统,也可能是有人在中间冒充。先找管理员确认,不要直接把记录删掉重来。
连上之后提示符会变,通常长这样:
用户名@机器名:~$
看到它就说明命令已经发到对面了。此时 ls 列出的是对面机器上的文件,不是你本机的。想断开,输入 exit 或按 Ctrl+D。
五、权限那一串字母怎么读
在 Linux 上执行 ls -l,每行开头都有一串字母:
-rw-r--r-- 1 user user 1024 Sep 1 10:23 note.txt
drwxr-xr-x 2 user user 4096 Sep 1 09:11 projects
这一串十位,分成四段读:
- 第一位:
-是普通文件,d是目录。 - 第二到第四位:属主(文件的主人)能不能读、写、执行。
rw-表示能读能写不能执行。 - 第五到第七位:同组用户的权限。
r--表示只能读。 - 第八到第十位:其他人的权限。同样是
r--。
三个字母的位置固定是「读、写、执行」,没有哪个权限就写成 -。所以 rw-r--r-- 读作:主人能读能写,其他人只能读,谁都不能执行。
改权限用 chmod。最常见的两种:
chmod +x run.sh # 给脚本加上可执行权限
chmod 600 secret.txt # 只有主人能读能写,其他人一律不能碰
sudo 让你以管理员身份执行一条命令。它确实能解决「权限不足」的报错,但那条报错本身往往在提醒你:这个操作有风险。
先用 sudo 把问题压下去,等于放弃了这次提醒。执行前先弄清楚这条命令会改什么。
六、不装双系统也能练
按省事程度排序,三种方式:
- macOS:本身就是一个类 Linux 系统,终端里直接就能练上面所有命令,不需要额外装任何东西。
- Windows 的 WSL:系统自带的功能,在 PowerShell 里执行
wsl --install,装完就是一个完整的 Linux。文件互通,复制粘贴方便,日常练习用这个。 - 在线环境或云服务器:教学平台提供浏览器里的 Linux 终端,打开就能用;云服务器按小时计费,真要做长期运行的东西才需要。
wsl --install,装完重启,打开 Ubuntu 窗口。② 依次执行
pwd、ls -l、cd /、ls,看看根目录下有哪些文件夹。③ 用
mkdir ~/gse-practice 建一个练习目录,cd 进去,用 echo hello > a.txt 写一个文件,再用 cat a.txt 看内容。④ 执行
ls -l,读出 a.txt 那一行前十个字母,说出谁能读、谁能写。
自测
1. Linux 上路径为什么没有 C 盘、D 盘?
/。插进来的硬盘、U 盘都挂在某个目录下面,比如 /mnt/data,访问方式和普通目录一样,不需要盘符。2. 第一次 SSH 连接时那段指纹提示,应该怎么处理?
3. rw-r--r-- 这串字母表示谁能做什么?
rw- 能读能写不能执行;同组用户 r-- 只能读;其他人 r-- 只能读。没有执行权限,所以它不能被当作程序运行。