Linux 学习指南 —— 从小白到入门
Noyorin Lv1

一、Linux 简介

Linux 是一套免费使用和自由传播的 类 Unix 操作系统,由 Linus Torvalds 于 1991 年首次发布。它以其 稳定性、安全性、开源特性 被广泛应用于服务器、嵌入式设备、超级计算机等领域。

主流发行版

发行版 包管理器 适用场景
Ubuntu apt 桌面入门、服务器
Debian apt 稳定性要求高的服务器
CentOS / Rocky yum / dnf 企业级服务器
Arch Linux pacman 极客定制化
Kali Linux apt 安全渗透测试

Linux 哲学

Everything is a file(一切皆文件)

在 Linux 中,硬件设备、进程、网络连接等都被抽象为文件,统一通过文件描述符进行操作。这种设计使得系统管理变得极其灵活。

二、Linux 目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/
├── /bin # 基本用户命令(ls, cp, cat 等)
├── /boot # 启动文件、内核镜像
├── /dev # 设备文件(硬盘、键盘等)
├── /etc # 系统配置文件
├── /home # 用户主目录
├── /lib # 共享库文件
├── /media # 挂载的可移动设备
├── /mnt # 临时挂载点
├── /opt # 第三方软件安装目录
├── /proc # 虚拟文件系统(进程和内核信息)
├── /root # root 用户的主目录
├── /run # 运行时变量数据
├── /sbin # 系统管理员命令
├── /tmp # 临时文件(重启后清空)
├── /usr # 用户程序和数据
│ ├── /usr/bin # 用户命令
│ ├── /usr/lib # 库文件
│ └── /usr/local# 本地编译安装的软件
└── /var # 可变数据(日志、缓存等)
└── /var/log # 日志文件

三、基础命令速查

3.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
# --- 目录导航 ---
pwd # 显示当前工作目录
cd /path/to/dir # 切换目录
cd ~ # 回到 home 目录
cd - # 回到上一个目录
cd .. # 返回上级目录

# --- 列出文件 ---
ls # 列出当前目录内容
ls -l # 详细列表(权限、大小、时间)
ls -la # 显示所有文件(含隐藏文件)
ls -lh # 人类可读的文件大小
ls -lt # 按修改时间排序

# --- 文件操作 ---
touch file.txt # 创建空文件 / 更新文件时间戳
mkdir new_folder # 创建目录
mkdir -p a/b/c # 递归创建多层目录
cp source dest # 复制文件
cp -r source_dir dest_dir # 递归复制目录
mv old_name new_name # 移动 / 重命名
rm file.txt # 删除文件
rm -r folder/ # 递归删除目录
rm -rf folder/ # 强制递归删除(危险!)

# --- 文件查看 ---
cat file.txt # 查看文件全部内容
less file.txt # 分页查看(按 q 退出)
head -n 20 file.txt # 查看前 20 行
tail -n 20 file.txt # 查看后 20 行
tail -f log.txt # 实时跟踪日志文件

3.2 文件搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# find - 按条件查找文件
find /path -name "*.log" # 按名称查找
find /path -type f -size +100M # 查找大于100MB的文件
find /path -type f -mtime -7 # 最近7天修改过的文件
find /path -name "*.tmp" -delete # 查找并删除

# grep - 按内容搜索
grep "error" file.txt # 搜索文本内容
grep -r "TODO" ./src/ # 递归搜索目录
grep -i "error" file.txt # 忽略大小写
grep -n "error" file.txt # 显示行号
grep -v "debug" file.txt # 反向匹配(排除)
grep -E "error|warning" file.txt # 正则表达式(扩展)

# 管道组合
ps aux | grep nginx # 查找 nginx 进程
cat log.txt | grep "ERROR" | wc -l # 统计错误数量
history | grep "git" # 查找历史命令

3.3 文件权限

1
2
3
4
5
6
7
8
9
10
11
# Linux 权限模型
# r(4) w(2) x(1) → 用户 | 用户组 | 其他人
# drwxr-xr-x → d=目录, rwx=所有者, r-x=用户组, r-x=其他人

chmod 755 script.sh # rwxr-xr-x
chmod 644 file.txt # rw-r--r--
chmod +x script.sh # 添加执行权限
chmod u+w file.txt # 给所有者添加写权限

