CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Linux 服务器入门/课时/编辑器与配置
RawBlame
课时目录12 节

Linux 服务器入门

  1. 01Linux 是什么
  2. 02Shell 与 Bash
  3. 03文件系统与权限
  4. 04常用命令
  5. 05编辑器与配置
  6. 06进程与服务
  7. 07用户与 sudo
  8. 08包管理
  9. 09SSH 与密钥
  10. 10防火墙与端口
  11. 11部署 CodeRoadMap
  12. 12综合练习

编辑器与配置

nano/vim 基础、编辑 nginx.conf。

25 分钟

编辑器与配置

这一课你将能做到

  1. 用 vim 完成「打开 → 定位 → 修改 → 保存退出」闭环,包括搜索、跳到行首/行尾/指定行、撤销
  2. 实际编辑两类生产配置:给 ~/.bashrc 加别名、改一份 nginx 配置(改完知道要 reload)
  3. 用 sed -i 不打开文件完成批量替换(改端口、换域名),并先备份防手滑

为什么要学

服务器上没有 VS Code。SSH 进去之后,改 nginx 配置、改 Spring Boot 的 application-prod.yml、改 systemd 单元文件、改 crontab——全部要在终端里完成。vim 几乎是所有发行版的标配(nano 也能用,但 vim 是面试和运维圈的通用语言)。

初学者对 vim 的恐惧来自一件事:进得去出不来。本课先用 5 分钟解决「打开和退出」,再给够「改得动」的最小命令集,最后补上 sed 这个「不打开文件也能改」的批量神器。目标是:在任何服务器上,你能独立完成一次配置修改并让它生效。

先建立图像

vim 的核心是模式(mode),这是它和 VS Code 最大的不同:

┌──────────────────────────────────────────────────┐
│                  NORMAL 普通模式                  │
│        (打开后的默认状态:移动/删除/复制/搜索)      │
│                                                  │
│   i a o            :wq  :q!  ZZ                  │
│   (进入插入模式)    (底行命令:保存/退出)          │
│      │                    ▲                      │
│      ▼                    │ Esc                  │
│ ┌─────────────────┐   Esc 回到普通模式             │
│ │ INSERT 插入模式  │──────────────────────►       │
│ │ (像普通编辑器打字)│                              │
│ └─────────────────┘                              │
└──────────────────────────────────────────────────┘

记住两条铁律,vim 就困不住你:

  1. Esc 永远能回到普通模式——慌了就先按 Esc
  2. 普通模式下 :q! 不保存强退,:wq 保存退出——这一进一出会了,剩下全是加分项

跟着做

步骤 1:进得去,出得来(5 分钟脱困训练)

mkdir -p ~/vim-lab && cd ~/vim-lab
echo "server.port=8080" > app.properties
vim app.properties

进入 vim 后按顺序演练(每步都在 vim 里操作):

1. 什么都别按,观察底部是否有 -- INSERT --(没有=普通模式,正确)
2. 按 i          → 底部出现 -- INSERT --,现在是打字模式
3. 输入 # test,然后按 Esc → 回到普通模式
4. 输入 :q!      → 回车,不保存退出(! 表示放弃修改强退)
5. 再 vim app.properties 进去,按 i,随便打几个字,Esc
6. 输入 :wq      → 回车,保存退出

到此你已经掌握了 vim 的「生死开关」。后面全部内容都建立在这个安全感之上。

步骤 2:移动与定位(改配置找得快)

cp /etc/hosts ~/vim-lab/hosts-sample     # 拿系统文件做练习副本(别改原件)
vim hosts-sample

普通模式下的定位键(练一遍形成手感):

h j k l        ← ↓ ↑ →(也可用方向键)
gg             跳到第一行
G              跳到最后一行(看长日志最常用)
:50 回车       跳到第 50 行(配合报错里的行号用)
0 / $          行首 / 行尾
w / b          下一个 / 上一个单词
/关键词 回车    向下搜索;n 下一个命中,N 上一个

试一遍:G 到底、gg 回顶、/localhost 搜索 hosts 里的条目、按 n 跳下一个。

步骤 3:编辑操作(改得动的最小集)

普通模式下:
i      光标前插入          a    光标后插入
o      下方新开一行插入     O    上方新开一行
x      删除光标处字符       dd   删除(剪切)整行
5dd    删 5 行             dw   删一个单词
u      撤销(多按多退)     Ctrl+r 重做
yy     复制整行            3yy  复制 3 行
p      粘贴到光标下方       P    粘贴到上方

演练:进 vim → yy 复制一行 → p 粘贴 → dd 删掉刚粘贴的 → u 撤销删除 → :wq 保存退出,diff /etc/hosts hosts-sample 看你改了什么。

步骤 4:实战一——给 ~/.bashrc 加配置

上一课的 alias 现在用 vim 正式写进去:

vim ~/.bashrc

在文件末尾添加(G 跳到末尾 → o 新开一行插入):

# 我的常用别名
alias ll='ls -alF'
alias logs='tail -f /www/wwwroot/coderoadmap/logs/backend.log'
alias codecd='cd /www/wwwroot/coderoadmap'
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

