Linux 详细教程(以 Ubuntu 为例) 目录
什么是 Linux
文件系统结构
终端基础
文件与目录操作
文件权限
用户与组管理
进程管理
软件包管理 (apt)
文本处理
Shell 基础
网络操作
磁盘管理
systemd 服务管理
常用命令速查表
1. 什么是 Linux 1.1 操作系统结构
Linux 严格来说只是内核(Kernel),但通常我们说”Linux”指的是基于 Linux 内核的完整操作系统(GNU/Linux 发行版)。
1.2 常见的 Linux 发行版 1 2 3 4 5 6 7 8 9 10 11 12 Debian 系(使用 apt/dpkg): Red Hat 系(使用 yum/dnf/rpm): ├── Ubuntu (桌面/服务器) ├── RHEL (企业级) │ ├── Kubuntu (KDE) ├── CentOS (免费 RHEL 克隆,已停止) │ ├── Xubuntu (XFCE) ├── Fedora (前沿技术) │ └── Linux Mint (易用桌面) └── Rocky Linux (CentOS 替代) ├── Debian (稳定/通用) └── Kali Linux (安全渗透) 其他: ├── Arch Linux (滚动更新,DIY) ├── openSUSE (企业/社区) └── Alpine (极简,常用于 Docker)
本教程以 Ubuntu 22.04 LTS 为例。
1.3 Linux 哲学
“一切皆文件” —— 硬件设备、进程、网络连接、系统信息,在 Linux 中都以文件形式存在。
1 2 3 4 /dev/sda ← 硬盘 /dev/tty ← 终端 /proc/cpuinfo ← CPU 信息 /sys/class ← 设备信息
2. 文件系统结构 2.1 根目录结构总览 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 / ← 根目录,一切文件系统的起点 ├── bin/ ← 基本用户命令 (/usr/bin 的符号链接) │ ├── ls ← 列出目录 │ ├── cp ← 复制 │ ├── mv ← 移动 │ └── cat ← 显示文件 │ ├── boot/ ← 启动相关文件 │ ├── vmlinuz ← Linux 内核 │ └── initrd.img ← 初始 RAM 磁盘 │ ├── dev/ ← 设备文件 │ ├── sda ← 第一块硬盘 │ ├── sda1 ← 第一个分区 │ ├── tty ← 终端 │ ├── null ← 黑洞(丢弃一切写入的数据) │ ├── zero ← 无限零字节流 │ └── random ← 随机数生成器 │ ├── etc/ ← 系统配置文件 (Editable Text Configuration) │ ├── passwd ← 用户账户信息 │ ├── shadow ← 用户密码(加密) │ ├── group ← 用户组信息 │ ├── hosts ← 主机名-IP 映射 │ ├── hostname ← 主机名 │ ├── fstab ← 文件系统挂载表 │ ├── apt/sources.list ← 软件源配置 │ ├── ssh/sshd_config ← SSH 服务配置 │ └── nginx/ ← Nginx 配置目录 │ ├── home/ ← 用户主目录 │ ├── alice/ ← 用户 alice 的个人目录 │ │ ├── Desktop/ ← 桌面 │ │ ├── Documents/ ← 文档 │ │ ├── Downloads/ ← 下载 │ │ ├── .bashrc ← Bash 配置文件(以 . 开头表示隐藏) │ │ └── .config/ ← 用户级应用配置 │ └── bob/ ← 用户 bob 的个人目录 │ ├── lib/ ← 系统库文件 (/usr/lib 的符号链接) │ ├── media/ ← 可移动媒体挂载点(USB、CD-ROM) │ ├── mnt/ ← 临时挂载点(手动挂载) │ ├── opt/ ← 第三方应用软件包 (Optional) │ ├── proc/ ← 虚拟文件系统(进程和系统信息) │ ├── cpuinfo ← CPU 信息 │ ├── meminfo ← 内存信息 │ ├── version ← 内核版本 │ ├── uptime ← 系统运行时间 │ ├── [PID]/ ← 每个进程的目录(PID = 进程号) │ │ ├── cmdline ← 启动命令 │ │ ├── environ ← 环境变量 │ │ └── status ← 进程状态 │ └── mounts ← 挂载信息 │ ├── root/ ← root 用户的主目录 │ ├── run/ ← 运行时变量数据(重启后清空) │ ├── sbin/ ← 系统管理员命令 (/usr/sbin 的符号链接) │ ├── srv/ ← 服务数据 (Service Data) │ ├── sys/ ← 虚拟文件系统(内核和设备信息) │ ├── tmp/ ← 临时文件(重启后可能清空) │ ├── usr/ ← 用户系统资源 (Unix System Resources) │ ├── bin/ ← 大部分用户命令 │ ├── sbin/ ← 系统管理命令 │ ├── lib/ ← 库文件 │ ├── local/ ← 本地编译安装的软件 │ ├── share/ ← 共享数据(文档、图标、字体等) │ └── include/ ← C/C++ 头文件 │ └── var/ ← 可变数据 (Variable) ├── log/ ← 系统日志 │ ├── syslog ← 系统日志 │ ├── auth.log ← 认证日志(登录记录) │ └── apt/history.log ← 软件安装历史 ├── cache/ ← 应用程序缓存 ├── lib/ ← 应用状态信息 │ └── apt/lists/ ← apt 软件包列表缓存 ├── spool/ ← 打印/邮件队列 └── www/ ← Web 服务器文件(可选)
2.2 重要目录详解 /etc — 系统配置的”控制中心” 1 2 3 4 5 6 7 8 9 /etc/passwd /etc/shadow /etc/group /etc/sudoers /etc/crontab /etc/fstab /etc/hosts /etc/resolv.conf /etc/apt/sources.list
/proc — 窥探系统运行的窗口 1 2 3 4 5 6 7 8 9 10 11 12 13 cat /proc/cpuinfo cat /proc/meminfo cat /proc/version cat /proc/uptime cat /proc/loadavg cat /proc/mounts ls /proc/1234/ cat /proc/1234/cmdline cat /proc/1234/status
/dev — 设备即文件 1 2 3 4 5 6 7 8 9 10 11 /dev/sda /dev/sda1 /dev/sdb /dev/nvme0n1 /dev/tty1 /dev/pts/0 /dev/null /dev/zero /dev/random /dev/urandom /dev/loop0
2.3 路径表示 1 2 3 4 5 6 7 8 9 10 /home/alice/file.txt ← 绝对路径(从 / 开始) ../bob/file.txt ← 相对路径(相对于当前目录) . ← 当前目录 .. ← 上级目录 ~ ← 当前用户的主目录 ~bob ← bob 用户的主目录 - ← 上一次所在目录(cd - 切换回去)
3. 终端基础 3.1 终端 vs Shell vs 命令行 1 2 3 4 5 6 ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 终端模拟器 │ │ Shell │ │ 操作系统 │ │(Terminal)│ ←→ │ (bash) │ ←→ │ (Kernel) │ │ 图形界面 │ │ 命令解释器 │ │ │ └──────────┘ └──────────┘ └──────────┘ 你看到的窗口 解析并执行命令 实际干活的部分
常见 Shell:
Shell
特点
配置文件
bash
大多数 Linux 默认,兼容性好
~/.bashrc
zsh
功能丰富,插件生态好
~/.zshrc
fish
开箱即用,语法友好
~/.config/fish/config.fish
dash
轻量,Debian/Ubuntu 的 /bin/sh
—
3.2 命令格式 1 2 3 4 5 命令名 [选项/标志] [参数...] │ │ │ │ │ └── 命令操作的对象(文件、目录等) │ └── 修改命令行为(-短选项 --长选项) └── 要执行的程序
1 2 3 4 5 6 7 8 9 10 11 12 ls -l /home│ │ │ │ │ └── 参数:要列出哪个目录 │ └── 选项:长格式显示 └── 命令:列出文件 ls -l -a -h ls -lah ls --all ls --human-readable
3.3 常用快捷键 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Ctrl + C 终止当前正在运行的程序 Ctrl + D 发送 EOF(退出终端、退出 Python 等交互环境) Ctrl + Z 暂停(挂起)当前程序,放入后台 Ctrl + L 清屏(相当于 clear 命令) Ctrl + A 光标跳到行首 Ctrl + E 光标跳到行尾 Ctrl + U 删除光标前的内容 Ctrl + K 删除光标后的内容 Ctrl + W 删除光标前的一个单词 Ctrl + R 搜索历史命令(最实用的功能之一) !! 重复上一条命令 !$ 上一条命令的最后一个参数 ↑ / ↓ 浏览历史命令 Tab 自动补全(路径、命令、参数)
3.4 获取帮助 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 man ls man 5 crontab man -k keyword ls --help git --help whatis ls whereis python3 which python3sudo apt install tldrtldr tar
4. 文件与目录操作 4.1 浏览文件系统 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 pwd ls ls -l ls -a ls -la ls -lh ls -lt ls -ltr ls -R ls -d */ cd /home cd Documents cd .. cd ../.. cd - cd ~ cd
4.2 创建与删除 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 touch file.txttouch file1.txt file2.txt file3.txt mkdir new_foldermkdir -p a/b/c/d mkdir -p project/{src,tests,docs} rm file.txtrm -i file.txt rm -f file.txt rm -r folder/ rm -rf folder/ rmdir empty_foldersudo apt install trash-clitrash-put file.txt trash-list trash-restore trash-empty
4.3 复制与移动 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 cp source.txt dest.txt cp file1.txt file2.txt folder/ cp -r source_dir/ dest_dir/ cp -i source.txt dest.txt cp -u source.txt dest.txt cp -p source.txt dest.txt cp -a source_dir/ dest_dir/ mv oldname.txt newname.txt mv file.txt folder/ mv -i source.txt dest.txt mv -u source.txt dest.txt for f in *.txt; do mv "$f " "${f%.txt} .md" ; done sudo apt install renamerename 's/\.txt$/\.md/' *.txt
4.4 查看文件内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 cat file.txtcat -n file.txt cat file1.txt file2.txt tac file.txtless file.txt head file.txt head -n 20 file.txt head -c 100 file.txt tail file.txt tail -n 20 file.txt tail -f /var/log/syslog nl file.txtwc file.txt wc -l file.txt wc -w file.txt wc -c file.txt file mystery_file file *.png
4.5 链接 Linux 中有两种链接:硬链接 和 符号链接(软链接) 。
1 2 3 4 5 6 7 8 9 10 11 硬链接 (Hard Link): 符号链接 (Symbolic Link): [文件数据块] [文件数据块] ↑ ↑ ↑ | | | file.txt hardlink file.txt symlink → file.txt 共享同一个 inode(数据块) symlink 存储的是目标路径(类似 Win 快捷方式) 删除原文件不影响硬链接 删除原文件后,软链接失效 不能跨文件系统 可以跨文件系统 不能链接目录 可以链接目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ln original.txt hardlink.txtln -s /usr/bin/python3 pythonln -s /var/www/html web-rootln -s ../config/settings.json settings.jsonls -lreadlink python readlink -f python
5. 文件权限 5.1 权限模型 Linux 权限基于三个主体和三种操作:
1 2 3 4 5 三个主体: 三种操作: u = user (所有者) r = read (读) = 4 g = group (所属组) w = write (写) = 2 o = other (其他人) x = execute(执行) = 1 a = all (所有)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ ls -l -rwxr-xr-- 1 alice developers 4096 Jun 16 14:30 script.sh │││││││││ │└┴┴┴┴┴┴┴┴── 权限位 └── 文件类型 权限位拆解: - rwx r-x r-- │ │ │ │ │ │ │ └── other: 只读 (r--) │ │ └── group: 读+执行 (r-x) │ └── user (owner): 读+写+执行 (rwx) └── 类型: 普通文件 等价数字表示: rwx = 4+2+1 = 7 r-x = 4+0+1 = 5 r-- = 4+0+0 = 4 → 权限: 754
注意: 目录也是一种”文件”,同样有 rwx 权限,只是含义略有不同:
r — 能否列出目录内容(ls)
w — 能否在其中创建/删除文件
x — 能否进入该目录(cd)
5.2 常用权限组合
数字
权限
含义
典型用途
777
rwxrwxrwx
所有人都能读写执行
⚠️ 不安全,避免使用
755
rwxr-xr-x
所有者全权限,其他人读取执行
可执行文件、目录
750
rwxr-x—
所有者和组有权限,其他人无
团队共享目录
700
rwx——
只有所有者有权限
个人脚本、SSH 密钥
644
rw-r–r–
所有者可写,其他人只读
普通文件
640
rw-r—–
所有者和组可读,其他人无
配置文件
600
rw——-
只有所有者可读写
敏感文件(私钥、密码)
5.3 修改权限 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 chmod u+x script.sh chmod g-w file.txt chmod o= file.txt chmod a+r file.txt chmod u=rwx,g=rx,o= script.shchmod 755 script.sh chmod 644 file.txt chmod 600 id_rsa chmod -R 755 project/find project/ -type d -exec chmod 755 {} \; find project/ -type f -exec chmod 644 {} \; chown alice file.txt chown alice:developers file.txt chown :developers file.txt chown -R alice:developers dir / chgrp developers file.txt
5.4 特殊权限 1 2 3 SUID (Set User ID) — 4— # 以文件所有者的身份执行 SGID (Set Group ID) — 2— # 以文件所属组的身份执行 / 目录中新文件继承组 Sticky Bit — 1 # 只有文件所有者才能删除(用于 /tmp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 chmod u+s /usr/bin/passwd chmod g+s /shared/team_dir/ chmod +t /tmp chmod 4755 file chmod 2755 file chmod 1755 dir chmod 6755 file
5.5 umask — 默认权限 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 umask umask 027echo "umask 027" >> ~/.bashrc
6. 用户与组管理 6.1 用户类型 1 2 3 root (UID=0) ← 超级管理员,拥有一切权限 └── 系统用户 (1-999) ← 运行系统服务(如 www-data, mysql),通常无登录权限 └── 普通用户 (1000+) ← 你创建的用户,日常使用
6.2 用户管理命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 whoami id id alice cat /etc/passwd cat /etc/shadow sudo cat /etc/shadowsudo apt updatesudo -i sudo -u alice whoami su - alice sudo useradd -m -s /bin/bash bob passwd sudo passwd bob sudo passwd -l bob sudo passwd -u bob sudo usermod -aG sudo bob sudo usermod -aG docker bob sudo usermod -s /bin/zsh bob sudo usermod -L bob sudo usermod -U bob sudo userdel bob sudo userdel -r bob
6.3 组管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 cat /etc/groupgroups alice sudo groupadd developerssudo groupmod -n devs developers sudo groupdel developerssudo gpasswd -a alice developers sudo gpasswd -d alice developers
6.4 /etc/sudoers 配置 1 2 3 4 5 6 7 8 9 10 11 12 sudo visudoalice ALL=(ALL:ALL) NOPASSWD: ALL bob ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx %developers ALL=(ALL) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade
7. 进程管理 7.1 进程概念 1 2 3 4 5 6 7 8 9 进程(Process):正在运行的程序的实例。 每个进程有一个唯一的 PID(Process ID)。 进程状态: R = Running / Runnable 正在运行或可运行 S = Sleeping (Interruptible) 可中断睡眠 D = Sleeping (Uninterruptible) 不可中断睡眠(通常等待I/O) T = Stopped 已停止(被 Ctrl+Z 暂停) Z = Zombie 僵尸进程(已完成但未被回收)
7.2 查看进程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ps ps aux ps -ef ps aux | grep nginx ps -fp $(pgrep nginx) ps aux --sort =-%mem | head ps aux --sort =-%cpu | head pgrep nginx pgrep -u alice pkill nginx top sudo apt install htophtop
7.3 前台与后台 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 sleep 100 & jobs fg %1 nohup ./long-script.sh &nohup python3 server.py > output.log 2>&1 &disown %1
7.4 终止进程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 kill 1234 kill -15 1234 kill -9 1234 kill -HUP 1234 kill -l killall nginx killall -9 node pkill -f "python server.py" pkill -u alice
7.5 进程优先级 1 2 3 4 5 6 7 8 9 nice -n 10 ./cpu-heavy-task nice -n -10 ./important-task sudo renice -n 5 -p 1234
8. 软件包管理 (apt) 8.1 APT 体系 Debian/Ubuntu 使用 APT (Advanced Package Tool) 管理软件包,底层是 dpkg。
1 2 3 4 APT 工作流程: sources.list ──→ apt update ──→ 本地包缓存 ──→ apt install pkg (软件源地址) (下载索引) (包信息数据库) (下载并安装)
8.2 包管理命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 sudo apt update sudo apt upgrade sudo apt full-upgrade sudo apt autoremove sudo apt autoclean sudo apt install nginx sudo apt install -y nginx sudo apt install ./package.deb sudo apt remove nginx sudo apt purge nginx sudo apt remove --purge nginx apt search nginx apt show nginx apt list --installed apt list --upgradable dpkg -l dpkg -l | grep nginx dpkg -L nginx dpkg -S /usr/bin/nginx sudo dpkg -i package.deb
8.3 软件源配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 cat /etc/apt/sources.listsudo cp /etc/apt/sources.list /etc/apt/sources.list.backupsudo sed -i 's|http://archive.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.listsudo apt update
8.4 Snap 与 Flatpak 1 2 3 4 5 6 7 8 9 snap find vscode sudo snap install vscode --classicsnap list sudo apt install flatpakflatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo flatpak install flathub com.visualstudio.code
9. 文本处理 9.1 文本查看与搜索 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 grep "error" app.log grep -i "error" app.log grep -v "debug" app.log grep -r "TODO" src/ grep -rn "TODO" src/ grep -c "error" app.log grep -A 3 "error" app.log grep -B 3 "error" app.log grep -C 3 "error" app.log grep -E "(error|warning)" app.log grep -P "\d{3}-\d{4}" file.txt ps aux | grep nginx history | grep "git" dpkg -l | grep python
9.2 文本处理三剑客 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 sed 's/old/new/' file.txt sed 's/old/new/g' file.txt sed 's/old/new/gi' file.txt sed -i 's/old/new/g' file.txt sed -i.backup 's/old/new/g' file.txt sed '5,10s/old/new/g' file.txt sed '/pattern/s/old/new/g' file.txt sed '/^$/d' file.txt sed -n '5,10p' file.txt sed '1i\# Header' file.txt awk '{print $1}' file.txt awk '{print $1, $3}' file.txt awk -F: '{print $1, $7}' /etc/passwd awk '{sum += $1} END {print sum}' file awk 'NR>=5 && NR<=10' file.txt awk '$3 > 100' file.txt awk '/error/ {count++} END {print count}' app.log sort file.txt sort -n file.txt sort -r file.txt sort -u file.txt sort -t: -k2 /etc/passwd sort -h sizes.txt uniq file.txt sort file.txt | uniq sort file.txt | uniq -c sort file.txt | uniq -d cut -d: -f1 /etc/passwd cut -c1-10 file.txt cut -d',' -f1,3 data.csv echo "hello" | tr 'a-z' 'A-Z' echo "hello world" | tr ' ' '\n' echo "hello world" | tr -s ' ' echo "abc123def" | tr -d '0-9' find . -name "*.txt" | xargs rm find . -name "*.log" | xargs grep "error" echo "file1 file2 file3" | xargs -n 1 cp -t dest/
9.3 重定向与管道 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 command > file command >> file command 2> file command &> file command < file command << EOF # Here Document:读取多行直到 EOF 多行内容 EOF ls -la > listing.txt echo "new line" >> file.txt grep "error" app.log 2>/dev/null command > output.log 2>&1 command > /dev/null 2>&1 command1 | command2 | command3 cat /var/log/syslog | grep "error" | lessps aux | grep nginx | awk '{print $2}' find . -type f | wc -l dpkg -l | grep "^ii" | wc -l history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10
9.4 Vim 速成 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 vim file.txt vim +10 file.txt i a o O Esc :w :q :wq / ZZ :q! dd yy p u Ctrl+r /pattern :%s/old/new/g gg G :10
10. Shell 基础 10.1 变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 name="Alice" count=42 echo $name echo ${name} echo "Hello, ${name} " local_var="only here" export GLOBAL_VAR="everywhere" echo $HOME echo $USER echo $PATH echo $PWD echo $SHELL export PATH="$HOME /bin:$PATH " echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc files=$(ls | wc -l) today=`date +%Y-%m-%d` echo "Today is $today "
10.2 引号规则 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 echo '$HOME is $HOME' echo "$HOME is home" echo "Today is $(date) " echo "Today is `date`" mv "my file.txt" "new name.txt"
10.3 条件判断 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 if [ condition ]; then commands elif [ condition ]; then commands else commands fi [ "$a " = "$b " ] [ "$a " != "$b " ] [ -z "$a " ] [ -n "$a " ] [ "$a " -eq "$b " ] [ "$a " -ne "$b " ] [ "$a " -gt "$b " ] [ "$a " -lt "$b " ] [ "$a " -ge "$b " ] [ "$a " -le "$b " ] [ -f "$file " ] [ -d "$file " ] [ -e "$file " ] [ -r "$file " ] [ -w "$file " ] [ -x "$file " ] [ -s "$file " ] [ "$a " -gt 0 ] && [ "$b " -lt 10 ] [ "$a " -gt 0 ] || [ "$b " -lt 10 ] [[ $a -gt 0 && $b -lt 10 ]]
10.4 循环 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 for i in 1 2 3 4 5; do echo "Number: $i " done for i in {1..10}; do echo $i done for file in *.txt; do echo "Processing $file " done count=1 while [ $count -le 5 ]; do echo "Count: $count " count=$((count + 1 )) done while IFS= read -r line; do echo "Line: $line " done < file.txt
10.5 Shell 脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #!/bin/bash set -euo pipefail SOURCE_DIR="${1:?请指定源目录} " BACKUP_DIR="${2:?请指定备份目录} " DATE=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="${BACKUP_DIR} /backup_${DATE} .tar.gz" echo "正在备份 $SOURCE_DIR 到 $BACKUP_FILE ..." tar -czf "$BACKUP_FILE " "$SOURCE_DIR " if [ $? -eq 0 ]; then echo "备份成功: $BACKUP_FILE " echo "文件大小: $(du -h "$BACKUP_FILE " | cut -f1) " else echo "备份失败!" exit 1 fi
10.6 别名与函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 alias ll='ls -alF' alias la='ls -A' alias ..='cd ..' alias ...='cd ../..' alias update='sudo apt update && sudo apt upgrade' alias gs='git status' alias gc='git commit' alias echo "alias ll='ls -alF'" >> ~/.bashrcsource ~/.bashrc mkcd () { mkdir -p "$1 " && cd "$1 " } extract () { if [ -f "$1 " ]; then case "$1 " in *.tar.gz) tar xzf "$1 " ;; *.zip) unzip "$1 " ;; *.tar) tar xf "$1 " ;; esac fi }
11. 网络操作 11.1 网络基础命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 ip addr show ip link show ip route show ping google.com ping -c 4 8.8.8.8 ping -i 0.5 192.168.1.1 ss -tlnp ss -tlnp | grep 80 ss -an curl https://api.example.com curl -X POST https://api.example.com/data -d '{"key":"value"}' -H "Content-Type: application/json" curl -I https://example.com curl -o file.zip https://example.com/file.zip curl -O https://example.com/file.zip wget https://example.com/file.zip wget -c https://example.com/large.iso wget -r https://example.com/docs/ nslookup google.com dig google.com dig +short google.com traceroute google.com nc -zv 192.168.1.1 22 nc -l 8080 echo "hello" | nc localhost 8000 机器 A(192.168.1.10)先监听: nc -l 8080 机器 B(192.168.1.20)连接: nc 192.168.1.10 8080 此时 TCP 连接已建立(三次握手完成),两边进入双向通信状态: 机器 B: 嗨,收到没? 机器 A: 嗨,收到没? ← 机器 A 屏幕上显示对方发的 机器 A: 收到了,兄弟! 机器 B: 收到了,兄弟! ← 机器 B 屏幕上显示回复 Ctrl+C 任一端断开,连接终止。全过程就是:监听 → 连接 → 互发消息 → 断开,没有协议限制,纯裸 TCP 管道。 sudo apt install nmapnmap 192.168.1.1 nmap -p 1-1000 192.168.1.1
11.2 SSH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ssh user@192.168.1.100 ssh user@example.com -p 2222 ssh-keygen -t ed25519 -C "your.email@example.com" ssh-keygen -t rsa -b 4096 -C "your.email@example.com" ssh-copy-id user@192.168.1.100 ssh user@host "ls -la /var/www" ssh user@host "sudo systemctl restart nginx" scp file.txt user@host:/remote/path/ scp user@host:/remote/file.txt ./local/ scp -r folder/ user@host:/remote/path/ scp -P 2222 file.txt user@host:/path/ rsync -avz ./local/ user@host:/remote/ rsync -avz --delete ./local/ user@host:/remote/ rsync -avz --exclude='node_modules' ./ user@host:/project/
11.3 防火墙 (UFW) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 sudo ufw status sudo ufw enable sudo ufw disable sudo ufw allow 22 sudo ufw allow 80/tcp sudo ufw allow 443 sudo ufw allow 3000:3010/tcp sudo ufw allow from 192.168.1.0/24 sudo ufw deny 8080 sudo ufw delete allow 8080 sudo ufw status numbered sudo ufw delete 3
11.4 查看日志与时间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 journalctl journalctl -u nginx journalctl -u nginx -f journalctl -u nginx --since today journalctl -u nginx --since "2026-06-15" --until "2026-06-16" journalctl -p err journalctl --disk-usage date date +"%Y-%m-%d %H:%M:%S" date -d "7 days ago" date -d "next Friday" timedatectl sudo timedatectl set-timezone Asia/Shanghai
12. 磁盘管理 12.1 查看磁盘信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 df -h df -h /home df -i du -sh * du -sh /home/alice du -sh --max-depth=1 /var/ du -h --max-depth=1 / 2>/dev/null | sort -h lsblk lsblk -f blkid sudo blkid /dev/sda1sudo fdisk -l
12.2 挂载 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 mount mount | grep /dev/sd sudo mount /dev/sdb1 /mnt/usb sudo mount -t ext4 /dev/sdb1 /mnt/data sudo mount -o loop ubuntu.iso /mnt/iso/sudo umount /mnt/usbsudo umount -l /mnt/usb sudo mount -a
12.3 磁盘分区与格式化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 sudo parted /dev/sdbsudo fdisk /dev/sdb sudo mkfs.ext4 /dev/sdb1 sudo mkfs.vfat /dev/sdb1 sudo mkfs.ntfs /dev/sdb1 sudo fsck /dev/sdb1
13. systemd 服务管理 13.1 基本概念 systemd 是现代 Linux 的初始化系统和服务管理器。大多数 Ubuntu 版本默认使用 systemd。
1 2 3 4 5 systemd 核心概念: unit 系统可管理的资源(服务、挂载点、定时器等) service 服务单元(.service),如 nginx.service timer 定时器单元(.timer),替代 cron target 目标单元,类似旧的运行级别
13.2 systemctl 命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 sudo systemctl start nginx sudo systemctl stop nginx sudo systemctl restart nginx sudo systemctl reload nginx sudo systemctl reload-or-restart nginx sudo systemctl enable nginx sudo systemctl disable nginx sudo systemctl is-enabled nginx sudo systemctl status nginx sudo systemctl mask nginx sudo systemctl unmask nginx systemctl list-units --type =service systemctl list-units --type =service --state=running systemctl list-unit-files systemctl list-timers systemd-analyze systemd-analyze blame systemd-analyze critical-chain journalctl -u nginx -f
13.3 创建自定义 systemd 服务 1 2 sudo vim /etc/systemd/system/myapp.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [Unit] Description =My Custom Web ApplicationAfter =network.target [Service] Type =simple User =myapp Group =myappWorkingDirectory =/opt/myappExecStart =/usr/bin/node /opt/myapp/server.jsExecStop =/bin/kill -TERM $MAINPID Restart =on -failure RestartSec =5 Environment =NODE_ENV=productionEnvironmentFile =-/etc/myapp/config NoNewPrivileges =yes PrivateTmp =yes ProtectSystem =strictProtectHome =yes [Install] WantedBy =multi-user.target
1 2 3 4 5 sudo systemctl daemon-reload sudo systemctl enable myapp sudo systemctl start myapp sudo systemctl status myapp
14. 常用命令速查表 14.1 文件和目录
命令
说明
示例
pwd
当前目录
pwd
ls -lah
详细列表
ls -lah /var/log
cd
切换目录
cd ~/Documents
mkdir -p
递归创建目录
mkdir -p a/b/c
touch
创建空文件
touch file.txt
rm -rf
强制递归删除(危险)
rm -rf /tmp/test/
cp -r
递归复制
cp -r src/ dest/
mv
移动/重命名
mv old.txt new.txt
ln -s
创建符号链接
ln -s /usr/bin/python3 py
find
查找文件
find . -name "*.log"
locate
快速查找
locate nginx.conf
14.2 文件查看与处理
命令
说明
示例
cat
显示文件
cat file.txt
less
分页查看
less large.log
head -n
头部 N 行
head -n 20 file.txt
tail -f
实时跟踪
tail -f /var/log/syslog
grep -rn
递归搜索
grep -rn "error" src/
wc -l
统计行数
wc -l file.txt
sort
排序
sort file.txt
uniq
去重
sort | uniq
sed
流编辑
sed 's/old/new/g' file
awk
文本分析
awk '{print $1}' file
diff
比较文件
diff a.txt b.txt
14.3 系统信息
命令
说明
uname -a
系统完整信息
lsb_release -a
发行版信息
uptime
运行时间+负载
free -h
内存使用
df -h
磁盘使用
du -sh *
目录大小
top / htop
进程监控
ps aux
进程列表
lscpu
CPU 信息
lspci
PCI 设备
lsusb
USB 设备
dmesg
内核消息
14.4 网络
命令
说明
ip a
IP 地址
ping -c 4
连通性测试
ss -tlnp
监听端口
curl -I
HTTP 头
wget -O
下载文件
scp
文件传输
rsync -avz
增量同步
ssh user@host
远程登录
ufw status
防火墙状态
14.5 权限与用户
命令
说明
chmod 755
修改权限
chown user:group
修改所有者
whoami
当前用户
id
用户ID和组
sudo
以root执行
passwd
修改密码
usermod -aG
添加用户到组
附录:实战练习 练习 1:文件操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 mkdir -p ~/practice/{src,docs,config,logs}cd ~/practiceecho "console.log('hello');" > src/app.jsecho "# My Project" > docs/README.mdecho '{"port": 3000}' > config/settings.jsonfind . -type f | sort cp src/app.js src/app.backup.jsln -s config/settings.json settings.jsonchmod 600 config/settings.jsonchmod 755 src/ls -la
练习 2:文本处理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 cat > ~/practice/data.log << 'EOF' 2026-06-16 10:00:01 INFO Server started on port 3000 2026-06-16 10:00:05 DEBUG Database connection established 2026-06-16 10:01:00 ERROR Connection timeout on 192.168.1.1 2026-06-16 10:01:30 INFO User alice logged in 2026-06-16 10:02:00 ERROR Disk space low on /dev/sda1 2026-06-16 10:02:30 WARN Memory usage at 85% 2026-06-16 10:03:00 INFO User bob logged in 2026-06-16 10:04:00 ERROR Connection timeout on 10.0.0.5 EOF grep "ERROR" data.log awk '{print $3}' data.log | sort | uniq -c grep -oP '\d+\.\d+\.\d+\.\d+' data.log sort data.log | head -5
练习 3:进程和系统 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 sleep 300 &sleep 600 &sleep 900 &jobs ps aux | grep sleep free -h df -h /uptime
练习 4:编写 Shell 脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 cat > ~/practice/cleanup.sh << 'SCRIPT' set -euo pipefailLOG_DIR="${1:-/tmp} " DAYS="${2:-7} " if [ ! -d "$LOG_DIR " ]; then echo "错误: 目录 $LOG_DIR 不存在" exit 1 fi echo "正在清理 $LOG_DIR 中 $DAYS 天前的 .log 文件..." COUNT=$(find "$LOG_DIR " -name "*.log" -type f -mtime +"$DAYS " | wc -l) if [ "$COUNT " -eq 0 ]; then echo "没有需要清理的文件。" exit 0 fi echo "找到 $COUNT 个文件:" find "$LOG_DIR " -name "*.log" -type f -mtime +"$DAYS " -ls read -p "确认删除这些文件? (y/N): " CONFIRMif [[ "$CONFIRM " =~ ^[Yy]$ ]]; then find "$LOG_DIR " -name "*.log" -type f -mtime +"$DAYS " -delete echo "清理完成。" else echo "已取消。" fi SCRIPT chmod +x ~/practice/cleanup.sh./cleanup.sh . 0
学习建议 :Linux 是实践性极强的技能。建议在虚拟机(如 VirtualBox + Ubuntu)或 WSL2 (Windows Subsystem for Linux) 中动手练习。遇到不熟悉的命令,先用 man command 或 command --help 查看文档,逐步建立肌肉记忆。