本文主要介绍如何排查和解决,Linux实例由于SSH配置或者系统参数设置不合理导致的无法登录问题,包括SSH访问权限异常、SSH关键文件或目录丢失、SSH登录报错、实例中的服务进程未处于运行中等。
如果您需对实例进行配置与数据修改,建议您先创建快照,以便提高容错能力,确保数据安全。
由于SSH的访问权限配置异常,比如访问权限配置不足,导致的无法登录Linux实例时,您可以按照如下方式解决。
单用户进入Linux操作系统,详情请参见进入单用户模式。
执行以下命令,重置/var/empty/sshd
目录的权限。
chmod 711 /var/empty/sshd
重启实例使设置生效。
由于SSH访问所需关键文件或目录丢失,即不存在sshd_config
配置文件,导致无法登录Linux实例时,您可以按照如下方式解决。
单用户进入Linux操作系统,详情请参见进入单用户模式。
执行以下命令,检查是否存在sshd_config
配置文件。
ll /etc/ssh/sshd_config
(可选)如果存在sshd_config
配置文件,跳过该步骤;如果不存在sshd_config
文件,且您也无已备份的sshd_config.bak文件,请进行如下操作:
执行以下命令重新安装openssh-server服务。
Debian系统:sudo apt-get install --reinstall openssh-server
CentOS系统:yum reinstall openssh-server
重启实例使设置生效。
root用户通过本地SSH客户端登录Linux系统的ECS实例时,密码正确,但出现Permission denied, please try again
错误信息,或“SSH服务器拒绝了密码,请再试一次”问题时,您可以按照如下方式解决。
导致该问题原因可能是ECS实例内禁用root用户登录,或Linux系统启用了SELinux服务,导致root用户和普通用户无法登录。
登录目标实例,操作详情可参考登录Linux实例。
执行以下命令,查看PermitRootLogin
或PasswordAuthentication
配置。
cat /etc/ssh/sshd_config
如果PermitRootLogin
和PasswordAuthentication
参数设置为no
,表示禁止root用户登录,也禁止以密码方式登录,请继续以下操作。反之,请跳过本小节,在SELinux服务引起的问题中排查并解决。
修改PermitRootLogin
和PasswordAuthentication
参数配置。
vi /etc/ssh/sshd_config
修改PermitRootLogin
和PasswordAuthentication
参数值配置。
如果需要root用户登录,请将PermitRootLogin
参数值设置为yes
。
如果需要密码方式登录,请将PasswordAuthentication
参数值设置为yes
。
按“Esc”按键,输入:wq
保存修改。
执行如下命令,重启SSH服务后生效。
systemctl restart sshd.service
您可以根据实际情况,选择临时或永久关闭SELinux服务解决SSH连接异常问题。
步骤一:检查SELinux服务状态
登录目标实例,操作详情可参考登录Linux实例。
执行如下命令,查看当前SELinux服务状态。
/usr/sbin/sestatus -v
回显类似如下信息:
SELinux status: enabled
SELinux status: disabled
enabled:SELinux服务处于开启状态。
disabled:SELinux服务处于关闭状态。
步骤二:关闭SELinux服务
您可以根据实际情况临时关闭SELinux服务(重启后会失效)或永久关闭SELinux服务。
临时关闭SELinux服务
执行如下命令,临时关闭SELinux。
setenforce 0
永久关闭SELinux服务:
vim /etc/selinux/config SELINUX=disabled
:wq
保存。当服务进程未处于运行中(未处于监听状态)时,可能导致您无法访问Linux实例,您可以通过启动常见服务的方法解决该类问题,下文以CentOS 7系统为例说明。
以下列举Linux实例中常见的服务以及对应服务未运行时产生的影响。
服务名称 | 描述 | 默认监听的端口 | 未运行时的影响 |
---|---|---|---|
SSH | 远程连接 | 22 | 无法通过SSH远程连接 |
Web | Web网站服务 | 80(HTTP)、443(HTTPS) | 无法访问网站 |
MySQL | MySQL数据库 | 3306 | 无法访问数据库 |
登录目标实例,操作详情可参考登录Linux实例。
执行以下命令,检查目标服务的端口监听状态。
netstat -ntlp | grep [$Port]
[$Port]指目标服务监听的端口,请以实际情况为准。如果您修改过目标服务默认的端口,请替换为修改后的端口号。
执行以下命令,启动目标服务。
systemctl start [$Service]
说明
[$Service]指目标服务的名称,以实际情况为准。
如果需启动的是SSH服务,则服务名称为sshd
。
如果需启动的是第三方服务,例如“Nginx”、“Tomcat”、“MySQL”等,请查阅第三方服务的官方网站,获取对应的启动命令。
执行以下命令,检查目标服务的状态。
systemctl status [$Service]
返回结果如下图,表示目标服务处于running状态。
此处以SSH服务为例,请以实际情况为准。
执行以下命令,检查目标服务的端口监听状态。
netstat -ntlp | grep [$Port]
返回结果如下图,表示目标服务的端口处于监听状态,即目标服务已经处于运行状态。