chown user:group file.txt # 修改所有者:用户组
chown -R user:group dir/ # 递归修改目录下所有文件

3.4 压缩与解压

1
2
3
4
5
6
7
8
9
10
11
# tar
tar -cvf archive.tar files/ # 打包(不压缩)
tar -xvf archive.tar # 解包
tar -czvf archive.tar.gz files/ # 打包并用 gzip 压缩
tar -xzvf archive.tar.gz # 解压 .tar.gz
tar -cjvf archive.tar.bz2 files/ # 打包并用 bzip2 压缩
tar -xjvf archive.tar.bz2 # 解压 .tar.bz2

# zip / unzip
zip -r archive.zip folder/ # 压缩为 zip
unzip archive.zip # 解压 zip

3.5 磁盘与系统信息

1
2
3
4
5
6
7
8
9
df -h                   # 查看磁盘使用情况(人类可读)
du -sh folder/ # 查看目录所占空间
du -h --max-depth=1 # 查看当前目录下各子目录大小
free -h # 查看内存使用情况
uptime # 系统运行时间及负载
uname -a # 查看系统内核信息
lsb_release -a # 查看发行版信息
top # 实时进程监控
htop # 增强版 top(需安装)

四、用户与用户组管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# --- 用户管理 ---
sudo useradd -m username # 创建用户(同时创建 home 目录)
sudo passwd username # 设置 / 修改用户密码
sudo userdel -r username # 删除用户(同时删除 home 目录)
su - username # 切换用户
id username # 查看用户 UID/GID 信息
whoami # 查看当前用户名
w # 查看当前登录用户

# --- 用户组管理 ---
sudo groupadd groupname # 创建用户组
sudo usermod -aG groupname username # 将用户加入用户组
groups username # 查看用户所属的所有组

# --- 权限提升 ---
sudo command # 以 root 权限执行命令
sudo -i # 切换到 root 用户
visudo # 安全编辑 /etc/sudoers

五、进程管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# --- 查看进程 ---
ps aux # 查看所有进程的详细信息
ps aux --sort=-%mem # 按内存占用降序排列
pgrep nginx # 根据名称查找进程 PID
pidof nginx # 同上

# --- 后台任务 ---
command & # 将命令放入后台运行
jobs # 查看后台任务列表
fg %1 # 将后台任务调回前台
bg %1 # 让暂停的任务在后台继续
nohup command & # 后台运行,登出后不终止
disown # 将后台任务与终端解绑

# --- 终止进程 ---
kill PID # 向进程发送 TERM 信号(优雅终止)
kill -9 PID # 强制终止进程(SIGKILL)
killall process_name # 按名称批量终止
pkill -f pattern # 按命令名模式匹配终止

# --- 优先级 ---
nice -n 10 command # 以较低优先级运行(-20 到 19)
renice -n 5 -p PID # 修改运行中进程的优先级

信号说明

信号 编号 含义
SIGHUP 1 挂起(重载配置)
SIGINT 2 中断(Ctrl+C)
SIGTERM 15 终止(默认)
SIGKILL 9 强制终止(不可捕获)

六、文本处理三剑客

6.1 grep —— 文本搜索

1
2
3
4
5
6
7
8
grep "pattern" file.txt                         # 基本搜索
grep -i "pattern" file.txt # 忽略大小写搜索
grep -c "pattern" file.txt # 统计匹配行数
grep -E "[0-9]{3}-[0-9]{4}" file.txt # 扩展正则
grep -A 3 "error" log.txt # 显示匹配行及后3行
grep -B 2 "error" log.txt # 显示匹配行及前2行
grep -C 3 "error" log.txt # 显示匹配行及前后各3行
grep -v "^#" config.conf # 排除注释行

6.2 sed —— 流编辑器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 替换
sed 's/old/new/' file.txt # 替换每行第一个匹配
sed 's/old/new/g' file.txt # 全局替换
sed -i 's/old/new/g' file.txt # 直接修改文件
sed 's/old/new/2' file.txt # 替换每行第二个匹配

# 删除
sed '3d' file.txt # 删除第3行
sed '/^$/d' file.txt # 删除空行
sed '2,5d' file.txt # 删除第2到5行
sed '/^#/d' file.txt # 删除注释行