:wq 保存退出后让它生效并验证:

source ~/.bashrc
type ll          # ll is aliased to `ls -alF' → 生效
echo $JAVA_HOME  # 路径存在才对(没装 JDK 则先留着,包管理课会装)

步骤 5:实战二——改一份 nginx 配置

没有 nginx 就先造一份等效的练习文件;有 nginx 则走真实路径:

mkdir -p ~/vim-lab/nginx && cd ~/vim-lab/nginx
cat > default.conf <<'EOF'
server {
    listen 80;
    server_name old.example.com;
    location / {
        proxy_pass http://127.0.0.1:3000;
    }
}
EOF
vim default.conf

任务:把 old.example.com 改成 new.example.com,并把 listen 80; 下面加一行 server_name 注释说明。

/old 回车        定位到 old.example.com
cw               删除当前单词并进入插入模式(change word)
输入 new.example.com,Esc
G o              到末尾新开一行
输入 # updated by deploy 2026-10-06,Esc
:wq
cat default.conf  核对结果

真实 nginx 场景的差异只有两点:文件在 /etc/nginx/sites-available/(Ubuntu)需要 sudo vim,改完要 sudo nginx -t && sudo systemctl reload nginx 让它生效。改配置 ≠ 配置生效,这个意识从今天建立。

步骤 6:sed——不打开文件的批量替换

改单处用 vim,改多处/脚本化用 sed:

cd ~/vim-lab/nginx
cp default.conf default.conf.bak                 # 养习惯:sed -i 前先备份
sed -i 's/3000/3001/' default.conf               # 把代理端口 3000 改成 3001
grep proxy_pass default.conf                     # 验证:http://127.0.0.1:3001

sed -i 's/new\.example\.com/prod.example.com/g' default.conf
grep server_name default.conf                    # g 全局替换;. 要转义

# 不改文件,只预览替换效果(去掉 -i 就是干跑):
sed 's/prod/staging/' default.conf | grep server_name

# 行号操作:只看第 2-5 行 / 删除第 3 行
sed -n '2,5p' default.conf
sed '3d' default.conf

sed -i 的威力在自动化:CI 部署时给配置「换数据库地址」就是一条 sed,不需要人打开编辑器。

步骤 7:给 vim 一点舒适配置(可选但值得)

vim ~/.vimrc

写入(每行作用见注释):

syntax on          " 语法高亮
set number         " 显示行号(对报错定位关键)
set tabstop=4      " Tab 宽 4 格
set expandtab      " Tab 转空格(yml 文件刚需)
set hlsearch       " 搜索结果高亮
set encoding=utf-8

:wq 后新开 vim 即生效。yaml 类配置(Spring Boot 的 application.yml)对缩进敏感,expandtab 能救命。

讲清楚要点

  1. vim 的所有「怪」都源于模式制:打字是插入模式的事,导航/删除/保存是普通模式的事。卡住的第一反应永远是 Esc。
  2. nano 是合法的退路:nano 文件 底部有快捷键提示(Ctrl+O 保存、Ctrl+X 退出),初学者可先用 nano 建立信心;但 vim 的搜索、跳行、批量操作是 nano 给不了的,建议两周内切换。
  3. sudo vim 编辑系统文件,普通 vim 编辑自己的文件:/etc 下的东西(nginx、systemd、fstab)需要 root 权限,忘加 sudo 会遇到只读警告(E45),此时可用 :w !sudo tee % 应急保存。
  4. 改配置 ≠ 生效:不同服务生效方式不同——nginx 要 reload、systemd 单元要 daemon-reload、bashrc 要 source、crontab 保存即生效。这是「为什么我改了没用」的第一大原因。
  5. sed -i 是脚本化的编辑器:s/old/new/g 替换、-n 'Np' 取行、Nd 删行。批量、重复、无人值守的场景选 sed;一次性、需要判断的场景选 vim。用 -i 前先备份或先用不带 -i 的版本预览。
  6. vim 操作是「动词+数字+名词」的语法:d 删、y 复制、c 改;3 次数;dd 行、w 词、G 到尾。理解了这个语法,5dd、3yy、dw 不用背就懂了。

你可能会懵的地方

  • 不小心按到了什么,屏幕行为全变了? 大概率误入了可视模式(按过 v/V/Ctrl+v)或替换模式(R)。Esc 退出即可。偶尔按到 Ctrl+s 会让终端「假死」(XOFF 流控),按 Ctrl+q 恢复。
  • vim 里粘贴代码全乱了缩进? 自动缩进叠加了粘贴内容自身的缩进。解决:粘贴前先 :set paste,粘完 :set nopaste;或在普通模式用 +p 从系统剪贴板粘贴。
  • 编辑时提示 E45: 'readonly' option is set? 文件无写权限(多半忘了 sudo)。有两条路::q! 退出后 sudo vim 重开;或确需保存时 :w !sudo tee %。
  • vim 和 vi 是同一个东西吗? vi 是 1976 年的鼻祖,vim(Vi IMproved)是增强版。Ubuntu 里 vi 通常软链到 vim.tiny,功能阉割。认准 vim 命令。
  • 改了 .vimrc/.bashrc 当前窗口没反应? 这类文件只在 shell/vim 启动时读取。让当前会话生效:shell 用 source ~/.bashrc,vim 里用 :source ~/.vimrc 或重开。

