问题现象
用户尝试通过 SSH 远程登录 ECS Linux 实例失败,但通过阿里云控制台 VNC 登录正常。
SSH 登录失败:客户端尝试连接时立即断开或提示认证失败,查看系统安全日志(如
/var/log/secure或/var/log/auth.log),存在以下报错:User root not allowed because shell /bin/bash does not exist在VNC环境中检查
/bin/bash文件,确认文件实际存在且权限正常。
问题原因
可能是/etc/passwd文件格式异常。
Linux 系统通过 /etc/passwd 文件定义用户账户及其默认 Shell。如果该文件被错误编辑(例如在 Windows 环境编辑后上传),可能会引入不可见的特殊字符(如 Windows 的换行符 ^M 或行尾空格)。
系统读取配置时,会将这些隐藏字符视为 Shell 路径的一部分(例如读取为 /bin/bash^M 或 /bin/bash )。由于文件系统中不存在带有这些特殊后缀的文件,系统判定 Shell 不存在,从而拒绝登录。
解决方案
由于 SSH 无法登录,必须通过阿里云控制台的 VNC(远程连接)功能进入系统进行排查和修复。需按序检查文件内的隐藏字符,并恢复正确配置。
步骤一:检查 /etc/passwd 隐藏字符
此步骤旨在确认/etc/passwd文件是否存在非标准的换行符或尾部空格。
登录 ECS 控制台,通过VNC连接实例。
执行以下命令,使用
cat -A显示文件中的隐藏字符:cat -A /etc/passwd | grep root解读输出结果:
正常情况:行尾直接以
$结束。root:x:0:0:root:/root:/bin/bash$异常情况:行尾包含
^M$(DOS 格式换行)或显式的空格。root:x:0:0:root:/root:/bin/bash^M$ <-- 异常:包含 DOS 换行符 root:x:0:0:root:/root:/bin/bash $ <-- 异常:包含行尾空格
步骤二:恢复或修复配置文件
确认文件格式异常后,可选择使用系统自动备份文件恢复,或手动去除特殊字符。Linux 系统通常会自动生成 /etc/passwd- 作为备份文件。如果该备份文件内容正常,直接覆盖即可。
备份错误的配置文件,避免信息丢失:
cp /etc/passwd /etc/passwd.error.bak检查系统自动备份的
/etc/passwd-文件格式是否正常:cat -A /etc/passwd- | grep root确认输出行尾仅为
$,无其它杂质。使用系统自动生成的备份文件恢复当前异常文件:
cp /etc/passwd- /etc/passwd重要恢复完成后,建议和原错误的配置文件(
/etc/passwd.error.bak)对比,确认没有丢失关键用户数据。验证修复结果:
# 再次检查,确保无异常字符 cat -A /etc/passwd | grep root
后续建议
使用专用命令:修改用户配置时,优先使用
usermod、chsh等专用命令,避免手动直接编辑/etc/passwd文件,以此降低格式错误的风险。规范编辑操作:不要在Windows记事本中直接编辑Linux系统配置文件。建议使用
vim、nano等Linux原生编辑器。