# 插入/追加
sed '2i\新行内容' file.txt # 在第2行前插入
sed '2a\新行内容' file.txt # 在第2行后追加

# 提取
sed -n '5,10p' file.txt # 打印第5到10行

6.3 awk —— 文本分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 按列处理
awk '{print $1, $3}' file.txt # 打印第1列和第3列
awk -F: '{print $1, $7}' /etc/passwd # 指定冒号为分隔符

# 条件过滤
awk '$3 > 1000' data.txt # 第3列大于1000的行
awk '/error/ {print $0}' log.txt # 匹配正则

# 统计计算
awk '{sum+=$2} END {print "Sum:", sum}' data.txt# 求第2列总和
awk '{count++} END {print count}' file.txt # 统计行数

# 实战示例
# 统计每个IP的访问次数
awk '{ip[$1]++} END {for(i in ip) print i, ip[i]}' access.log | sort -k2 -nr

七、网络相关

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
# --- 网络状态 ---
ip addr show # 查看IP地址(推荐)
ifconfig # 查看网络接口(旧命令)
ip route show # 查看路由表
ping -c 4 google.com # 发送4个ICMP包
ss -tlnp # 查看TCP监听端口(推荐,替代 netstat)
ss -tunap # 查看所有TCP/UDP连接

# --- 下载文件 ---
curl -O https://example.com/file # 下载文件(保留原名)
curl -L https://example.com # 跟随重定向
curl -I https://example.com # 仅获取响应头
curl -X POST -d "key=val" url # 发送 POST 请求

wget https://example.com/file # 下载文件
wget -c url # 断点续传

# --- SSH ---
ssh user@host # SSH 连接
ssh -p 2222 user@host # 指定端口
ssh -i ~/.ssh/mykey user@host # 指定私钥

# --- 文件传输 ---
scp file.txt user@host:/path/ # 上传文件到远程
scp user@host:/path/file.txt ./ # 从远程下载文件
rsync -avz src/ dest/ # 同步目录(增量传输)

# --- 防火墙 (UFW) ---
sudo ufw enable # 启用防火墙
sudo ufw status # 查看防火墙状态
sudo ufw allow 22/tcp # 开放 22 端口
sudo ufw allow 80,443/tcp # 开放 HTTP/HTTPS
sudo ufw deny 23 # 阻止 23 端口
sudo ufw delete allow 22/tcp # 删除规则

八、Shell 脚本基础

8.1 第一个脚本

1
2
3
4
5
6
#!/bin/bash
# 这是一个简单的 Shell 脚本

echo "Hello, $(whoami)!"
echo "当前日期: $(date +%Y-%m-%d)"
echo "当前目录: $(pwd)"

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
#!/bin/bash

# 变量定义(等号左右不能有空格)
name="Alice"
age=25

# 使用变量
echo "姓名: ${name}"
echo "年龄: ${age}"

# 只读变量
readonly PI=3.14159

# 删除变量
unset age

# 特殊变量
echo "脚本名: $0"
echo "第1个参数: $1"
echo "参数个数: $#"
echo "所有参数: $@"
echo "进程ID: $$"
echo "上一条命令退出码: $?"

8.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
39
40
41
42
43
#!/bin/bash

# if-else 语句
read -p "请输入一个数字: " num

if [ $num -gt 10 ]; then
echo "大于 10"
elif [ $num -eq 10 ]; then
echo "等于 10"
else
echo "小于 10"
fi

# 文件测试
if [ -f "/etc/passwd" ]; then
echo "文件存在"
fi

if [ -d "/home" ]; then
echo "目录存在"
fi

# 字符串比较
str="hello"
if [ "$str" = "hello" ]; then
echo "字符串相等"
fi

if [ -z "$str" ]; then
echo "字符串为空"
fi

# 常用测试条件:
# [ -f file ] 文件是否存在且为普通文件
# [ -d dir ] 目录是否存在
# [ -x file ] 文件是否可执行
# [ -r file ] 文件是否可读
# [ -z str ] 字符串是否为空
# [ -n str ] 字符串是否非空
# [ num1 -eq num2 ] 等于
# [ num1 -ne num2 ] 不等于
# [ num1 -gt num2 ] 大于
# [ num1 -lt num2 ] 小于

