系统信息
系统版本:Ubuntu 20.04.4 LTS
云服务商:阿里云
起因
昨天,我尝试在服务器上安装了 zsh
(一个终端工具,提供了一些增强功能)。
安装命令如下:
sudo apt-get update
sudo apt-get install zsh -y
安装之后,使用以下命令切换当前用户的默认终端:
chsh -s /usr/bin/zsh
至此一切正常,但我希望更换回原先的 bash
终端继续使用,于是我运行了下列命令:
chsh -s /bin/bash
输入命令后,被告知需要密码确认,输入当前登录用户(root
)的密码提示错误,终端也没有成功切换。
报错信息中有关于 PAM
的提示,这是一个在 Linux 上进行鉴权的工具,此前我没有修改过相关设置。
为了确认修改是否生效,我断开了 SSH 连接并尝试重连,发现无法正常连接。
查看报错信息,发现错误原因是鉴权失败,输入当前用户密码也无法正常通过验证。
定位问题原因
使用阿里云 App 查看实例状态,确认实例在线,查看 CPU、内存、硬盘监控图表,均在正常范围内。
尝试访问该服务器上运行的几个服务,均可以正常使用,排除服务器系统故障导致的无法登录。
初步评估影响范围,确认没有影响用户正常使用服务。
为防止误操作加剧问题,使用阿里云 App 创建磁盘快照。
登录阿里云控制台,使用远程命令功能,尝试向服务器发送命令。
ls
返回结果为当前目录的文件,我设置的默认目录为 /home
,至此可确认用户权限正常。
chsh -s /bin/bash
执行失败,返回结果如下:
Password: chsh: PAM: Authentication failure
尝试切换到 zsh
会出现相同报错。
查看系统用户列表:
cat /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog
tty:x:5:syslog
(以下省略)
root
用户依然存在,排除用户被删除导致的登录失败。
查看用户与密码信息:
cat /etc/passwd
root:x:0:0:root:/home:/bin/hash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
定位到问题原因:在执行命令 chsh -s /bin/bash
时,出现了误操作,导致当前用户默认 Shell 被切换为 hash
,而 /bin
目录下显然不存在该文件,因此导致登录失败。
修复 Shell 错误问题
使用 cat
命令查看 /etc/passwd
文件,并将其内容保存到本地。
编辑该文件,将 root
用户的默认 Shell 修改回 /bin/bash
。
使用远程文件功能,将该文件上传到对应目录,并覆盖原先的文件:
[图片上传失败...(image-f2833c-1656772707637)]
完成后 cat
该文件,确认修改生效。
通过 VNC 登录并修复 SSH
登录阿里云控制台,选择实例进行 VNC 远程连接:
[图片上传失败...(image-a17fb6-1656772707637)]
输入 VNC 密码(与实例密码不同,可以重置),成功连接到实例。
使用 htop
命令确认服务器运行正常,ctop
命令确认使用 Docker
部署的几个服务均在正常运行。
(如果有必要,这时可以对重要的数据进行备份操作)
此时再次通过 SSH 进行连接,报错如下:
connection error (1005): Socket error: Connection reset by peer
(此时应该使用 netstat
命令确认 22 端口开放情况,当时没有尝试)
不再出现鉴权问题,说明用户登录部分已经恢复正常。
初步怀疑是对 /etc/passwd
文件的修改影响到了 sshd
服务的正常运行,进而导致连接失败。
尝试重启 sshd
服务:
systemctl restart sshd
重启失败,查看报错信息:
systemctl status sshd
发现服务处于停止状态,查找相关报错信息,根据资料,执行以下命令:
groupadd -g 33 sshd
useradd -u 33 -g 33 -c sshd -d / sshd
再次尝试启动 sshd
:
systemctl start sshd
使用 systemctl status sshd
查看服务状态,已变为 active (running)
。
尝试通过 SSH 连接服务器,已经恢复正常。
修复 APT Warning 问题
恢复 SSH 登录后,确认当前 Shell 为 bash
,执行命令,卸载 zsh
:
apt uninstall zsh
apt autoremove
发现在 APT 命令执行后会输出警告信息:
W: No sandbox user '_apt' on the system, can not drop privileges
搜索该问题,根据资料,执行以下命令:
sudo adduser _apt --force-badname
提示输入密码时,按回车键即可。
再次运行 APT 命令,警告信息已消失。
故障影响
该问题导致服务器不可登录约两小时。
问题未对运行的服务产生影响,未产生安全性问题。
问题复盘
直接原因:在未经测试的情况下更改服务器 Shell 环境。
根本原因:将当前用户的默认 Shell 误更改为不存在的文件。
解决思路:
- 确认服务器是否正常运行
- 尝试访问服务,初步评估影响范围
- 使用远程命令定位问题原因
- 通过编辑文件并覆盖上传修复问题
- 使用 VNC 远程连接恢复访问
- 具体评估影响范围
- 修复 SSH 服务
- 消除附加影响
相关命令:
- htop:查看系统性能信息
- ctop:查看容器信息
- cat:查看文件内容
- chsh:更改当前用户的默认 Shell
- netstat:查看网络端口开放情况
相关知识点:
- Linux 系统用户概念
- 用户相关系统文件的作用
- SSH 连接基本原理
- 服务的启动 / 停止 / 重启
- VNC 连接基本原理
避免该问题的措施:
- 尝试未完全掌握的命令与工具前,先在本地进行测试
- 出现鉴权问题时暂时不关闭当前连接,而是重新打开一个连接
- 执行重要命令时多次确认
- 加强数据备份
网友评论