起因

passwd 文件控制着我登录系统时候默认使用的 shell, 我会频繁的在 bash 和 zsh 之间切换, 所以想尝试使用命令行语句来快速切换. 今天心比较大, 没有做任何测试, 就拿着 sed- i(源文件上直接修改) 命令开始干了:

sudo sed -i /etc/passwd -ne /lane/s/bash/zsh/

插入一下, 这里好像可以用 chsh 命令, 比如:

# 查看可用 shell
chsh -l

# 设置新 shell, 需要指定绝对路径
chsh -s /usr/bin/bash

最开始没加 sudo 失败了, 毫不犹豫加上 sudo 再干一次. 然后 passwd 文件就空了. 至于这条命令怎么让文件变空的, 我回头再研究下.

研究完了, sed -n 参数导致默认的 print 语句被屏蔽了, 于是整条 sed 命令没有输出, 于是写回原文件的就是空字符串, 于是文件就被清空了. 即使我在整个语句最后改成 /lane/s/bash/zsh/p, 加上 p 命令, 也只是把整个文件变成一行, 因为只有出现了 lane 字样的这行信息才回被 print, 才会被保留下来.
 
所以结论是: 不要随便加上 -n, 除非你很清楚你在干啥...

关键是变空了以后就麻烦了, 我登录的是一个普通用户 lane, 其实 passwd 文件里的内容正好 terminal 上是打印出来了的, 倒是没有丢信息. 不过尴尬的就在于, 大家都知道 passwd 文件是属于 root 用户的, 不是 root 无法修改. 虽然我的用户 lane 是 sudoer, 但是 passwd 丢失后, 系统就不认识我了啊, 它就不知道我是 sudoer 了:

[lane@vbox /]$ sudo vim /etc/passwd
sudo: unknown uid 1000: who are you?

于是就悲剧了: 要使用 root 权限需要先修改 passwd, 要修改 passwd 我需要先拿到 root 权限.

死锁.

解决

查询后得知可以使用 CentOS 的 single user mode 来恢复:

  • 重启系统, 选择 Kernel 界面时, 点击 e 键, 进入 single user mode.
  • 下划找到 linux 16 or linuxefi 打头的那行(大概是倒数第二行), 找到其中的 ro 关键字, 修改为 rw init=/sysroot/bin/sh. 点击 Ctrl + x 组合键.
  • 很快会登录到系统, 但是暂时无法使用 vim 甚至 nano. 此时输入 chroot /sysroot, 这样就可以使用我们之前的所有工具(比如 vim).
  • 一般来说, passwd 有一个备份文件 passwd-, 所以我们可以使用 cp /etc/passwd- /etc/passwd 来恢复文件. 不过这次我是有 passwd 的完整内容的, 于是我就手动使用 vim 恢复了.
  • 最后 reboot. 至此, 问题完全解决.

参考链接

后记

话说写这篇文章的时候, 我想去把 passwd 文件备份一下, 于是愉快地(手贱地)敲下 mv /etc/passwd /etc/passwd-, 于是又悲剧了.

不过家中有粮, 心中不慌.

我又一次熟练地重启进入 single user mode, 很快恢复了正常状态...

Comments
Write a Comment