Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

终端和命令行

方法论: 终端不是黑魔法,它只是用文字和电脑对话的窗口。


📖 本节目标

学完本节,你将理解:

  • ✅ 终端是什么,为什么要用它
  • ✅ 如何打开和使用终端
  • ✅ 15个最常用的Linux命令
  • ✅ Vim编辑器的生存技能

预计用时: 25分钟


1. 终端是什么?

1.1 生活类比

终端 = 和电脑文字对话的窗口

操作方式类比适用场景
图形界面(GUI)用遥控器换电视频道日常使用,直观易懂
命令行(CLI)对着电视喊“换到CCTV5“服务器管理,效率超高

1.2 为什么要用终端?

核心原因: 大多数服务器没有图形界面!

你的笔记本                      云服务器
┌─────────────┐              ┌─────────────┐
│ 桌面、图标   │              │ 只有黑屏    │
│ 鼠标点击    │              │ 纯文字操作   │
│ 窗口、菜单  │ SSH连接 ──>  │ 效率超高    │
└─────────────┘              └─────────────┘

三大优势:

  1. 远程操作: 只传输文字,不需要传输图形界面(快!)
  2. 批量处理: 一个命令操作100个文件,图形界面要点100次
  3. 自动化: 写成脚本,定时自动执行

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: 快捷键

  1. Win + R
  2. 输入 cmdpowershell
  3. 按回车

方法2: 搜索

  1. 点击开始菜单
  2. 搜索“命令提示符“或“PowerShell“

Mac 用户

方法1: 快捷键

  1. Command + 空格
  2. 输入 terminal终端
  3. 按回车

方法2: 访达

  1. 打开“应用程序“
  2. 进入“实用工具“
  3. 双击“终端“

打开后长这样

~ % _           ← 光标在这里闪烁,可以输入命令了

重要: 后面所有命令都要在终端窗口里输入,不是在浏览器或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 全局搜索


pskill - 进程管理

# 查看所有进程
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
保存并退出:wqZZ
强制退出不保存: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: 复制粘贴命令报错

问题: 从网上复制的命令粘贴后报错

常见原因:

  1. 智能引号问题
# ❌ 错误(智能引号")
echo "Hello"

# ✅ 正确(普通引号")
echo "Hello"
  1. 多余的空格或换行
# 复制时带了额外的空格或换行符
# 手动重新输入命令
  1. 命令不完整
# 网页上的命令可能被截断了
# 确保复制完整的命令

建议: 理解命令含义后再执行,不要盲目复制粘贴!


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 [email protected]

记住:

  • username → 你的用户名
  • server-ip → 你的服务器IP
  • your-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. 总结

核心要点

  1. 终端是部署的基础工具

    • 服务器没有图形界面,必须用终端
    • SSH远程登录、查看日志、进程管理都要用终端
    • 掌握终端是学习后续部署知识的前提
  2. 必须掌握的命令分类

    • 基础导航: pwd, ls, cd (知道在哪里)
    • 文件操作: mkdir, cp, mv, rm (管理文件)
    • 文本查看: cat, less, tail, grep (查看和搜索)
    • 部署实用: tail -f, nohup, ssh, ps, kill (必会!)
  3. Vim最小生存技能

    • i 进入编辑
    • Esc 退回命令模式
    • :wq 保存退出
    • :q! 不保存退出
  4. 重要提醒

    • 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 auxgrep 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