适用人群 :Linux 初学者、从 Windows 转向 Linux 的开发者、准备面试的应届生
目标 :掌握日常开发/运维最常用的 40+ 个命令,理解其背后的设计哲学
阅读建议 :前半部分为知识讲解,后半部分为分级实战任务,建议边读边操作
预估时长:完整阅读 + 动手实践约 2-3 小时
目录
- 文件系统导航:你在哪?周围有什么?
- 文件创建与编辑:如何创建和修改内容
- 权限管理:谁能做什么
- 进程管理:谁在跑怎么停
- 网络管理:连通性端口与防火墙
- 压缩与包管理:打包解压安装软件
- 用户与组:谁是谁属于哪个组
- 分级实战任务
- 面试高频考点与易错点
- 速查表
一、文件系统导航:你在哪?周围有什么?
1.1 pwd ------ 定位当前位置
bash
pwd
# 输出:/home/dev/projects
作用 :Print Working Directory,显示当前所在目录的绝对路径。
💡 技巧 :在脚本中常用
$(pwd)获取当前路径,用于生成日志路径或备份目录。
1.2 ls ------ 查看目录内容
bash
ls # 简单列出文件名
ls -l # 详细列表(权限、大小、时间)⭐ 最常用
ls -la # 显示所有文件,包括隐藏文件(以 . 开头)
ls -lh # 文件大小带人类可读单位(K、M、G)
ls -ltr # 按时间排序,最新修改的文件在最后
ls -R # 递归列出子目录内容
ls -l 输出深度解读(面试常考):
bash
drwxr-xr-x 2 dev dev 4096 Jul 12 10:00 project
-rw-r--r-- 1 dev dev 1234 Jul 12 11:30 note.txt
| 位置 | 含义 |
|---|---|
d / - |
文件类型:d=目录,-=普通文件,l=软链接 |
rwxr-xr-x |
权限位:所有者/组/其他人 |
2 |
硬链接数(目录默认为 2,因为包含 . 和 ..) |
dev |
文件所有者 |
dev |
文件所属组 |
4096 |
文件大小(字节) |
Jul 12 10:00 |
最后修改时间 |
project |
文件名 |
1.3 cd ------ 切换目录
bash
cd project # 进入子目录(相对路径)
cd .. # 返回上一级
cd ../.. # 返回上两级
cd ~ # 回到家目录(/home/用户名)
cd - # 返回刚才所在的目录(来回切换神器)
cd /var/log # 绝对路径(从根目录开始)
⚠️ 注意 :Linux 路径区分大小写 。
CD project会报错command not found,因为cd是小写的。
1.4 mkdir ------ 创建目录
bash
mkdir project # 创建单个目录
mkdir -p project/src/api # 递归创建多级目录(-p = parents)
💡 技巧 :
mkdir -p是写脚本时的安全写法,即使父目录已存在也不会报错。
1.5 cp ------ 复制文件/目录
bash
cp note.txt note_backup.txt # 复制文件
cp -r project project_backup # 复制目录(-r = recursive)
cp -i note.txt /tmp/ # 覆盖前提示(interactive)
cp -v file.txt backup/ # 显示详细过程(verbose)
1.6 mv ------ 移动/重命名
bash
mv note.txt notes/ # 移动文件
mv old_name.txt new_name.txt # 重命名(同目录内移动)
mv -i old.txt new.txt # 覆盖前提示
💡 设计哲学 :在 Linux 中,重命名本质上就是同目录内的移动 。没有单独的
rename命令(虽然存在,但mv更常用)。
1.7 rm ------ 删除(⚠️ 高危命令)
bash
rm file.txt # 删除文件
rm -r project/ # 递归删除目录
rm -rf project/ # 强制递归删除(-f = force)
绝对不要执行的命令:
bash
rm -rf / # 删除根目录下所有内容 = 系统毁灭
rm -rf /* # 同上
rm -rf ./* # 当前目录下全部删除(若路径解析错误会删到根目录)
安全习惯:
- 删目录前先用
ls确认内容 - 使用
rm -ri 目录/(交互式,逐个确认) - 或者用
mv移到/tmp代替直接删除
1.8 find ------ 查找文件
bash
find . -name "*.cs" # 当前目录及子目录下找所有 .cs 文件
find /home/dev -name "Program.cs" # 指定路径查找
find . -type d -name "bin" # 查找名为 bin 的目录(-type d)
find . -type f -mtime -1 # 查找 1 天内修改过的文件(-type f)
find . -name "*.log" -delete # 找到并删除(慎用)
find . -size +100M # 查找大于 100MB 的文件
1.9 locate ------ 快速查找(基于数据库)
bash
locate Program.cs
特点 :比 find 快得多,因为它查询的是预先构建的索引数据库。
坑:刚创建的文件可能找不到,因为数据库未更新。可手动更新:
bash
sudo updatedb
find |
locate |
|---|---|
| 实时搜索文件系统 | 搜索预建数据库 |
| 速度慢但结果准确 | 速度快但可能遗漏新文件 |
| 支持复杂条件(大小、时间、权限) | 仅支持按名称搜索 |
| 不需要 root 权限(搜索自己的文件) | 需要 updatedb 更新数据库 |
二、文件创建与编辑:如何创建和修改内容?
2.1 创建文件的几种方式
| 命令 | 适用场景 | 示例 |
|---|---|---|
touch |
创建空文件(最常用) | touch appsettings.json |
echo > |
创建文件并写入内容(覆盖) | echo "hello" > file.txt |
echo >> |
追加内容到文件(不存在则创建) | echo "line2" >> file.txt |
nano / vim |
创建并编辑文件 | nano Program.cs |
2.2 touch 详解
bash
touch hello.txt # 创建空文件
touch a.txt b.txt c.txt # 批量创建多个空文件
touch -t 202401011200 file # 创建文件并指定修改时间(少见)
特点 :如果文件已存在,touch 只更新其修改时间戳,不覆盖内容。常用于:
- 创建空配置文件占位
- 在编译系统中触发重新构建(更新
.c文件时间戳会让make重新编译)
2.3 echo 重定向
bash
# > 覆盖写入(文件不存在则创建,存在则清空重写)
echo '{"name":"dev"}' > appsettings.json
# >> 追加写入(文件不存在则创建,存在则追加到末尾)
echo "log line 1" >> app.log
echo "log line 2" >> app.log
⚠️ 注意 :
>是覆盖,>>是追加。用错会丢失数据。在脚本中尤其要小心。
2.4 cat ------ 一次性输出全部内容
bash
cat appsettings.json
cat -n appsettings.json # 显示行号(-n = number)
cat file1.txt file2.txt > merged.txt # 合并多个文件
适用场景:小文件(几十行以内)。大文件会刷屏,看不清。
2.5 less ------ 分页查看(大文件神器)
bash
less /var/log/syslog
操作键位:
| 按键 | 功能 |
|---|---|
空格 / PageDown |
下一页 |
PageUp / b |
上一页 |
/关键字 |
搜索(如 /error),按 n 下一个匹配,N 上一个 |
G |
跳到文件末尾 |
g |
跳到文件开头 |
q |
退出 |
特点 :只加载当前页到内存,看 10GB 日志也不卡。这是 less 比 cat 看大文件的优势所在。
2.6 head / tail ------ 看开头/结尾
bash
head -n 20 log.txt # 看前 20 行
tail -n 20 log.txt # 看后 20 行
tail -f /var/log/nginx/access.log # 实时追踪(-f = follow),日志滚动时自动刷新
tail -f 是运维排错必备,看实时日志时必用。
2.7 nano ------ 简单编辑器(新手友好)
bash
nano hello.txt
操作:
- 直接打字编辑
Ctrl + O:保存(按回车确认)Ctrl + X:退出- 底部有提示菜单,不用背命令
适合:临时改个小文件,比如改一下 IP 配置。
2.8 vim ------ 专业编辑器(难学但必会)
bash
vim nginx.conf
三种模式:
css
┌─────────────────────────────────────────┐
│ 普通模式 (Normal) │
│ 按 i → 进入插入模式 │
│ 按 : → 进入命令模式 │
│ 按 Esc → 回到普通模式 │
├─────────────────────────────────────────┤
│ 插入模式 (Insert) │
│ 可以打字编辑 │
│ 按 Esc → 回到普通模式 │
├─────────────────────────────────────────┤
│ 命令模式 (Command) │
│ :wq 保存退出 │
│ :q! 不保存退出 │
│ /关键字 搜索 │
└─────────────────────────────────────────┘
生存命令(记住这 6 个就够了):
| 操作 | 命令 |
|---|---|
| 开始编辑 | 按 i |
| 保存退出 | Esc → :wq → 回车 |
| 不保存退出 | Esc → :q! → 回车 |
| 搜索 | Esc → /关键字 → 回车,按 n 下一个 |
| 删除一行 | Esc 后按 dd |
| 撤销 | Esc 后按 u |
💡 为什么必须会 vim? 在服务器上没有图形界面,很多时候
nano没安装,但vim几乎一定存在。这是救命的技能。
三、权限管理:谁能做什么?
3.1 ls -l 权限位深度解读
lua
-rwxr-xr-- 1 dev dev 1234 Jul 12 10:00 script.sh
│└┬┘└┬┘└┬┘
│ │ │ └── 其他人权限:r--(只读)
│ │ └───── 所属组权限:r-x(读+执行)
│ └──────── 所有者权限:rwx(读+写+执行)
└────────── 文件类型:- 普通文件,d 目录,l 链接
3.2 chmod ------ 修改权限
数字法(最常用,必须背熟):
| 数字 | 权限 | 二进制 | 含义 |
|---|---|---|---|
| 7 | rwx | 111 | 读+写+执行 |
| 6 | rw- | 110 | 读+写 |
| 5 | r-x | 101 | 读+执行 |
| 4 | r-- | 100 | 只读 |
| 0 | --- | 000 | 无权限 |
bash
chmod 755 script.sh # 所有者全能,组和其他人读+执行
chmod 644 file.txt # 所有者读写,其他人只读(文档默认)
chmod 600 secret.key # 只有所有者能看(密钥文件)
chmod +x script.sh # 给所有人加执行权限(常用)
chmod -x script.sh # 去掉执行权限
场景对照表:
| 文件类型 | 推荐权限 | 原因 |
|---|---|---|
| 普通脚本 | 755 | 你需要编辑,其他人能运行 |
| 配置文件 | 644 | 你需要编辑,其他人只能看 |
| 密钥/密码文件 | 600 | 只有你能看,防止泄露 |
| 目录 | 755 | 你需要在里面增删文件,其他人能进入和读取 |
| 上传目录 | 755 或 775 | Web 服务器需要写入权限 |
3.3 chown ------ 修改所有者
bash
sudo chown root file.txt # 所有者改为 root
sudo chown dev:dev file.txt # 所有者改为 dev,组也改为 dev
sudo chown -R dev:dev projects/ # -R = Recursive,递归改整个目录
场景 :你从 root 用户复制了一些文件到 dev 的家目录,发现 dev 无法编辑,就需要 chown。
3.4 特殊权限(了解即可)
bash
chmod u+s script.sh # SUID:执行时临时获得文件所有者权限
chmod g+s directory/ # SGID:目录内新建文件继承所属组
chmod +t directory/ # Sticky:目录内文件只能由所有者删除(如 /tmp)
常见应用:
/usr/bin/passwd有 SUID:普通用户执行时能临时获得 root 权限,从而修改/etc/shadow/tmp目录有 Sticky 位:任何人都能在里面创建文件,但只能删除自己的文件
四、进程管理:谁在跑?怎么停?
4.1 ps ------ 查看进程快照
bash
ps aux # 显示所有用户的所有进程(最常用)
ps aux | grep dotnet # 过滤出 dotnet 相关进程
ps -ef # 另一种格式,显示父进程 PID(PPID)
输出字段解读:
sql
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
dev 1234 0.5 1.2 23456 7890 ? Ss 10:00 0:01 dotnet run
| 字段 | 含义 |
|---|---|
| PID | 进程 ID,唯一标识,杀进程时用 |
| %CPU / %MEM | CPU 和内存占用百分比 |
| STAT | 进程状态:R=运行,S=睡眠,Z=僵尸进程,s=会话首进程 |
| COMMAND | 启动命令 |
4.2 top ------ 实时进程监控(基础版)
bash
top
操作:
- 按
P:按 CPU 排序 - 按
M:按内存排序 - 按
k:输入 PID 杀死进程 - 按
q:退出
4.3 htop ------ 实时进程监控(增强版,推荐)
bash
htop
操作:
- 方向键 / 鼠标:选中进程
F9或k:杀死进程F6:选择排序方式F10或q:退出/:搜索进程名
特点:彩色界面,支持鼠标,直观显示 CPU/内存条形图。
4.4 kill ------ 终止进程
bash
kill 1234 # 发送 SIGTERM(礼貌请求终止)
kill -9 1234 # 发送 SIGKILL(强制杀死,无法拦截)
killall dotnet # 按名称杀死所有 dotnet 进程
pkill -f "dotnet run" # 按完整命令匹配杀死
信号对照表:
| 信号 | 数值 | 命令 | 效果 |
|---|---|---|---|
| SIGTERM | 15 | kill PID |
礼貌请求,进程可以清理资源后退出(推荐) |
| SIGKILL | 9 | kill -9 PID |
强制立即终止,进程无法忽略(最后手段) |
| SIGHUP | 1 | kill -1 PID |
挂起信号,常用于重载配置(如 nginx -s reload) |
场景 :你的 .NET 应用卡死了,kill 没反应,就用 kill -9。
4.5 systemctl ------ 服务管理(核心中的核心)
Linux 系统使用 systemd 管理服务(后台持续运行的程序)。
bash
# 查看服务状态
sudo systemctl status ssh # SSH 服务
sudo systemctl status docker # Docker 服务
# 启动 / 停止 / 重启服务
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
# 设置开机自启 / 取消开机自启
sudo systemctl enable nginx
sudo systemctl disable nginx
# 查看服务是否开机自启
sudo systemctl is-enabled nginx
# 重新加载配置(不改服务状态,只读新配置)
sudo systemctl reload nginx
查看服务日志(排错神器):
bash
sudo journalctl -u nginx # 查看 nginx 所有历史日志
sudo journalctl -u nginx -f # -f = follow,实时追踪
sudo journalctl -u nginx --since "1 hour ago" # 最近1小时
sudo journalctl -u nginx -n 50 # 最近 50 行
五、网络管理:连通性、端口与防火墙
5.1 ip addr ------ 查看网络接口和 IP
bash
ip addr show # 显示所有网卡
ip addr show eth0 # 只显示 eth0 网卡(你的可能是 enp0s3)
ip -4 addr show # 只显示 IPv4
输出重点:
sql
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
inet 192.168.1.105/24 brd 192.168.1.255 scope global dynamic eth0
inet后面就是 IP 地址 :192.168.1.105/24表示子网掩码是255.255.255.0dynamic表示 DHCP 自动分配
旧命令 (需要安装 net-tools):
bash
ifconfig # 更直观,但已废弃
5.2 ping ------ 测试网络连通性
bash
ping baidu.com # 测试能否上外网
ping 192.168.1.1 # 测试能否连到路由器
ping -c 3 192.168.1.100 # 只发 3 个包(Linux 默认无限 ping)
输出解读:
ini
64 bytes from 220.181.38.148: icmp_seq=1 ttl=52 time=28.3 ms
time=28.3 ms:延迟 28 毫秒,正常- 按
Ctrl+C停止,显示统计:
erlang
5 packets transmitted, 5 received, 0% packet loss
0% packet loss= 网络正常
5.3 curl ------ 命令行浏览器(API 测试神器)
bash
curl http://localhost:5000/weatherforecast # 测试本地 API
curl -I https://www.baidu.com # 只看响应头
curl -v http://localhost:5000/api/users # 显示详细通信过程(调试用)
curl -X POST http://localhost:5000/api/users \
-H "Content-Type: application/json" \
-d '{"name":"dev","age":25}' # POST 请求带 JSON 数据
输出解读:
css
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
[{"date":"2026-07-12","temperatureC":32,"summary":"Hot"}]
5.4 ss / netstat ------ 查看端口占用
bash
sudo ss -tlnp # 查看所有监听中的 TCP 端口(最常用)
sudo ss -tlnp | grep :5000 # 过滤 5000 端口
sudo netstat -tlnp # 旧命令,效果类似
参数拆解:
-t:TCP-l:Listening(监听中)-n:显示数字端口,不解析为服务名-p:显示占用该端口的进程
输出示例:
ruby
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
LISTEN 0 4096 0.0.0.0:5000 0.0.0.0:* users:(("dotnet",pid=5678,fd=159))
场景 :端口被占用启动失败时,用 ss 找到占用进程,然后 kill 掉。
5.5 ufw ------ 简易防火墙(Ubuntu 自带)
bash
sudo ufw status # 查看防火墙状态
sudo ufw status verbose # 详细状态
sudo ufw default deny incoming # 默认拒绝所有入站(安全)
sudo ufw default allow outgoing # 默认允许所有出站
sudo ufw allow 22/tcp # 允许 SSH(必须!否则连自己都被挡外面)
sudo ufw allow 80/tcp # 允许 HTTP
sudo ufw allow 443/tcp # 允许 HTTPS
sudo ufw allow 5000/tcp # 允许你的 .NET API
sudo ufw allow 8080/tcp # 后续 GitLab 用
sudo ufw enable # 启用防火墙
sudo ufw disable # 禁用防火墙(调试时临时用)
sudo ufw delete allow 5000 # 删除某条规则
⚠️ 重要 :启用
ufw前必须先允许 22 端口,否则 SSH 断连,你只能去 VirtualBox 窗口操作了。
六、压缩与包管理:打包、解压、安装软件
6.1 tar ------ Linux 最经典的打包工具
bash
# 打包(不压缩)
tar -cvf archive.tar folder/ # -c=create, -v=verbose, -f=file
# 打包并 gzip 压缩(最常用,.tar.gz 或 .tgz)
tar -czvf archive.tar.gz folder/ # -z=gzip 压缩
# 打包并 bzip2 压缩(压缩率更高,但更慢)
tar -cjvf archive.tar.bz2 folder/ # -j=bzip2 压缩
# 解压 .tar.gz
tar -xzvf archive.tar.gz # -x=extract 解压
# 解压到指定目录
tar -xzvf archive.tar.gz -C /tmp/ # -C=指定目标目录
# 查看压缩包内容(不解压)
tar -tzvf archive.tar.gz # -t=list
记忆口诀:
- c reate z ip v erbose f ile =
czvf(压缩) - ex tract z ip v erbose f ile =
xzvf(解压)
6.2 zip / unzip ------ Windows 兼容格式
bash
sudo apt install -y zip unzip # 先安装
zip -r archive.zip folder/ # -r=recursive,递归压缩目录
unzip archive.zip # 解压到当前目录
unzip archive.zip -d /tmp/extract/ # -d=指定解压目录
unzip -l archive.zip # 查看内容不解压
场景 :和 Windows 同事传文件时用 zip,Linux 服务器之间用 tar.gz。
6.3 apt ------ 高级包管理工具
bash
# 更新软件源索引(安装前必做)
sudo apt update
# 升级已安装软件
sudo apt upgrade -y
# 安装软件
sudo apt install -y nginx docker.io
# 卸载软件(保留配置)
sudo apt remove -y nginx
# 彻底卸载(包括配置)
sudo apt purge -y nginx
# 清理不再需要的依赖
sudo apt autoremove -y
# 搜索软件包
apt search dotnet
# 查看软件包信息
apt show dotnet-sdk-8.0
# 查看已安装包列表
apt list --installed | grep dotnet
6.4 dpkg ------ 底层包管理(处理 .deb 文件)
bash
# 安装本地 .deb 包
sudo dpkg -i package.deb
# 查看已安装的包
dpkg -l | grep nginx
# 查看某个文件属于哪个包
dpkg -S /usr/bin/nginx
# 卸载包
sudo dpkg -r package_name
场景 :官网下载的 .deb 安装包(如 VS Code、Chrome),用 dpkg -i 安装。
七、用户与组:谁是谁?属于哪个组?
7.1 whoami ------ 当前用户
bash
whoami
# 输出:dev
7.2 id ------ 完整身份信息
bash
id
# 输出:uid=1000(dev) gid=1000(dev) groups=1000(dev),4(adm),24(cdrom),27(sudo),30(dip)...
字段解读:
- uid=1000:用户 ID,Linux 内部用数字标识用户
- gid=1000:主组 ID,你的默认组
- groups=... :你所属的所有组,包括
sudo(能用 sudo 的关键)
7.3 groups ------ 查看所属组
bash
groups
# 输出:dev adm cdrom sudo dip plugdev lpadmin sambashare
重点 :看到 sudo 了吗?这就是你能用 sudo 的原因。如果新建用户没这个组,就不能 sudo。
7.4 adduser ------ 创建新用户(交互式,推荐)
bash
sudo adduser testuser
交互过程:
ini
Adding user 'testuser' ...
New password: # 设置密码
Retype new password: # 确认密码
Full Name []: Test User # 全名(可回车跳过)
Room Number []: # 回车跳过
...
Is the information correct? [Y/n] Y
特点 :自动创建家目录 /home/testuser,自动设置密码,自动创建同名组。
7.5 useradd ------ 创建用户(命令式,脚本用)
bash
sudo useradd -m -s /bin/bash testuser2 # -m=创建家目录, -s=指定shell
sudo passwd testuser2 # 单独设置密码
| adduser | useradd |
|-----------|-----------|-----------|
| 交互性 | 有,一步步问 | 无,参数全在命令行 |
| 易用性 | 新手友好 | 需要记参数 |
| 适用场景 | 手动创建 | 脚本自动化 |
| 默认值 | 自动填充 | 极简,很多要手动配 |
建议 :手动操作一律用 adduser。
7.6 usermod ------ 修改用户属性
bash
# 把用户加入 sudo 组(获得管理员权限)
sudo usermod -aG sudo testuser
# 把用户加入 docker 组(后续 Docker 免 sudo)
sudo usermod -aG docker dev
# 修改用户主目录
sudo usermod -d /new/home testuser
# 锁定用户(禁止登录)
sudo usermod -L testuser
# 解锁用户
sudo usermod -U testuser
-aG 拆解:
-a= append(追加),不加会覆盖原有组-G= 指定附加组
⚠️ 坑 :如果写
usermod -G sudo testuser(没有-a),会清空所有其他组,只剩 sudo,用户可能连登录都出问题。
7.7 deluser / userdel ------ 删除用户
bash
# 删除用户,保留家目录
sudo deluser testuser
# 删除用户及家目录
sudo deluser --remove-home testuser
# 强制删除(useradd 创建的用 userdel)
sudo userdel -r testuser
7.8 组管理命令
bash
# 查看所有组
cat /etc/group
# 查看某个组有哪些成员
getent group sudo
# 创建新组
sudo addgroup developers
# 删除组
sudo delgroup developers
7.9 关键系统文件速查
| 文件 | 用途 | 权限 |
|---|---|---|
/etc/passwd |
用户账户信息 | 所有用户可读 |
/etc/shadow |
用户密码哈希 | 只有 root 可读 |
/etc/group |
组信息 | 所有用户可读 |
/etc/sudoers |
sudo 权限配置 | 必须用 visudo 编辑 |
八、分级实战任务(从入门到进阶)
🔰 Level 1:文件系统基础(必做)
bash
# 1. 确认在家目录
pwd
# 2. 创建项目目录结构
mkdir -p ~/projects/dotnet-api/src
mkdir -p ~/projects/dotnet-api/tests
mkdir -p ~/projects/vue-frontend/src
# 3. 查看结构
ls -la ~/projects
ls -R ~/projects # -R = Recursive,递归显示子目录
# 4. 用 nano 创建 README
nano ~/projects/README.md
# 输入:
# # 我的全栈项目
# - 后端:.NET 8 Web API
# - 前端:Vue 3
# Ctrl+O 保存,Ctrl+X 退出
# 5. 查看并验证
cat ~/projects/README.md
ls -lh ~/projects/README.md
🔰 Level 2:文件操作与权限(必做)
bash
cd ~/projects
# 1. 创建测试脚本
echo '#!/bin/bash' > hello.sh
echo 'echo "Hello from Linux!"' >> hello.sh
# 2. 查看默认权限(应该是 644)
ls -l hello.sh
# 3. 尝试执行(会失败,权限 denied)
./hello.sh
# 4. 添加执行权限
chmod +x hello.sh
ls -l hello.sh # 现在应该是 755
# 5. 执行成功
./hello.sh
# 6. 改为只有你能执行
chmod 700 hello.sh
ls -l hello.sh # -rwx------
# 7. 用 sudo 改为 root 所有
sudo chown root hello.sh
ls -l hello.sh # 所有者变成 root
# 8. 你现在连读都读不了(除非用 sudo)
cat hello.sh # Permission denied
# 9. 改回来
sudo chown dev:dev hello.sh
chmod 755 hello.sh
🔰 Level 3:进程与服务(必做)
bash
# 1. 查看当前所有进程
ps aux | head -n 10
# 2. 过滤出你自己的进程
ps aux | grep dev
# 3. 打开 htop 观察(按 F10 退出)
htop
# 4. 查看 SSH 服务状态
sudo systemctl status ssh
# 5. 查看 SSH 日志
sudo journalctl -u ssh -n 20
# 6. 模拟一个后台进程
sleep 300 &
# 记录输出的 PID
# 7. 查看这个进程
ps aux | grep sleep
# 8. 杀死它
kill %1 # 或 kill [PID]
# 9. 确认已消失
ps aux | grep sleep
🔰 Level 4:网络与防火墙(必做)
bash
# 1. 查看你的 IP
ip addr show | grep "inet "
# 2. 测试外网连通性
ping -c 3 baidu.com
# 3. 查看当前监听端口
sudo ss -tlnp
# 4. 确认 SSH 在 22 端口监听
sudo ss -tlnp | grep :22
# 5. 配置防火墙(谨慎!确保 SSH 不会断)
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 5000/tcp
sudo ufw allow 8080/tcp
sudo ufw enable
# 6. 确认状态
sudo ufw status verbose
🔰 Level 5:压缩与包管理(必做)
bash
# 1. 创建测试目录
mkdir -p ~/test-archive/project/subdir
cd ~/test-archive/project
echo "file1" > a.txt
echo "file2" > b.txt
echo "file3" > subdir/c.txt
# 2. 打包压缩
cd ~/test-archive
tar -czvf project.tar.gz project/
# 3. 查看压缩包内容
tar -tzvf project.tar.gz
# 4. 解压到另一个目录
mkdir extract
tar -xzvf project.tar.gz -C extract/
# 5. 对比验证
diff -r project/ extract/project/
# 6. 用 zip 再压一份
sudo apt install -y zip
zip -r project.zip project/
# 7. 查看 apt 信息
apt show curl | head -n 10
dpkg -L curl | head -n 20
🚀 Level 6:用户与组(进阶)
bash
# 1. 查看当前用户完整信息
id
groups
# 2. 创建测试用户
sudo adduser testuser
# 按提示设置密码,其他字段回车跳过
# 3. 查看新用户
id testuser
ls -la /home/
# 4. 尝试用 testuser 执行 sudo(会失败)
su - testuser
sudo apt update
# 报错:testuser is not in the sudoers file.
exit
# 5. 把 testuser 加入 sudo 组
sudo usermod -aG sudo testuser
# 6. 验证
su - testuser
groups # 看到 sudo 了吗?
sudo apt update # 现在可以了!
exit
# 7. 查看关键文件
head -n 5 /etc/passwd
head -n 5 /etc/group
getent group sudo
# 8. 清理
sudo deluser --remove-home testuser
🚀 Level 7:综合挑战(选做)
任务:编写一个脚本,自动完成以下操作:
- 在
/tmp下创建目录backup_$(date +%Y%m%d) - 将
~/projects打包压缩到该目录 - 检查压缩包大小,如果大于 10MB 则输出警告
- 列出压缩包内容
参考答案:
bash
#!/bin/bash
BACKUP_DIR="/tmp/backup_$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
tar -czvf "$BACKUP_DIR/projects.tar.gz" ~/projects/
SIZE=$(du -m "$BACKUP_DIR/projects.tar.gz" | cut -f1)
echo "备份大小: ${SIZE}MB"
if [ $SIZE -gt 10 ]; then
echo "⚠️ 警告:备份文件超过 10MB"
fi
tar -tzvf "$BACKUP_DIR/projects.tar.gz" | head -n 20
九、面试高频考点与易错点
9.1 高频面试题
| 问题 | 答案要点 |
|---|---|
ls -l 输出中 drwxr-xr-x 每个字符的含义? |
d=目录,三段 rwx 分别是所有者/组/其他人的权限 |
chmod 755 和 644 分别代表什么? |
755=所有者读写执行,其他人读执行;644=所有者读写,其他人只读 |
kill 和 kill -9 的区别? |
kill 发送 SIGTERM(15),进程可优雅退出;kill -9 发送 SIGKILL,强制终止 |
find 和 locate 的区别? |
find 实时搜索,支持复杂条件,慢;locate 查数据库,快但可能过时 |
> 和 >> 的区别? |
> 覆盖写入,>> 追加写入 |
adduser 和 useradd 的区别? |
adduser 交互式、易用;useradd 命令式、适合脚本 |
为什么 usermod -aG 要有 -a? |
没有 -a 会覆盖原有组,导致用户丢失其他权限 |
9.2 常见易错点
-
rm -rf后面多打了个空格bashrm -rf / home/dev/project # 注意 / 和 home 之间的空格!这会先删根目录,再删 home/dev/project安全写法 :
rm -rf /home/dev/project(绝对路径,无空格) -
chmod对目录使用不加-Rbashchmod 755 projects/ # 只改了 projects 目录本身的权限,没改里面的文件 chmod -R 755 projects/ # 递归修改整个目录树 -
usermod -G忘记加-abashsudo usermod -G docker dev # 危险!dev 用户会只剩 docker 组,sudo 权限丢失 sudo usermod -aG docker dev # 正确:追加 docker 组 -
tar参数顺序bashtar -czvf archive.tar.gz folder/ # 正确 tar -czvf folder/ archive.tar.gz # 错误!会把 folder/ 当成压缩包名 -
启用 ufw 前没放行 SSH
bashsudo ufw enable # 如果你没先 allow 22,SSH 会立即断开
十、全命令速查表
| 类别 | 命令 | 常用参数 | 用途 |
|---|---|---|---|
| 文件系统 | pwd |
--- | 显示当前路径 |
ls |
-l -a -h -R -t |
列出目录内容 | |
cd |
~, .., - |
切换目录 | |
mkdir |
-p |
创建目录 | |
cp |
-r -i -v |
复制文件/目录 | |
mv |
-i |
移动/重命名 | |
rm |
-r -f -i |
删除文件/目录 | |
find |
-name -type -mtime -size |
查找文件 | |
locate |
--- | 快速查找(基于数据库) | |
touch |
--- | 创建空文件/更新时间戳 | |
| 文件编辑 | echo |
>, >> |
输出/重定向 |
cat |
-n |
查看小文件 | |
less |
--- | 分页查看大文件 | |
head |
-n |
看文件开头 | |
tail |
-n -f |
看文件结尾/实时追踪 | |
nano |
--- | 简单编辑器 | |
vim |
:wq, :q! |
专业编辑器 | |
| 权限 | chmod |
755, 644, +x |
修改权限 |
chown |
-R |
修改所有者 | |
| 进程 | ps |
aux, -ef |
查看进程 |
top |
--- | 实时进程监控 | |
htop |
--- | 增强版进程监控 | |
kill |
-9, -15 |
终止进程 | |
killall |
--- | 按名称杀进程 | |
systemctl |
start/stop/restart/enable/status |
服务管理 | |
journalctl |
-u -f -n |
查看服务日志 | |
| 网络 | ip |
addr show |
查看 IP |
ping |
-c |
测试连通性 | |
curl |
-I -v -X POST |
HTTP 请求 | |
ss |
-tlnp |
查看端口 | |
ufw |
allow/deny/enable/status |
防火墙 | |
| 压缩 | tar |
-czvf, -xzvf, -tzvf |
打包压缩 |
zip |
-r |
Windows 兼容压缩 | |
unzip |
-d -l |
解压 zip | |
| 包管理 | apt |
update/upgrade/install/remove/purge |
包管理 |
dpkg |
-i -l -r -S |
.deb 包管理 | |
| 用户 | whoami |
--- | 当前用户 |
id |
--- | 用户详细信息 | |
groups |
--- | 查看所属组 | |
adduser |
--- | 创建用户(交互式) | |
useradd |
-m -s |
创建用户(命令式) | |
usermod |
-aG |
修改用户属性 | |
deluser |
--remove-home |
删除用户 | |
sudo |
--- | 以 root 权限执行 |
结语
至此,你已经掌握了 Linux 日常开发/运维中最核心的 40+ 个命令。这些命令不是孤立存在的,它们遵循 Unix 哲学:每个程序只做一件事,但把它做好;多个程序组合起来完成复杂任务。