错法对照

错法问题正解
进 vim 后一顿乱按想「试出」退出命令被误解释,文件越改越乱Esc → :q! 强退重开
:wq 保存了不想改的内容误改被固化,配置坏了拿不准就 :q!;改动前先 cp 文件 文件.bak
sudo vim /etc/nginx/nginx.conf 忘加 sudo只读保存失败 E45加 sudo;或 :w !sudo tee % 应急
直接 sed -i 改生产配置替换错了没退路先 cp x x.bak,或先跑不带 -i 的预览版
yml 文件用 Tab 缩进Spring Boot 对 yml 缩进敏感,解析报错vimrc 设 expandtab,统一空格缩进
改完 nginx 配置不 reload 就测试改动未生效,误判「改了没用」nginx -t 语法检查 + systemctl reload nginx
vimrc/.bashrc 写错导致 vim/shell 启动报错每次打开都刷错误vim -u NONE 或 cp /etc/skel/.vimrc 恢复

卡点急救

  1. 卡在 vim 里出不去:连续按几次 Esc → 输入 :q! 回车(不保存强退);要保存就 :wq。若底部出现输入过的残缺命令,Esc 清掉重来。
  2. vim 打开二进制文件(如 JAR)全是乱码:立即 :q! 退出,别保存。看二进制用 strings 文件 | head 或 xxd 文件 | head。误写坏二进制文件只能重新上传——所以编辑前先确认是文本。
  3. 误删/误改且已保存:若编辑的是配置且有 .bak 直接还原;没有备份时 vim 的 :earlier 5m(回到 5 分钟前的内容)或 :e!(放弃当前所有修改重读文件)是最后的绳索。
  4. 终端假死敲什么都没反应:先 Ctrl+q(解除 Ctrl+s 造成的流控锁),无效再从另一个窗口 SSH 进来 kill 卡住的进程。
  5. 改完配置服务不生效排查链:① 改的文件对不对(grep 关键词 配置路径);② 语法对不对(nginx -t);③ 有没有 reload(systemctl reload nginx / daemon-reload);④ 浏览器/CDN 有没有缓存。

面试常问

  • vim 的三种常用模式?如何保存退出与不保存退出? 普通模式(默认,导航与编辑命令)、插入模式(i/a/o 进入,打字)、底行/命令模式(: 引出,如 :wq 保存退出、:q! 不保存强退、:set number 设行号)。核心心智:Esc 随时回普通模式。

  • 在 vim 中如何把文件里所有 foo 替换为 bar?跳到第 100 行? 全局替换 :%s/foo/bar/g(% 表示全文,g 表示行内所有命中;加 c 每处确认::%s/foo/bar/gc);跳行 :100 回车或 100G。

  • 服务器上没有 vim 只有 vi,或你更喜欢 nano,怎么选? 都行,关键是能改、能存、能退。vim 优势在搜索跳行和 sed 式批量编辑;nano 上手零成本。团队协作认 vim 更多(运维脚本、面试默认)。sudo apt install vim 即可补齐。

  • 如何不打开文件批量修改配置?举个部署中的例子。 sed -i。例如 CI 发布时替换数据库连接:sed -i 's/DB_HOST=dev/DB_HOST=prod/g' application.properties;改 nginx 监听端口:sed -i 's/listen 8080/listen 80/' site.conf。规范做法是先备份或用版本管理。

  • 改了配置文件为什么不生效?给出你的排查顺序。 ① 确认改对了文件(服务加载的可能不是你以为的路径,如 nginx 的 sites-enabled 软链);② 语法检查(nginx -t);③ 是否执行了重载动作(reload/daemon-reload/source);④ 是否有缓存层(浏览器、CDN、连接池里的旧配置)。

自测三问

  1. 不保存并退出 vim 的完整按键序列是什么?保存并退出呢?
  2. 在 vim 中搜索 proxy_pass、跳到文件末尾、删除当前行,分别用什么命令?
  3. 把 default.conf 里所有 127.0.0.1 替换为 0.0.0.0(先备份),写出完整命令序列。

小结一句话

vim 用「模式」换来极致效率:Esc 保平安、i 进插入、:wq/:q! 管生死、/ 搜索 G 跳行 dd/yy/p 编辑;批量与自动化交给 sed -i——改配置三步曲永远是「备份 → 修改 → 重载生效」。

延伸

  • vim 官方交互教程 vimtutor(终端直接输 vimtutor 中文版可练)
  • Vim 中文文档
  • 下一课预告:进程与服务——nohup 起的服务 SSH 一断就死?学 systemd 让你的 JAR 开机自启、崩了自动拉起、日志自动归档,这才是生产级进程管理。
加载本节练习…
← 上一课常用命令下一课 →进程与服务