我无法通过安全文件传输协议(SFTP)连接到 Amazon Elastic Compute Cloud(Amazon EC2)Linux 实例。或者,我收到错误消息“远程 readdir 权限被拒绝”。
解决方案
您无法通过 SFTP 连接到 EC2 实例的原因有很多。要对连接进行故障排除,请完成以下步骤。
验证您的实例是否满足 SSH 连接先决条件
SFTP 在 SSH 的基础上运行。验证实例是否满足所有 SSH 连接先决条件。有关先决条件列表,请参阅使用 SSH 从 Linux 或 macOS 连接到 Linux 实例。
在开启详细消息的情况下登录实例以识别错误
您可能会收到以下常见连接错误之一:
- 连接超时或连接被拒绝
- 权限被拒绝或身份验证失败
- 服务器拒绝了我们的密钥
有关详细消息以及如何解决 SSH 错误的更多信息,请参阅如何解决使用 SSH 连接 Amazon EC2 Linux 实例时出现的问题?
如果您启用了 EC2 Serial Console,则可以将其用于对受支持的基于 Nitro 的实例类型进行故障排除。Serial Console 可帮助您解决启动问题、网络配置和 SSH 配置问题。Serial Console 无需有效的网络连接,即可连接到您的实例。您可以使用 Amazon EC2 控制台或 AWS 命令行界面(AWS CLI)来访问 Serial Console。
在使用 Serial Console 之前,在账户级别授予其访问权限。然后,创建 AWS Identity and Access Management(IAM)策略,向您的 IAM 用户授予访问权限。每个使用 Serial Console 的实例都必须包含至少一个基于密码的用户。有关详细信息,请参阅配置对 EC2 Serial Console 的访问。
**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
查看身份验证和系统日志中是否存在错误
Amazon Linux、Amazon Linux2、RHEL 和 Fedora 身份验证日志
$ sudo less /var/log/secure
Amazon Linux、Amazon Linux2、RHEL 和 Fedora 通用系统日志
$ sudo less /var/log/messages
Debian 和 Ubuntu 身份验证日志
$ sudo less /var/log/auth.log
Debian 和 Ubuntu 通用系统日志
$ sudo less /var/log/syslog
Amazon Linux 2023
查看 SSHD 日志:
journalctl -u sshd
查看通用系统日志:
journalctl -a
验证 SSHD 配置文件中是否配置了 SFTP 子系统
验证 SSHD 配置文件是否配置了 SFTP 的子系统,以及相应目录中是否存在 sftp-server 的共享对象文件。如果 SFTP 连接因缺少 SFTP 子系统而关闭,则日志可能会显示子系统请求在通道 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 和 Ubuntu 的发行版
$ 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 man 帮助页面 sshd_config 中的 Subsystem 部分。
解决远程 readdir 权限被拒绝错误
远程 readdir 权限被拒绝错误表示用户没有连接到 SFTP 的正确权限。用户必须至少具有读取和执行权限才能切换到目标目录。
验证用户是否有权访问目标目录:
ls -ldZ /directory
检查限制用户访问的访问控制列表(ACL)权限:
getfacl /directory
确认您已激活 SELinux:
getenforce
如果您激活了 SELinux,请根据 SELinux 上下文查看 /var/log/audit/audit.log 或 /var/log/audit.log 是否存在权限被拒绝的错误。