从 root + 密码 到 普通用户 + SSH 密钥:我整理出的一套 Linux VPS 迁移经验
刚拿到一台新 VPS 的时候,商家通常给你的都是一套最直接的登录方式:
- 一个公网 IP
- 一个
root用户 - 一串登录密码
从“先用起来”这个角度说,这没有问题。毕竟你第一时间想做的,往往只是先连上服务器、把环境跑起来、确认机器没问题。
但如果你准备长期用这台机器,或者你后面还要管理不止一台 VPS,那么继续长期依赖 root + 密码,基本就只是“能用”,谈不上“合适”。
我后来把自己的 VPS 登录方式,逐步改成了:
- 平时不用
root直接登录 - 新建一个普通用户,比如
ops - 需要管理系统时,用
sudo临时提权 - 登录方式尽量切到
SSH 密钥
这篇文章不是在讲一套抽象的安全理论,而是把我自己整理出来的一套迁移顺序和踩坑经验,写成一篇能直接看懂、也能直接照做的分享。
如果你现在手上的 VPS 也是商家刚交付的默认状态,这篇文章应该会比较适合你。
为什么我不建议长期直接用 root + 密码
一开始我也会直接用 root 登录,因为方便,所有事情都能做,几乎没有门槛。
但这个模式的问题也很明显。
第一,风险太集中。
root 是 Linux 里权限最高的账号,一旦密码泄露,或者你在某个不安全的环境里误用了它,损失就是整台机器级别的。
第二,不利于后续管理。
如果你以后要把服务器接入自动化脚本、部署流程、主控机、远程 agent,长期直接使用 root 会让权限边界非常模糊。很多事情“现在也能做”,但后面会越来越乱。
第三,容易犯低级错误。
平时就以最高权限工作,意味着很多本来应该被拦住的误操作,都可能直接生效。删错文件、改错权限、执行错命令,代价都会放大。
所以我后来越来越倾向于把 VPS 调整到一种更稳的状态:
- 普通操作用普通用户
- 系统管理时再
sudo - 尽量不用密码登录
- 登录凭证改成 SSH 密钥
它未必是最复杂、最“高级”的方案,但对大多数个人开发者、独立部署者、小规模多机管理场景来说,已经足够实用。
我真正想要的,不是“更安全”三个字,而是更清晰的管理方式
很多文章讲这类话题时,容易一上来就强调安全。但我自己后来发现,驱动我去改这件事的,不只是“安全”,更是“清晰”。
我希望服务器的权限结构是清楚的:
- 谁负责登录
- 谁能提权
- 哪把密钥对应哪台机器
- 如果将来不用了,应该删哪个用户、删哪把公钥、查哪些残留
当一台机器只有你自己在用时,你可能感觉不到这种差异。
但只要机器数量开始增加,或者你开始引入脚本、自动化、远程协作,这种“清晰”会比“先凑合用”重要得多。
所以后来我的思路变得很固定:
- 商家交付的
root + 密码先作为起点 - 尽快创建一个普通用户
- 给这个用户配好
sudo - 用 SSH 公钥完成登录切换
- 确认一切稳定之后,再考虑关掉
root直登和密码登录
这个顺序本身,比单个命令更重要。
我最想先提醒的一句话:不要太早关闭 root 和密码登录
如果只让我从整件事里挑出一条最重要的经验,那就是这句:
在你确认新用户和 SSH 密钥都能稳定登录之前,不要急着关闭 root,也不要急着关闭密码登录。
这是最容易把人锁在服务器外面的地方。
很多人不是不会建用户,也不是不会配公钥,而是太着急“做完整套加固”。结果新用户还没测试透,sshd_config 已经先改了;root 还没来得及兜底,入口已经关了。
只要顺序错了,事故就很容易发生。
我的做法一直很保守:
- 当前
root会话不要关 - 新开一个终端测试新用户登录
- 测试
sudo - 再开一次新连接重复验证
- 确认密钥真的在自己机器上可用
- 这些都没问题之后,再谈进一步加固
这看起来慢一点,但它比“觉得自己应该没问题”可靠得多。
我实际采用的迁移顺序
1. 先继续用商家给的 root + 密码 登录
这一步没有什么好羞耻的。
既然机器刚交付就是这个状态,那就先用它把过渡动作完成。
重点不在于“永远别用 root”,而在于“不要长期只用 root”。
2. 创建一个普通用户
我一般会先建一个用于日常管理的普通用户,比如:
adduser ops这一步通常会顺带创建:
- 用户本身
- 家目录
/home/ops - 一些默认初始化配置
建完以后,我会立刻看一眼:
id ops这一步我后来越来越重视,因为它不仅能确认用户建好了,还能顺便看到这个用户的 UID。
如果将来你想删除这个用户并检查残留,UID 会比用户名更可靠。
3. 给普通用户加 sudo
在 Ubuntu / Debian 上,我通常这样做:
usermod -aG sudo ops在 CentOS / Rocky / AlmaLinux 这类系统里,常见的是:
usermod -aG wheel ops这一点特别容易让刚上手的人迷糊,因为很多教程默认只写一种发行版。
但实际操作时,你只要记住一件事:不同系统的管理员组名可能不一样。
加完组之后,我会再执行一次:
id ops确认它已经进了正确的组。
4. 在自己的电脑上准备 SSH 密钥
这一步不是在 VPS 上做,而是在你本机做。
我会先看本地有没有现成密钥:
ls -la ~/.ssh如果已经有,比如:
id_ed25519id_ed25519.pubid_rsaid_rsa.pub
那就先判断这把密钥是不是你打算继续使用的。
如果没有,或者你想为 VPS 单独准备一把,我更推荐一开始就明确指定文件名,而不是一路回车生成默认文件。
比如:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_vps_main -C "wang-mac-vps-main"我后来很确定的一点是:
-C 只是备注,真正决定会不会跟旧密钥混在一起的,是 -f。
如果你不写 -f,SSH 很可能还是默认生成到:
~/.ssh/id_ed25519~/.ssh/id_ed25519.pub这就意味着你以后再生成别的默认密钥时,很容易遇到覆盖、混淆,或者你自己都分不清哪把钥匙对应哪台机器。
从长期管理角度看,一开始就把名字起清楚,后面会轻松很多。
5. 只把公钥放到服务器上
这一点听起来像常识,但真的是高频坑。
上传到服务器上的,应该是公钥,也就是 .pub 结尾的那个文件内容;私钥必须只留在你自己的电脑里。
查看公钥内容可以直接用:
cat ~/.ssh/id_ed25519_vps_main.pub复制那一整行内容,后面写到 VPS 的 authorized_keys 里。
6. 回到 VPS,把公钥配置到新用户下面
我通常会这样做:
mkdir -p /home/ops/.sshnano /home/ops/.ssh/authorized_keyschmod 700 /home/ops/.sshchmod 600 /home/ops/.ssh/authorized_keyschown -R ops:ops /home/ops/.ssh这里真正关键的不是“用哪个编辑器”,而是两件事:
- 公钥要粘贴完整
- 权限要正确
SSH 对权限是比较挑剔的。
哪怕你的公钥内容没问题,只要 .ssh 目录或 authorized_keys 权限不对,密钥登录仍然可能失败。
我一般会再检查一遍:
ls -ld /home/ops/.sshls -l /home/ops/.ssh/authorized_keys理想状态通常是:
drwx------ 2 ops ops ...-rw------- 1 ops ops ...7. 新开终端测试,不要关掉当前 root 会话
这一步我会单独强调,因为它是迁移过程里最有“分水岭”意义的一步。
不要在当前 root 会话里自我感动地觉得“应该差不多了”。
直接新开一个终端,像真实登录那样去测。
如果你的私钥是默认文件名,可能直接这样就能连:
ssh ops@你的服务器IP如果你用了自定义文件名,就明确指定:
ssh -i ~/.ssh/id_ed25519_vps_main ops@你的服务器IP登录成功以后,再看两眼:
whoamipwd理想情况下,应该看到:
ops/home/ops这一步失败了,就先排错,不要继续往后推。
8. 测试 sudo
如果我已经能用 ops 登录,下一步一定会测提权是否正常:
sudo -lsudo whoami如果最后输出的是:
root那就说明这次迁移最核心的两件事已经成立了:
- 我可以不用
root直接登录 - 我需要系统权限时仍然能拿到 root 能力
到了这里,我才会觉得“迁移初步成功”。
到什么程度,我才会考虑关掉 root 和密码登录
我不会在第一次测试刚成功时,立刻去改 SSH 加固配置。
至少要满足下面这些条件,我才会继续:
ops可以稳定 SSH 登录ops登录后sudo正常- 私钥确实在我自己的电脑上能用
- 我已经用新终端重复测试过,不是只成功过一次
如果这些都没问题,后面才值得考虑:
禁止 root 直接 SSH 登录
通常涉及修改:
/etc/ssh/sshd_config常见配置项是:
PermitRootLogin no禁止密码登录,只保留密钥
同样是在 SSH 配置里,常见相关项是:
PasswordAuthentication noPubkeyAuthentication yes但我的建议一直是一样的:
第一天先不要着急把所有安全动作一次做满。
先把一台机器跑顺,再复制到别的机器,效率反而更高。
如果以后不用这个用户了,我会怎么删
有时候迁移完成以后,你会想做反向操作,比如删掉某个旧用户,或者撤销某个临时运维账号。
最常见的删除方式是:
userdel -r ops这通常会一起删掉:
- 用户账号
- 家目录
.ssh目录- 用户自己的大多数配置文件
如果你的目标只是“不让这个用户再登录”,那很多时候到这里已经够了。
真想删得更干净,我会先记 UID 再删除
这是我后来才逐渐养成的习惯,而且很值得保留。
很多人删完用户后,会习惯性执行:
find / -user ops 2>/dev/null这个写法的问题在于:
用户删掉以后,用户名解析有时就不可靠了,查出来的结果不一定完整,甚至可能直接失效。
所以更稳的做法是:
第一步:删除前先记住 UID
id ops如果你看到:
uid=1001(ops)那就把 1001 记下来。
第二步:删用户
userdel -r ops第三步:按 UID 查残留
find / -uid 1001 2>/dev/null这样查文件残留会更稳。
还有一种残留,很多人会忘:sudoers 配置
如果你之前不是只把用户加进 sudo 或 wheel 组,而是给它单独写过 sudo 规则,比如:
/etc/sudoers.d/ops那删除用户之后,最好顺手检查一下:
ls -l /etc/sudoers.d/如果里面确实还有这个用户对应的规则文件,再手动删掉。
这里我自己的原则是:
- 尽量不要直接乱改
/etc/sudoers - 真要改,用
visudo - 更推荐把单独规则放在
/etc/sudoers.d/里管理
这样既清晰,也更不容易因为语法问题把 sudo 整体搞坏。
这件事里,我觉得最容易踩的几个坑
1. 太早禁用 root
这是最经典的一种翻车方式。
新用户还没验证透,就把 root 入口关掉,结果发现自己进不去了。
2. authorized_keys 权限不对
很多人会反复怀疑公钥粘错了,但其实问题只是权限不对。
这三个命令值得反复确认:
chmod 700 /home/ops/.sshchmod 600 /home/ops/.ssh/authorized_keyschown -R ops:ops /home/ops/.ssh3. 把私钥传到了服务器
服务器上只需要公钥。
私钥应该只放在你自己的电脑里。
4. 测试时还在用错用户名
你明明是在验证新用户,却还是下意识连成:
ssh root@服务器IP这样测不出任何迁移结果。
真正该测的是:
ssh ops@服务器IP5. 把 -C 备注当成“不会覆盖旧密钥”的关键
这个误解很常见。
真正决定输出文件名的是 -f,不是 -C。
如果你想长期清晰管理多把密钥,最务实的办法就是:
ssh-keygen -t ed25519 -f ~/.ssh/自定义文件名 -C "备注"如果你手上有十几台 VPS,我的建议反而是先慢一点
很多人一旦把这套流程理解了,就会很想一次性把所有机器都改完。
但从经验上看,最稳的做法通常不是“立刻批量推进”,而是:
- 先挑一台最不重要的机器
- 完整走一遍迁移流程
- 把登录、提权、密钥、回滚思路都确认清楚
- 再复制到其他机器
你只要把一台机器跑顺,后面的十几台大概率就只是重复动作。
真正难的不是命令本身,而是第一次把顺序和判断边界搞清楚。
最后总结:这不是“高级操作”,而是一套更稳的起手式
回头看,我觉得这件事最有价值的地方,不是学会了几个 Linux 命令,而是把一台 VPS 从“商家默认交付状态”,调整成了“适合长期自己管理的状态”。
如果把整套经验压缩成最小版本,其实就是下面这些:
VPS 上执行
adduser opsusermod -aG sudo opsmkdir -p /home/ops/.sshnano /home/ops/.ssh/authorized_keyschmod 700 /home/ops/.sshchmod 600 /home/ops/.ssh/authorized_keyschown -R ops:ops /home/ops/.ssh本机测试
ssh -i ~/.ssh/id_ed25519_vps_main ops@你的服务器IPsudo -lsudo whoami确认都没问题之后,再决定是否继续做更严格的 SSH 加固。
如果你现在正准备从 root + 密码 迁到 普通用户 + SSH 密钥,我最想重复的仍然是那句话:
先把登录链路走通,再做封口动作。
这句话,往往比多背几个命令更重要。