#少女前線 416とM16A1のあの頃 - 反骨MAX
4124 字
21 分钟
Linux 学习指南 —— 从小白到入门
一、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 目录结构
/├── /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 文件和目录操作
# --- 目录导航 ---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 文件搜索
# 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 文件权限
# Linux 权限模型# r(4) w(2) x(1) → 用户 | 用户组 | 其他人# drwxr-xr-x → d=目录, rwx=所有者, r-x=用户组, r-x=其他人
chmod 755 script.sh # rwxr-xr-xchmod 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 压缩与解压
# tartar -cvf archive.tar files/ # 打包(不压缩)tar -xvf archive.tar # 解包tar -czvf archive.tar.gz files/ # 打包并用 gzip 压缩tar -xzvf archive.tar.gz # 解压 .tar.gztar -cjvf archive.tar.bz2 files/ # 打包并用 bzip2 压缩tar -xjvf archive.tar.bz2 # 解压 .tar.bz2
# zip / unzipzip -r archive.zip folder/ # 压缩为 zipunzip archive.zip # 解压 zip3.5 磁盘与系统信息
df -h # 查看磁盘使用情况(人类可读)du -sh folder/ # 查看目录所占空间du -h --max-depth=1 # 查看当前目录下各子目录大小free -h # 查看内存使用情况uptime # 系统运行时间及负载uname -a # 查看系统内核信息lsb_release -a # 查看发行版信息top # 实时进程监控htop # 增强版 top(需安装)四、用户与用户组管理
# --- 用户管理 ---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五、进程管理
# --- 查看进程 ---ps aux # 查看所有进程的详细信息ps aux --sort=-%mem # 按内存占用降序排列pgrep nginx # 根据名称查找进程 PIDpidof 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 —— 文本搜索
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 —— 流编辑器
# 替换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 —— 文本分析
# 按列处理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七、网络相关
# --- 网络状态 ---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/HTTPSsudo ufw deny 23 # 阻止 23 端口sudo ufw delete allow 22/tcp # 删除规则八、Shell 脚本基础
8.1 第一个脚本
#!/bin/bash# 这是一个简单的 Shell 脚本
echo "Hello, $(whoami)!"echo "当前日期: $(date +%Y-%m-%d)"echo "当前目录: $(pwd)"8.2 变量
#!/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 条件判断
#!/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 循环
#!/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=1while [ $count -le 5 ]; do echo "计数: $count" ((count++))done
# 读取文件每一行while IFS= read -r line; do echo "行内容: $line"done < /etc/hosts8.5 函数
#!/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)
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)
# YUM (CentOS 7 及更早)sudo yum install package_namesudo yum updatesudo yum remove package_name
# DNF (CentOS 8+, Fedora)sudo dnf install package_namesudo dnf updatesudo dnf remove package_namesudo dnf search keywordsudo dnf autoremove9.3 源码编译安装
# 典型的三步走./configure --prefix=/usr/local/myapp # 配置安装路径make # 编译sudo make install # 安装十、systemd 服务管理
# 服务管理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 服务文件
[Unit]Description=My Custom ApplicationAfter=network.target
[Service]Type=simpleUser=myuserWorkingDirectory=/opt/myappExecStart=/opt/myapp/bin/start.shExecStop=/opt/myapp/bin/stop.shRestart=on-failureRestartSec=5
[Install]WantedBy=multi-user.targetsudo 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 服务器一键巡检脚本
#!/bin/bashecho "==================== 系统信息 ===================="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 -513.2 日志清理脚本
#!/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.log13.3 批量重命名脚本
#!/bin/bash# 将当前目录下所有 .txt 文件重命名为 .md 文件
for file in *.txt; do if [ -f "$file" ]; then mv "$file" "${file%.txt}.md" echo "重命名: $file -> ${file%.txt}.md" fidone十四、推荐学习路径
Linux 基础入门 → 命令行熟练使用 → 文件系统与权限管理 ↓Shell 脚本编程 ← 进程与服务管理 ← 网络配置与调试 ↓ ↓系统性能调优 ← 安全加固 ← 自动化运维 → 高级 Linux 运维学习资源推荐
- Linux Journey — 交互式 Linux 入门教程
- The Linux Command Line — 经典命令行书籍(免费在线阅读)
- 鸟哥的 Linux 私房菜 — 中文学习 Linux 的经典著作
- explainshell.com — 在线解析 shell 命令
- tldr.sh — 实用的命令速查手册
十五、常见问题与排错
15.1 忘记 root 密码
# 1. 重启系统,在 GRUB 引导界面按 'e' 进入编辑模式# 2. 找到以 'linux' 开头的行,在末尾添加: init=/bin/bash# 3. 按 Ctrl+X 启动进入单用户模式# 4. 执行: mount -o remount,rw /# 5. 执行: passwd root# 6. 重启: reboot -f15.2 SSH 连接被拒绝
# 检查 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_config15.3 磁盘空间不足
# 快速定位大文件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和搜索引擎。动手实践是最好的学习方式。
本文持续更新中,如有错误或建议,欢迎留言讨论。