如何排查使用 SFTP 连接来连接到我的 EC2 Linux 实例时遇到的问题?

上次更新时间:2021 年 5 月 4 日

我无法使用安全文件传输协议(SFTP)连接来连接到我的 Amazon Elastic Compute Cloud(Amazon EC2)Linux 实例。或者,我收到错误消息“remote readdir Permission denied”(远程 readdir 权限被拒绝)。我应该如何排查此问题?

简短描述

通过 SFTP 连接来连接到 EC2 实例可能会失败的原因有很多。以下是常见连接问题的故障排除步骤:

  • 验证您的实例满足了 SSH 连接先决条件。
  • 在启用详细消息时登录实例以找出错误。
  • 审核身份验证和系统日志中是否存在错误。
  • 验证 SSHD 配置文件已配置了 SFTP 的子系统。
  • 解决 Remote readdir Permission denied(远程 readdir 权限被拒绝)错误。

解决方法

验证您的实例满足了 SSH 连接先决条件

SFTP 的基础是 SSH。验证实例是否满足 SSH 连接的所有先决条件。有关先决条件列表,请参阅使用 SSH 连接到 Linux 实例

在启用详细消息时登录实例以找出错误

常见的连接错误消息如下:

  • Connection timed out(连接超时)或 Connection refused(连接被拒绝)
  • Permission denied(权限被拒绝)或 Authentication failed(身份验证失败)
  • Server refused our key(服务器拒绝了我们的密钥)

有关在启用详细消息时登录实例以及如何解决这些错误和其他 SSH 相关错误的信息,请参阅如何排查使用 SSH 连接到我的 Amazon EC2 Linux 实例时遇到的问题?

如果您启用了 EC2 串行控制台,则可以使用它来排查受支持的基于 Nitro 的实例类型问题。串行控制台可帮助您排查启动问题、网络配置和 SSH 配置问题。串行控制台无需网络连接即可连接到您的实例。您可以使用 Amazon EC2 控制台或 AWS 命令行界面(AWS CLI)访问串行控制台。

在使用串行控制台之前,请在账户层面授予对串行控制台的访问权限。然后,创建 AWS Identity and Access Management(IAM)策略,授予对 IAM 用户的访问权限。此外,每个使用串行控制台的实例都必须至少包含一个基于密码的用户。有关配置 EC2 串行控制台的信息,请参阅配置对 EC2 串行控制台的访问权限

注意:如果在运行 AWS 命令行界面(AWS CLI)命令时遇到错误,请确保您使用的是最新版的 AWS CLI

审核身份验证和系统日志中是否存在错误

RHEL 和 Fedora 身份验证日志:

$ sudo less /var/log/secure

RHEL 和 Fedora 通用系统日志:

$ sudo less /var/log/messages

Debian 和 Ubuntu 身份验证日志:

$ sudo less /var/log/auth.log

Debian 和 Ubuntu 通用系统日志:

$ sudo less /var/log/syslog

验证 SSHD 配置文件已配置了 SFTP 的子系统

验证 SSHD 配置文件已配置了 SFTP 的子系统,并且 sftp-server 的共享对象文件存在于相应的目录中。如果 SFTP 连接由于缺少 SFTP 子系统而关闭,则日志可能会显示 subsystem request failed on channel 0(子系统请求在通道 0 失败)错误。

基于 RHEL 和 Fedora 的发行版:

$ sudo grep Subsystem /etc/ssh/sshd_config
Subsystem sftp    /usr/libexec/openssh/sftp-server
$ sudo ls -l /usr/libexec/openssh/sftp-server
-rwxr-xr-x. 1 root root 100784 Jun 26  2019 /usr/libexec/openssh/sftp-server

基于 Debian 和 UbuntuU 的发行版:

$ sudo grep Subsystem /etc/ssh/sshd_config
Subsystem    sftp    /usr/lib/openssh/sftp-server
$ sudo ls -l /usr/lib/openssh/sftp-server
-rwxr-xr-x 1 root root 105608 Mar  4  2019 /usr/lib/openssh/sftp-server

有关更多信息,请参阅 Linux 手册页 sshd_config 中的 Subsystem(子系统)部分。

解决远程 readdir 权限被拒绝错误

错误 remote readdir Permission denied(远程 readdir 权限被拒绝)表示尝试使用 SFTP 连接的用户没有正确的权限。用户必须至少拥有读取和执行权限才能切换到目标目录。

使用以下命令验证用户拥有访问目标目录的权限:

ls -ldZ /directory

使用以下命令检查是否存在限制用户访问的访问控制列表 (ACL) 权限:

getfacl /directory

使用以下命令验证 SELinux 已启用:

getenforce

如果启用了 SELinux,则根据 SELinux 上下文查看 /var/log/audit/audit.log/var/log/audit.log 中是否存在权限被拒绝的错误。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?