CLI.NEWS / TUTORIAL

如何在 Linux 上使用 CLI

从包管理器、权限模型到服务管理和 SSH,这篇教程把 Linux 命令行作为日常开发与运维环境系统梳理一遍。

发行版与终端入口

Linux 并不是一个单一版本的系统。Ubuntu、Debian、Fedora、Arch 等发行版,在命令行体验上大体相通,但在包管理器、更新节奏和部分系统路径上会有差异。

所以,学习 Linux CLI 的第一条心智模型应该是: shell 体验相对稳定,而系统管理层要看发行版。

在桌面 Linux 上,你通常会通过 GNOME Terminal、Konsole、Alacritty、WezTerm 或 Ghostty 这样的终端模拟器进入命令行;在服务器上,你往往直接从 SSH 会话开始,甚至根本没有图形界面。不管入口是否带窗口,本质上你面对的都是同一套系统控制面。

# 查看当前 shell
$ echo $SHELL
/bin/bash

# 查看发行版信息
$ cat /etc/os-release

# 查看内核版本
$ uname -a

当你能识别发行版、shell 和当前用户时,其实已经掌握了 Linux 工作面的很大一部分。

Shell 与包管理器

很多 Linux 系统默认仍然使用 Bash,不过 Zsh、fish 等 shell 在开发者中也很常见。Bash 重要的原因在于,它几乎是教程、Docker 镜像、CI 任务和远程机器里的最低公共分母。

Linux 的第二个关键差异点是包管理器。大多数情况下,你不是去网页上下载安装包,而是通过发行版自己的软件源来安装工具。

发行版家族常见包管理器示例命令
Debian / Ubuntuaptsudo apt install git curl ripgrep
Fedora / RHELdnfsudo dnf install git curl ripgrep
Archpacmansudo pacman -S git curl ripgrep
openSUSEzyppersudo zypper install git curl ripgrep
# Debian/Ubuntu 下刷新软件源索引
$ sudo apt update

# 安装常见工具
$ sudo apt install git curl build-essential

# 搜索软件包
$ apt search tmux
  • 系统层包 shell 工具、编译器和底层依赖优先交给发行版包管理器。

  • 语言层包 进入具体语言生态后,再使用 npmpipcargouv 等工具管理项目依赖。

文件系统与权限

Linux 采用以 / 为根的 Unix 风格文件系统。开发者很快就会接触到 home 目录、隐藏文件、可执行位,以及文件归属关系。

命令用途示例
pwd显示当前目录$ pwd
ls -la列出文件,包括隐藏文件$ ls -la ~/.config
chmod修改权限$ chmod +x script.sh
chown修改所有者 / 用户组$ sudo chown user:user file.txt
sudo以更高权限执行命令$ sudo systemctl restart nginx
# 查看文件权限
$ ls -l deploy.sh
-rwxr-xr-x 1 stone stone 914 Mar 20 09:14 deploy.sh

# 添加执行权限
$ chmod +x deploy.sh

# 查看当前用户和所属组
$ whoami
$ id

Linux 会不断奖励你用“所有者、组、最小权限”来思考问题。很多 “permission denied” 并不是程序坏了,而是系统在提醒你: 现在是谁在尝试对哪个文件或服务执行动作。

进程与服务

很多人正是在 Linux 上第一次强烈感受到,终端不只是操作文件的地方,它也是进程、后台服务和日志的控制平面。

# 查看正在运行的进程
$ ps aux | head

# 交互式进程查看
$ top

# 查看服务状态
$ systemctl status ssh

# 查看近期日志
$ journalctl -u ssh --since today

在很多现代发行版里,systemd 是默认的服务管理器,这意味着 systemctljournalctl 会成为日常工具。你会用它们启动服务、设置开机自启、在故障后查看日志。

  • 进程视角 pstophtopkill 这类命令帮助你判断什么正在运行,以及必要时如何停掉它。

  • 服务视角 systemctljournalctl 这类命令帮助你管理那些会长期驻留在后台的软件。

SSH 与远程工作

Linux 和 SSH 几乎是绑定出现的。哪怕你一开始只在本地桌面环境里练习,很多真实工作流最终还是会移动到远程服务器、虚拟机、容器或者云主机上。

# 连接远程服务器
$ ssh user@example.com

# 上传文件
$ scp app.tar.gz user@example.com:/srv/app/

# 高效同步目录
$ rsync -avz ./dist/ user@example.com:/srv/www/dist/

一个实用的 Linux 工作环境,通常要尽早掌握 SSH key、~/.ssh/config 的基本写法,以及在执行破坏性命令前先确认“我现在在哪台机器上”的习惯。

# 生成 SSH 密钥
$ ssh-keygen -t ed25519 -C "you@example.com"

# 一个 SSH config 示例
Host my-prod
  HostName prod.example.com
  User deploy
  IdentityFile ~/.ssh/id_ed25519

开发工具链

当 shell、包管理器和权限模型理顺后,Linux 会变成一个很高效的开发基础面。接下来的常见步骤通常是 Git、编辑器、语言运行时、容器工具以及搜索工具。

# 常见基础工具
$ sudo apt install git curl tmux jq ripgrep fd-find

# 配置 Git 身份
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"

# 查看语言运行时
$ python3 --version
$ node --version
$ go version

很多 Linux 开发者还会高度依赖下面几类工具:

  1. tmux,用于保持长时间会话不断开。
  2. ripgrepfd,用于快速搜索代码和文件。
  3. Docker 或 Podman,作为本地容器化环境。
  4. makejust 或 shell 脚本,来固化重复任务。

Linux 尤其奖励“可组合的小工具”。当工作越来越可重复时,CLI 就会更像基础设施,而不是一堆零散命令。

效率习惯

一个好的 Linux CLI 工作流,并不是靠背下几百条命令构成的,而是靠少数几个可重复的习惯堆出来的。

# 查看命令手册
$ man rsync

# 搜索历史命令
$ history | grep docker

# 创建别名
$ echo 'alias gs="git status -sb"' >> ~/.bashrc

# 重新加载 shell 配置
$ source ~/.bashrc

值得尽早养成的习惯有:

  1. 在复制陌生命令前先读文档。
  2. 让自己的 dotfiles 和 alias 保持可理解。
  3. 多步骤重复动作尽早写成脚本。
  4. 出问题先看日志,而不是先猜。
  5. 需要长期会话时尽早学会 tmux

下一步

Linux 一旦不再被你看成“那个很难的系统”,而是被看成“把内部逻辑更直接暴露给 CLI 的系统”,理解难度就会明显下降。

完成这篇教程后,一个很自然的下一步路径是:

  1. 先把包管理和权限问题练熟。
  2. 在本地虚拟机或云测试机上练 SSH。
  3. 学会 systemctl、日志和进程排查。
  4. 用 Git、Docker 或 shell 脚本固化一条自己的开发流程。

如果说 macOS 和 Windows 教程更像“如何在自己的电脑上使用命令行”,那么 Linux 教程更像“为什么 CLI 会成为服务器、基础设施和自动化世界的共同语言”。