一、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 ~ 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 head -n 20 file.txt tail -n 20 file.txt 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 /path -name "*.log" find /path -type f -size +100M find /path -type f -mtime -7 find /path -name "*.tmp" -delete
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 cat log.txt | grep "ERROR" | wc -l history | grep "git"
|
3.3 文件权限
1 2 3 4 5 6 7 8 9 10 11
|
chmod 755 script.sh chmod 644 file.txt 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 -cvf archive.tar files/ tar -xvf archive.tar tar -czvf archive.tar.gz files/ tar -xzvf archive.tar.gz tar -cjvf archive.tar.bz2 files/ tar -xjvf archive.tar.bz2
zip -r archive.zip folder/ unzip archive.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
|
四、用户与用户组管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| sudo useradd -m username sudo passwd username sudo userdel -r username su - username id username whoami w
sudo groupadd groupname sudo usermod -aG groupname username groups username
sudo command sudo -i visudo
|
五、进程管理
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 pidof nginx
command & jobs fg %1 bg %1 nohup command & disown
kill PID kill -9 PID killall process_name pkill -f pattern
nice -n 10 command 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 grep -B 2 "error" log.txt grep -C 3 "error" log.txt 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 sed '/^$/d' file.txt sed '2,5d' file.txt sed '/^#/d' file.txt
sed '2i\新行内容' file.txt sed '2a\新行内容' file.txt
sed -n '5,10p' file.txt
|
6.3 awk —— 文本分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| awk '{print $1, $3}' file.txt awk -F: '{print $1, $7}' /etc/passwd
awk '$3 > 1000' data.txt awk '/error/ {print $0}' log.txt
awk '{sum+=$2} END {print "Sum:", sum}' data.txt# 求第2列总和 awk '{count++} END {print count}' file.txt
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 ifconfig ip route show ping -c 4 google.com ss -tlnp ss -tunap
curl -O https://example.com/file curl -L https://example.com curl -I https://example.com curl -X POST -d "key=val" url
wget https://example.com/file wget -c url
ssh user@host 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/
sudo ufw enable sudo ufw status sudo ufw allow 22/tcp sudo ufw allow 80,443/tcp sudo ufw deny 23 sudo ufw delete allow 22/tcp
|
八、Shell 脚本基础
8.1 第一个脚本
1 2 3 4 5 6
| #!/bin/bash
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
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
|
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
echo "=== for 循环 ===" for i in {1..5}; do echo "第 $i 次循环" done
fruits=("苹果" "香蕉" "橘子" "葡萄") for fruit in "${fruits[@]}"; do echo "水果: $fruit" done
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)) }
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
| sudo yum install package_name sudo yum update sudo yum remove package_name
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
| [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
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
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 运维
|
学习资源推荐
- Linux Journey — 交互式 Linux 入门教程
- The Linux Command Line — 经典命令行书籍(免费在线阅读)
- 鸟哥的 Linux 私房菜 — 中文学习 Linux 的经典著作
- explainshell.com — 在线解析 shell 命令
- tldr.sh — 实用的命令速查手册
十五、常见问题与排错
15.1 忘记 root 密码
15.2 SSH 连接被拒绝
1 2 3 4 5 6 7 8 9 10 11
| sudo systemctl status sshd
ss -tln | grep 22
sudo ufw status
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
sudo apt clean
sudo journalctl --vacuum-size=500M
|
总结: Linux 的学习是一个循序渐进的过程。建议在虚拟机或云服务器上搭建一个 Linux 环境,每天坚持使用命令行操作,遇到不懂的善用 man、--help 和搜索引擎。动手实践是最好的学习方式。
本文持续更新中,如有错误或建议,欢迎留言讨论。