8.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
#!/bin/bash

# for 循环
echo "=== for 循环 ==="
for i in {1..5}; do
echo "第 $i 次循环"
done

# 遍历数组
fruits=("苹果" "香蕉" "橘子" "葡萄")
for fruit in "${fruits[@]}"; do
echo "水果: $fruit"
done

# while 循环
echo "=== while 循环 ==="
count=1
while [ $count -le 5 ]; do
echo "计数: $count"
((count++))
done

# 读取文件每一行
while IFS= read -r line; do
echo "行内容: $line"
done < /etc/hosts

8.5 函数

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
#!/bin/bash

# 定义函数
greet() {
local name=$1
echo "你好, $name!"
}

# 调用函数
greet "小明"

# 带返回值的函数
add() {
local a=$1
local b=$2
echo $((a + b)) # 用 echo 返回计算结果
}

result=$(add 3 5)
echo "3 + 5 = $result"

# 检查函数执行状态
check_file() {
if [ -f "$1" ]; then
return 0 # 成功
else
return 1 # 失败
fi
}

if check_file "/etc/hosts"; then
echo "文件存在"
fi

九、软件包管理

9.1 Debian / Ubuntu 系(APT)

1
2
3
4
5
6
7
8
9
10
11
sudo apt update                      # 更新软件包列表
sudo apt upgrade # 升级所有已安装的软件包
sudo apt full-upgrade # 升级并处理依赖变更
sudo apt install package_name # 安装软件包
sudo apt remove package_name # 卸载软件包
sudo apt purge package_name # 卸载并删除配置文件
sudo apt autoremove # 清理不再需要的依赖
sudo apt search keyword # 搜索软件包
apt show package_name # 查看软件包信息
apt list --installed # 列出已安装的软件包
sudo apt edit-sources # 编辑软件源列表

9.2 Red Hat / CentOS 系(YUM / DNF)

1
2
3
4
5
6
7
8
9
10
11
# YUM (CentOS 7 及更早)
sudo yum install package_name
sudo yum update
sudo yum remove package_name

# DNF (CentOS 8+, Fedora)
sudo dnf install package_name
sudo dnf update
sudo dnf remove package_name
sudo dnf search keyword
sudo dnf autoremove

9.3 源码编译安装

1
2
3
4
# 典型的三步走
./configure --prefix=/usr/local/myapp # 配置安装路径
make # 编译
sudo make install # 安装

十、systemd 服务管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 服务管理
sudo systemctl start nginx # 启动服务
sudo systemctl stop nginx # 停止服务
sudo systemctl restart nginx # 重启服务
sudo systemctl reload nginx # 重载配置(不中断连接)
sudo systemctl status nginx # 查看服务状态
sudo systemctl enable nginx # 设置开机自启
sudo systemctl disable nginx # 取消开机自启

# 查看日志
journalctl -u nginx # 查看指定服务的日志
journalctl -u nginx --since today # 查看今天的日志
journalctl -u nginx -f # 实时跟踪日志
journalctl -p err # 只显示错误级别日志

# 查看系统状态
systemctl list-units --type=service # 列出所有服务
systemctl list-unit-files # 查看所有单元的启用状态

编写简单的 systemd 服务文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# /etc/systemd/system/myapp.service
[Unit]
Description=My Custom Application
After=network.target

[Service]
Type=simple
User=myuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/start.sh
ExecStop=/opt/myapp/bin/stop.sh
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
1
2
sudo systemctl daemon-reload         # 重载服务文件
sudo systemctl enable --now myapp # 启用并立即启动

十一、常用工具推荐

工具 用途 安装命令
htop 交互式进程监控 sudo apt install htop
ncdu 磁盘空间分析 sudo apt install ncdu
tmux 终端多路复用 sudo apt install tmux
fzf 模糊搜索 sudo apt install fzf
ripgrep (rg) 快速文本搜索 sudo apt install ripgrep
bat 带语法高亮的 cat sudo apt install bat
tldr 命令简化手册 sudo apt install tldr
jq JSON 处理 sudo apt install jq
nc (netcat) 网络调试瑞士军刀 sudo apt install netcat-openbsd
lsof 查看打开的文件 sudo apt install lsof
nmap 网络扫描 sudo apt install nmap

十二、常用快捷键

