Linux 核心命令

适用人群 :Linux 初学者、从 Windows 转向 Linux 的开发者、准备面试的应届生

目标 :掌握日常开发/运维最常用的 40+ 个命令,理解其背后的设计哲学

阅读建议 :前半部分为知识讲解,后半部分为分级实战任务,建议边读边操作

预估时长:完整阅读 + 动手实践约 2-3 小时


目录

  1. 文件系统导航:你在哪?周围有什么?
  2. 文件创建与编辑:如何创建和修改内容
  3. 权限管理:谁能做什么
  4. 进程管理:谁在跑怎么停
  5. 网络管理:连通性端口与防火墙
  6. 压缩与包管理:打包解压安装软件
  7. 用户与组:谁是谁属于哪个组
  8. 分级实战任务
  9. 面试高频考点与易错点
  10. 速查表

一、文件系统导航:你在哪?周围有什么?

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 日志也不卡。这是 lesscat 看大文件的优势所在。


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

操作

  • 方向键 / 鼠标:选中进程
  • F9k:杀死进程
  • F6:选择排序方式
  • F10q:退出
  • /:搜索进程名

特点:彩色界面,支持鼠标,直观显示 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.0
  • dynamic 表示 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:综合挑战(选做)

任务:编写一个脚本,自动完成以下操作:

  1. /tmp 下创建目录 backup_$(date +%Y%m%d)
  2. ~/projects 打包压缩到该目录
  3. 检查压缩包大小,如果大于 10MB 则输出警告
  4. 列出压缩包内容

参考答案

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 755644 分别代表什么? 755=所有者读写执行,其他人读执行;644=所有者读写,其他人只读
killkill -9 的区别? kill 发送 SIGTERM(15),进程可优雅退出;kill -9 发送 SIGKILL,强制终止
findlocate 的区别? find 实时搜索,支持复杂条件,慢;locate 查数据库,快但可能过时
>>> 的区别? > 覆盖写入,>> 追加写入
adduseruseradd 的区别? adduser 交互式、易用;useradd 命令式、适合脚本
为什么 usermod -aG 要有 -a 没有 -a 会覆盖原有组,导致用户丢失其他权限

9.2 常见易错点

  1. rm -rf 后面多打了个空格

    bash 复制代码
    rm -rf / home/dev/project   # 注意 / 和 home 之间的空格!这会先删根目录,再删 home/dev/project

    安全写法rm -rf /home/dev/project(绝对路径,无空格)

  2. chmod 对目录使用不加 -R

    bash 复制代码
    chmod 755 projects/    # 只改了 projects 目录本身的权限,没改里面的文件
    chmod -R 755 projects/  # 递归修改整个目录树
  3. usermod -G 忘记加 -a

    bash 复制代码
    sudo usermod -G docker dev   # 危险!dev 用户会只剩 docker 组,sudo 权限丢失
    sudo usermod -aG docker dev  # 正确:追加 docker 组
  4. tar 参数顺序

    bash 复制代码
    tar -czvf archive.tar.gz folder/   # 正确
    tar -czvf folder/ archive.tar.gz   # 错误!会把 folder/ 当成压缩包名
  5. 启用 ufw 前没放行 SSH

    bash 复制代码
    sudo 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 哲学:每个程序只做一件事,但把它做好;多个程序组合起来完成复杂任务

相关推荐
SimonKing2 小时前
Base62编码生成6位不重复短码的背后设计
java·后端·程序员
Hilaku19 小时前
为什么 AI 写前端时,总是优先选择 React,而不是 Vue?
前端·javascript·程序员
猿的天空1 天前
GPT-5.6拆成三段,智能变成了可选购配置
人工智能·gpt·计算机·ai·程序员·大模型·智能体
阿里嘎多学长1 天前
2026-07-09 GitHub 热点项目精选
开发语言·程序员·github·代码托管
爱勇宝1 天前
从吐槽 DeepSeek 到被投资人炮轰:比“天才光环”更重要的,是契约与边界
程序员·创业·deepseek
狂师1 天前
端开发必装 Skill 清单:6 款 AI 技能,让你的开发效率原地起飞
前端·程序员·开源
SimonKing1 天前
Spring I18N 底层源码大揭秘:你的 MessageSource 到底是怎么找到配置的?
java·后端·程序员
嘟嘟07172 天前
别让 LLM 再胡说了——RAG 检索增强生成完全指南
程序员
爱勇宝2 天前
《道德经》第4章,老子写得很像在描述一个“底层系统”。
前端·后端·程序员