终端和命令行
方法论: 终端不是黑魔法,它只是用文字和电脑对话的窗口。
📖 本节目标
学完本节,你将理解:
- ✅ 终端是什么,为什么要用它
- ✅ 如何打开和使用终端
- ✅ 15个最常用的Linux命令
- ✅ Vim编辑器的生存技能
预计用时: 25分钟
1. 终端是什么?
1.1 生活类比
终端 = 和电脑文字对话的窗口
| 操作方式 | 类比 | 适用场景 |
|---|---|---|
| 图形界面(GUI) | 用遥控器换电视频道 | 日常使用,直观易懂 |
| 命令行(CLI) | 对着电视喊“换到CCTV5“ | 服务器管理,效率超高 |
1.2 为什么要用终端?
核心原因: 大多数服务器没有图形界面!
你的笔记本 云服务器
┌─────────────┐ ┌─────────────┐
│ 桌面、图标 │ │ 只有黑屏 │
│ 鼠标点击 │ │ 纯文字操作 │
│ 窗口、菜单 │ SSH连接 ──> │ 效率超高 │
└─────────────┘ └─────────────┘
三大优势:
- 远程操作: 只传输文字,不需要传输图形界面(快!)
- 批量处理: 一个命令操作100个文件,图形界面要点100次
- 自动化: 写成脚本,定时自动执行
1.3 终端与部署的关系 ⚠️ 重要!
现实场景: 你开发了一个网站,要让全世界的人都能访问
开发阶段(你的电脑):
✅ npm run dev ← 本地运行
✅ 浏览器打开localhost:3000
✅ 一切正常!
部署阶段(云服务器):
你需要在服务器上:
1. SSH登录服务器 ← 必须用终端
2. 安装Node.js ← 必须用终端
3. 上传代码 ← 必须用终端
4. 配置Nginx ← 必须用终端
5. 启动应用 ← 必须用终端
6. 查看日志排错 ← 必须用终端
没有终端,你无法部署应用!
部署时你会用到的终端操作:
| 操作 | 为什么需要 | 本章会学到 |
|---|---|---|
| 连接服务器 | SSH远程登录 | ✅ 第3章 |
| 编辑配置文件 | 修改Nginx配置 | ✅ 第4章 Vim |
| 查看日志 | 排查应用错误 | ✅ 第3.4章 |
| 后台运行 | 应用持续运行 | ✅ 第3.4章 |
| 进程管理 | 重启/停止应用 | ✅ 第3.4章 |
| 权限管理 | 解决部署权限错误 | ✅ 03章权限系统 |
学习路线图:
01. 终端基础(本章)
├── 基础命令(ls/cd/vim)
└── 实用命令(日志/后台运行)
│
▼
02-03. 包管理器和权限
│
▼
04. 服务器部署
├── 使用终端SSH登录
├── 使用终端配置Nginx
├── 使用终端启动应用
└── 使用终端查看日志排错
终端是部署的基础工具!
2. 如何打开终端?
Windows 用户
方法1: 快捷键
- 按
Win + R - 输入
cmd或powershell - 按回车
方法2: 搜索
- 点击开始菜单
- 搜索“命令提示符“或“PowerShell“
Mac 用户
方法1: 快捷键
- 按
Command + 空格 - 输入
terminal或终端 - 按回车
方法2: 访达
- 打开“应用程序“
- 进入“实用工具“
- 双击“终端“
打开后长这样
~ % _ ← 光标在这里闪烁,可以输入命令了
重要: 后面所有命令都要在终端窗口里输入,不是在浏览器或Word里!
3. 必须掌握的15个命令
3.1 文件导航 (5个)
pwd - 我在哪里?
作用: 显示当前目录的完整路径
pwd
# 输出: /home/username/projects
类比: 问GPS“我现在的位置是?“
ls - 这里有什么?
作用: 列出当前目录的文件和文件夹
# 基础用法
ls
# 显示详细信息(推荐)
ls -la
# 显示文件大小(人类可读)
ls -lh
输出示例:
-rw-r--r-- 1 user staff 1.5K Nov 26 08:00 README.md
drwxr-xr-x 5 user staff 160B Nov 25 10:30 src/
类比: 打开抽屉看里面有什么东西
cd - 进入目录
作用: 切换到指定目录
# 进入某个文件夹
cd projects
# 回到上一级
cd ..
# 回到家目录
cd ~
# 回到上一个目录
cd -
类比: 走进某个房间
Tab键 - 自动补全(超重要!)
使用方法: 输入命令或路径的前几个字母,按Tab键
# 输入
cd proj[按Tab]
# 自动补全为
cd projects/
为什么重要:
- ✅ 节省时间
- ✅ 防止拼写错误
- ✅ 显示可能的选项
3.2 文件操作 (5个)
mkdir - 创建文件夹
# 创建单个文件夹
mkdir my-project
# 递归创建多层文件夹
mkdir -p parent/child/grandchild
touch - 创建空文件
# 创建一个文件
touch index.html
# 创建多个文件
touch file1.txt file2.txt file3.txt
cp - 复制文件
# 复制文件
cp source.txt backup.txt
# 复制整个文件夹(递归)
cp -r folder/ backup-folder/
类比: 复印文件
mv - 移动/重命名文件
# 重命名文件
mv old-name.txt new-name.txt
# 移动文件到其他文件夹
mv file.txt /path/to/folder/
类比: 剪切粘贴
rm - 删除文件 ⚠️ 危险!
# 删除文件
rm file.txt
# 删除文件夹(递归)
rm -r folder/
# 强制删除(不提示确认)
rm -rf folder/ ← 非常危险!
⚠️ 警告: Linux没有回收站,删了就真的没了!
永远不要执行的命令:
# 这会删除整个系统!!! 绝对不要运行!!!
rm -rf /
rm -rf /*
3.3 查看文件内容 (3个)
cat - 显示整个文件
cat README.md
适合: 短文件
less - 分页查看
less large-file.log
快捷键:
- 空格键: 下一页
b: 上一页/搜索词: 搜索q: 退出
适合: 长文件
tail - 查看文件末尾
# 查看最后10行
tail file.log
# 查看最后50行
tail -n 50 file.log
# 实时监控日志(超实用!)
tail -f app.log
适合: 查看日志文件
3.4 其他实用命令 (2个)
grep - 搜索文本
# 在文件中搜索关键词
grep "error" app.log
# 忽略大小写
grep -i "error" app.log
# 递归搜索整个文件夹
grep -r "function" src/
类比: Ctrl+F 全局搜索
ps 和 kill - 进程管理
# 查看所有进程
ps aux
# 查找特定进程
ps aux | grep nginx
# 杀死进程(替换PID为实际进程号)
kill 12345
# 强制杀死
kill -9 12345
3.5 部署实用命令速查 🔥 重要!
查看日志 (排查错误必备)
# 查看日志文件最后100行
tail -n 100 /var/log/nginx/error.log
# 实时查看日志(最常用!)
tail -f /var/log/nginx/access.log
tail -f ~/app/logs/error.log
# 搜索日志中的错误
grep "ERROR" app.log
grep -i "error" app.log # 忽略大小写
# 查看日志的特定时间段
grep "2024-11-26" app.log | grep "ERROR"
# 统计错误数量
grep -c "ERROR" app.log
实战场景: 应用部署后报错,查看日志排错
# 1. 先看最后的错误
tail -n 50 logs/error.log
# 2. 实时监控新日志
tail -f logs/error.log
# 3. 搜索关键错误信息
grep "Error" logs/error.log
后台运行程序
问题: 关闭终端后,程序就停了!
# ❌ 错误: 直接运行(关闭终端就停止)
python app.py
node server.js
# ✅ 正确: 使用nohup后台运行
nohup python app.py > app.log 2>&1 &
nohup node server.js > server.log 2>&1 &
命令解释:
| 部分 | 含义 |
|---|---|
nohup | 不挂断运行(关闭终端也不停) |
> app.log | 将输出重定向到日志文件 |
2>&1 | 将错误输出也重定向到日志 |
& | 在后台运行 |
查看后台进程:
# 查看刚启动的进程号
echo $!
# 查看所有后台任务
jobs
# 查看特定进程
ps aux | grep python
ps aux | grep node
停止后台进程:
# 查找进程号
ps aux | grep "app.py"
# 杀死进程(替换12345为实际PID)
kill 12345
# 强制杀死
kill -9 12345
# 或使用pkill(按名称杀死)
pkill -f app.py
SSH远程连接
# 基本连接
ssh username@server-ip
# 指定端口
ssh -p 22 username@server-ip
# 使用密钥登录
ssh -i ~/.ssh/id_rsa username@server-ip
# 远程执行命令
ssh username@server-ip "ls -la"
# 上传文件到服务器
scp local-file.txt username@server-ip:/remote/path/
# 下载文件从服务器
scp username@server-ip:/remote/file.txt ./local-path/
# 上传整个目录
scp -r local-folder/ username@server-ip:/remote/path/
文件传输 (rsync更高效)
# rsync同步文件(增量传输,更快!)
rsync -avz local-folder/ username@server-ip:/remote/path/
# -a: 归档模式(保留权限)
# -v: 显示详细信息
# -z: 压缩传输
# 排除某些文件
rsync -avz --exclude 'node_modules' \
local-folder/ username@server-ip:/remote/path/
磁盘空间管理
# 查看磁盘使用情况
df -h
# 查看当前目录大小
du -sh .
# 查看各子目录大小(排序)
du -h --max-depth=1 | sort -h
# 查找大文件(大于100MB)
find / -type f -size +100M 2>/dev/null
# 清理日志文件
> app.log # 清空但不删除文件
truncate -s 0 app.log # 同上
系统状态监控
# 查看系统资源使用
top
htop # 更友好(需要安装)
# 查看内存使用
free -h
# 查看CPU信息
lscpu
# 查看系统运行时间
uptime
# 查看当前登录用户
who
w
# 查看端口占用
netstat -tuln | grep 3000
lsof -i :3000
# 查看网络连接
netstat -an | grep ESTABLISHED
快速重启服务
# 重启Nginx
sudo systemctl restart nginx
# 重启PM2应用
pm2 restart app-name
# 重启整个服务器(慎用!)
sudo reboot
环境变量管理
# 查看所有环境变量
env
printenv
# 查看特定环境变量
echo $PATH
echo $HOME
# 临时设置环境变量(当前会话有效)
export NODE_ENV=production
# 永久设置(添加到配置文件)
echo 'export NODE_ENV=production' >> ~/.bashrc
source ~/.bashrc # 重新加载配置
压缩和解压
# 压缩文件
tar -czvf backup.tar.gz folder/
zip -r backup.zip folder/
# 解压文件
tar -xzvf backup.tar.gz
unzip backup.zip
# 查看压缩包内容(不解压)
tar -tzvf backup.tar.gz
unzip -l backup.zip
文本处理技巧
# 快速查看文件前/后几行
head -n 20 file.txt
tail -n 20 file.txt
# 统计行数/字数
wc -l file.txt # 行数
wc -w file.txt # 字数
# 去重
sort file.txt | uniq
# 批量替换
sed -i 's/old/new/g' file.txt
# 查找包含关键词的文件
grep -r "keyword" .
快捷命令组合(超实用!)
# 查看应用是否在运行
ps aux | grep node | grep -v grep
# 一键杀死所有Node进程
pkill -f node
# 查看最占CPU的进程
ps aux --sort=-%cpu | head -10
# 查看最占内存的进程
ps aux --sort=-%mem | head -10
# 查找并删除所有.log文件
find . -name "*.log" -delete
# 批量重命名文件
for file in *.txt; do mv "$file" "${file%.txt}.md"; done
4. Vim编辑器生存指南
4.1 为什么要学Vim?
现实: 服务器上编辑配置文件,80%的情况只有Vim可用。
4.2 Vim的三种模式
| 模式 | 说明 | 如何进入 |
|---|---|---|
| 命令模式 | 光标移动、删除、复制 | 启动Vim时的默认模式 |
| 插入模式 | 实际输入文本 | 按 i 键 |
| 命令行模式 | 保存、退出 | 按 : 键 |
4.3 最小生存命令(必须会!)
打开文件
vim filename.txt
进入编辑
按 i 键 ← 进入插入模式,可以输入内容了
保存并退出
1. 按 Esc ← 退回命令模式
2. 输入 :wq ← 保存并退出
3. 按回车
不保存退出
1. 按 Esc
2. 输入 :q! ← 强制退出不保存
3. 按回车
4.4 常用操作速查
在命令模式下:
| 操作 | 按键 |
|---|---|
| 删除一行 | dd |
| 复制一行 | yy |
| 粘贴 | p |
| 撤销 | u |
| 跳到文件开头 | gg |
| 跳到文件结尾 | G |
保存和退出:
| 操作 | 命令 |
|---|---|
| 保存 | :w |
| 退出 | :q |
| 保存并退出 | :wq 或 ZZ |
| 强制退出不保存 | :q! |
5. 实战练习
练习1: 创建项目结构
在终端依次输入:
# 1. 创建项目文件夹
mkdir my-first-project
# 2. 进入文件夹
cd my-first-project
# 3. 创建多个文件
touch index.html style.css script.js
# 4. 查看创建结果
ls -la
# 5. 创建子文件夹
mkdir images docs
# 6. 再次查看
ls -la
练习2: Vim编辑文件
# 1. 用Vim打开文件
vim README.md
# 2. 按 i 进入插入模式
# 3. 输入一些文字
这是我的第一个项目!
# 4. 按 Esc 退回命令模式
# 5. 输入 :wq 保存并退出
# 6. 查看文件内容
cat README.md
6. 常见问题
Q1: 输入命令后没反应?
可能原因:
- 没按回车键
- 命令拼写错误
- 权限不足(需要加
sudo)
解决: 仔细检查拼写,按回车,看报错信息
Q2: Vim进去了出不来!
紧急退出:
1. 狂按 Esc 键3次
2. 输入 :q!
3. 按回车
记住: Esc回到命令模式, :q!强制退出
Q3: 误删文件怎么办?
现实: Linux没有回收站,删了就真的没了!
预防措施:
- 删除前用
ls确认路径正确 - 重要文件提前备份
- 使用
rm -i会在删除前确认
Q4: 程序运行后关闭终端就停了
问题:
# 直接运行
python app.py
# 关闭终端 → 程序停止运行!
解决方案:
# 方案1: 使用nohup后台运行
nohup python app.py > app.log 2>&1 &
# 方案2: 使用PM2管理(推荐,见04章)
pm2 start app.py --name my-app
Q5: 命令找不到(command not found)
报错示例:
-bash: npm: command not found
-bash: python: command not found
原因: 软件没安装或不在PATH环境变量中
解决:
# 检查是否安装
which npm
which python3
# 如果没安装,需要先安装
# Node.js/npm
sudo apt install nodejs npm # Ubuntu
brew install node # macOS
# Python
sudo apt install python3 # Ubuntu
brew install python3 # macOS
Q6: 权限被拒绝(Permission denied)
报错示例:
mkdir /opt/myapp
# mkdir: cannot create directory '/opt/myapp': Permission denied
原因: 你没有权限操作这个目录
解决:
# 方案1: 使用sudo(需要管理员权限)
sudo mkdir /opt/myapp
# 方案2: 在自己有权限的目录操作
mkdir ~/myapp # 你的家目录,肯定有权限
⚠️ 警告: 不要随便用sudo,先想想为什么需要!
Q7: 端口已被占用
报错示例:
Error: listen EADDRINUSE: address already in use :::3000
原因: 3000端口已经被其他程序占用
解决:
# 1. 查找占用端口的进程
lsof -i :3000
# 或
netstat -tuln | grep 3000
# 2. 杀死占用进程
kill -9 PID号
# 3. 或者换个端口运行你的应用
PORT=3001 npm start
Q8: 找不到刚创建的文件
问题: 创建了文件但ls看不到
可能原因:
# 原因1: 在错误的目录
pwd # 查看当前在哪里
# 原因2: 文件名是隐藏文件(以.开头)
ls -a # 显示隐藏文件
# 原因3: 没有读权限
ls -la # 查看权限
Q9: 复制粘贴命令报错
问题: 从网上复制的命令粘贴后报错
常见原因:
- 智能引号问题
# ❌ 错误(智能引号")
echo "Hello"
# ✅ 正确(普通引号")
echo "Hello"
- 多余的空格或换行
# 复制时带了额外的空格或换行符
# 手动重新输入命令
- 命令不完整
# 网页上的命令可能被截断了
# 确保复制完整的命令
建议: 理解命令含义后再执行,不要盲目复制粘贴!
Q10: SSH连接超时或被拒绝
报错示例:
ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection refused
ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection timed out
排查步骤:
# 1. 检查服务器IP是否正确
ping xxx.xxx.xxx.xxx
# 2. 检查SSH服务是否运行(在服务器上)
sudo systemctl status ssh
# 3. 检查云安全组是否开放22端口
# 登录云控制台检查
# 4. 检查防火墙
sudo ufw status
Q11: 日志文件太大打不开
问题: 几GB的日志文件,cat/vim都打不开
解决:
# ❌ 错误: 直接打开大文件
cat huge.log # 会卡死
# ✅ 正确: 只看需要的部分
tail -n 1000 huge.log # 看最后1000行
head -n 1000 huge.log # 看前1000行
# 搜索特定内容
grep "ERROR" huge.log | tail -n 100
# 清空日志(谨慎!)
> huge.log
# 或
truncate -s 0 huge.log
Q12: 忘记后台进程的PID
问题: 用nohup启动了程序,忘记记录PID号了
解决:
# 按名称查找进程
ps aux | grep python
ps aux | grep node
ps aux | grep "app.py"
# 更精确的查找
pgrep -f "app.py"
# 查看进程详细信息
ps -ef | grep app.py
Q13: 环境变量设置后不生效
问题: 设置了环境变量但还是找不到命令
原因: 配置文件没重新加载
解决:
# 1. 编辑配置文件
echo 'export PATH=$PATH:/new/path' >> ~/.bashrc
# 2. 重新加载配置(关键!)
source ~/.bashrc
# 3. 验证
echo $PATH
Q14: 空间不足(No space left on device)
报错: 磁盘空间已满
排查:
# 1. 查看磁盘使用
df -h
# 2. 查找占用空间大的目录
du -h --max-depth=1 / | sort -h | tail -10
# 3. 清理方案
# - 删除大的日志文件
find /var/log -name "*.log" -size +100M
# - 清理Docker(如果有)
docker system prune -a
# - 清理包管理器缓存
sudo apt clean
npm cache clean --force
Q15: 复制命令时忘记修改参数
常见错误:
# 从教程复制的命令
ssh username@server-ip
# ❌ 直接运行 → 肯定失败!
# ✅ 要改成你自己的用户名和IP
ssh myname@123.45.67.89
记住:
username→ 你的用户名server-ip→ 你的服务器IPyour-domain.com→ 你的域名your-password→ 你的密码
6.2 调试技巧
看懂错误信息
错误信息的结构:
command: error message
│ │
命令 错误描述
示例:
mkdir: cannot create directory '/opt/app': Permission denied
│ │ │ │
命令 操作说明 目标 具体错误
→ 翻译: mkdir命令无法创建/opt/app目录,因为权限被拒绝
→ 解决: 使用sudo或换个有权限的目录
万能调试流程
# 1. 看完整的错误信息
# 不要只看前几个字就慌了,完整读完
# 2. 复制错误信息Google
# 去掉特定的文件名/路径,只搜索通用部分
# 3. 检查拼写和路径
# 90%的错误是拼写错误
# 4. 查看命令帮助
man command # 查看手册
command --help # 查看帮助
# 5. 问AI
# "我执行xxx命令时报错: [完整错误信息],怎么解决?"
7. 总结
核心要点
-
终端是部署的基础工具
- 服务器没有图形界面,必须用终端
- SSH远程登录、查看日志、进程管理都要用终端
- 掌握终端是学习后续部署知识的前提
-
必须掌握的命令分类
- 基础导航: pwd, ls, cd (知道在哪里)
- 文件操作: mkdir, cp, mv, rm (管理文件)
- 文本查看: cat, less, tail, grep (查看和搜索)
- 部署实用: tail -f, nohup, ssh, ps, kill (必会!)
-
Vim最小生存技能
i进入编辑Esc退回命令模式:wq保存退出:q!不保存退出
-
重要提醒
- Tab键自动补全必须用
- rm命令很危险,删前三思
- 不要盲目复制粘贴命令
- 看懂错误信息再Google
实用命令速查表
| 场景 | 命令 | 说明 |
|---|---|---|
| 查看日志 | tail -f app.log | 实时监控日志 |
| 后台运行 | nohup python app.py > app.log 2>&1 & | 关闭终端不停 |
| SSH登录 | ssh user@ip | 远程登录服务器 |
| 上传文件 | scp file.txt user@ip:/path/ | 传文件到服务器 |
| 查找进程 | `ps aux | grep node` |
| 杀死进程 | kill -9 PID | 强制停止进程 |
| 查看端口 | lsof -i :3000 | 查看端口占用 |
| 磁盘空间 | df -h | 查看磁盘使用 |
学习路线图
✅ 你已完成:
01. 终端和命令行
├── 基础概念理解
├── 15个核心命令
├── 部署实用命令
├── Vim编辑器
└── 15个常见错误排查
▶ 继续学习:
02. 包管理器 npm 和 pip
├── npm install 如何工作
├── package.json 详解
├── 国内镜像配置
└── Python虚拟环境
03. Linux 权限系统
├── chmod/chown 实战
├── sudo 原理
└── 权限问题排查
04. 服务器部署
├── 用终端SSH登录 ← 用到01章知识
├── 用终端配置Nginx ← 用到Vim
├── 用终端查看日志 ← 用到tail -f
└── 用终端管理进程 ← 用到ps/kill
检查清单
学完本章,你应该能做到:
- ✅ 打开终端并知道自己在哪个目录
- ✅ 使用Tab键自动补全路径和命令
- ✅ 创建、删除、移动文件和目录
- ✅ 用Vim编辑文件并保存
- ✅ 使用tail -f查看实时日志
- ✅ 用nohup让程序后台运行
- ✅ SSH连接到远程服务器
- ✅ 查找和杀死进程
- ✅ 看懂基本的错误信息
下一步
掌握了这些基础命令后,你可以:
- ✅ SSH连接到服务器
- ✅ 在服务器上创建和编辑文件
- ✅ 查看日志排查问题
- ✅ 管理应用进程
继续学习: 02. 包管理器 npm 和 pip