起因
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, 很快恢复了正常状态...