快捷键 功能
Ctrl + C 终止当前进程
Ctrl + Z 挂起当前进程
Ctrl + D EOF(退出终端/shell)
Ctrl + L 清屏
Ctrl + R 历史命令搜索
Ctrl + A 光标移到行首
Ctrl + E 光标移到行尾
Ctrl + U 删除光标前的内容
Ctrl + W 删除光标前的一个单词
Tab 自动补全

十三、实用脚本集合

13.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
#!/bin/bash
echo "==================== 系统信息 ===================="
echo "主机名: $(hostname)"
echo "系统版本: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "内核版本: $(uname -r)"
echo "运行时间: $(uptime -p)"

echo "==================== CPU 信息 ===================="
echo "CPU: $(lscpu | grep 'Model name' | cut -d':' -f2 | xargs)"
echo "CPU 核心数: $(nproc)"
echo "CPU 负载: $(uptime | awk -F'load average:' '{print $2}')"

echo "==================== 内存状态 ===================="
free -h

echo "==================== 磁盘状态 ===================="
df -h | grep -v tmpfs

echo "==================== 网络状态 ===================="
echo "IP 地址:"
ip addr show | grep 'inet ' | grep -v 127.0.0.1

echo "==================== 登录用户 ===================="
who

echo "==================== 重启记录 ===================="
last reboot | head -5

13.2 日志清理脚本

1
2
3
4
5
6
7
8
#!/bin/bash
# 清理 30 天前的日志文件

LOG_DIR="/var/log/myapp"
RETENTION_DAYS=30

find "$LOG_DIR" -name "*.log" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;
echo "已清理 $(date): 删除了 $RETENTION_DAYS 天前的日志文件" >> /var/log/cleanup.log

13.3 批量重命名脚本

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 将当前目录下所有 .txt 文件重命名为 .md 文件

for file in *.txt; do
if [ -f "$file" ]; then
mv "$file" "${file%.txt}.md"
echo "重命名: $file -> ${file%.txt}.md"
fi
done

十四、推荐学习路径

1
2
3
4
5
Linux 基础入门  →  命令行熟练使用  →  文件系统与权限管理

Shell 脚本编程 ← 进程与服务管理 ← 网络配置与调试
↓ ↓
系统性能调优 ← 安全加固 ← 自动化运维 → 高级 Linux 运维

学习资源推荐

  1. Linux Journey — 交互式 Linux 入门教程
  2. The Linux Command Line — 经典命令行书籍(免费在线阅读)
  3. 鸟哥的 Linux 私房菜 — 中文学习 Linux 的经典著作
  4. explainshell.com — 在线解析 shell 命令
  5. tldr.sh — 实用的命令速查手册

十五、常见问题与排错

15.1 忘记 root 密码

1
2
3
4
5
6
# 1. 重启系统,在 GRUB 引导界面按 'e' 进入编辑模式
# 2. 找到以 'linux' 开头的行,在末尾添加: init=/bin/bash
# 3. 按 Ctrl+X 启动进入单用户模式
# 4. 执行: mount -o remount,rw /
# 5. 执行: passwd root
# 6. 重启: reboot -f

15.2 SSH 连接被拒绝

1
2
3
4
5
6
7
8
9
10
11
# 检查 ssh 服务是否运行
sudo systemctl status sshd

# 检查端口是否监听
ss -tln | grep 22

# 检查防火墙
sudo ufw status

# 检查 /etc/ssh/sshd_config 配置
sudo grep -E "^(Port|PermitRootLogin|PasswordAuthentication)" /etc/ssh/sshd_config

15.3 磁盘空间不足

1
2
3
4
5
6
7
8
9
10
11
# 快速定位大文件
sudo du -ah / | sort -rh | head -20

# 查找并删除大日志文件
find /var/log -type f -name "*.log" -size +100M

# 清理 apt 缓存
sudo apt clean

# 清理 journal 日志
sudo journalctl --vacuum-size=500M

总结: Linux 的学习是一个循序渐进的过程。建议在虚拟机或云服务器上搭建一个 Linux 环境,每天坚持使用命令行操作,遇到不懂的善用 man--help 和搜索引擎。动手实践是最好的学习方式


本文持续更新中,如有错误或建议,欢迎留言讨论。