

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用客户端通过服务器端点传输文件
<a name="transfer-file"></a>

通过在客户端中指定传输操作，您可以通过 AWS Transfer Family 服务传输文件。 AWS Transfer Family 支持以下客户端：
+ 我们支持 SFTP 协议的第 3 版。
+ OpenSSH (macOS 和 Linux)
**注意**  
此客户端仅适用于启用了 Secure Shell (SSH) 文件传输协议 (SFTP) 的服务器。
+ WinSCP（仅 Microsoft Windows）
+ Cyberduck（Windows、macOS 和 Linux）
+ FileZilla （Windows、macOS 和 Linux）

以下限制适用于每个客户端：
+ 不支持 SCP 协议，因为它被认为是不安全的。您可以按中所述使用 OpenSSH `scp` 命令。[使用 `scp` 命令](#openssh-scp)
+ 每个连接的并发、多路复用、SFTP 会话的最大数量为 10。
+ 对于空闲连接，所有协议 () 的超时值均为 1800 秒（30 分钟SFTP/FTP/FTPS）。如果在此期间之后没有任何活动，则客户端可能会断开连接。对于无响应的连接：
  + 当客户端完全无响应时，SFTP 会有 300 秒（5 分钟）的超时时间。
  + FTPS 和 FTP 有大约 10 分钟的无响应超时，由底层库处理。
+ 亚马逊 S3 和 Amazon EFS（由于 NFSv4 协议）要求文件名采用 UTF-8 编码。使用不同的编码可能会导致意想不到的结果。对于 Amazon S3，请参阅[对象密钥命名指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines)。
+ 对于 安全文件传输协议 (FTPS)，仅支持显式模式。不支持隐式模式。
+ 对于文件传输协议 (FTP) 和 FTPS，仅支持被动模式。
+ 对于 FTP 和 FTPS，仅支持流模式。
+ 对于 FTP 和 FTPS，仅支持 Image/Binary 模式。
+ 对于 FTP 和 FTPS，数据连接的 TLS-PROT C（未受保护）TLS 是默认值，但是 AWS Transfer Family FTPS 协议不支持端口 C。因此，对于 FTPS，您需要发出 PROT P，您的数据操作才能被接受。
+ 如果您使用 Amazon S3 作为服务器存储，并且您的客户端包含使用多个连接进行单次传输的选项，请务必禁用该选项。否则，上传大文件可能会突然失败。请注意，如果您使用 Amazon EFS 作为存储后端，EFS *确实*支持多个连接进行单次传输。

以下是 FTP 和 FTPS 的可用命令列表：


| 可用命令 | 
| --- | 
| ABOR | FEAT | MLST | PASS | RETR | STOR | 
| AUTH | LANG | MKD | PASV | RMD | STOU | 
| CDUP | LIST | MODE | PBSZ | RNFR | STRU | 
| CWD | MDTM | NLST | PROT | RNTO | SYST | 
| DELE | MFMT | NOOP | PWD | SIZE | TYPE | 
| EPSV | MLSD | OPTS | QUIT | STAT | USER | 

**注意**  
不支持 APPE。

对于 SFTP，目前不支持在使用 Amazon Elastic File System (Amazon EFS) 的服务器上使用逻辑主目录的用户执行以下操作。


| SFTP 命令不受支持 | 
| --- | 
| SSH\$1FXP\$1READLINK | SSH\$1FXP\$1SYMLINK | SSH\$1FXP\$1STAT（当请求的文件是符号链接时） | SSH\$1FXP\$1REALPATH（当请求的路径包含任何符号链接组件时） | 

**生成公有-私有密钥对**  
 在传输文件之前，必须有可用的公有-私有密钥对。如果您之前没有生成过密钥对，请参阅 [为服务托管用户生成 SSH 密钥](sshkeygen.md)。

**Topics**
+ [可用SFTP/FTPS/FTP命令](#transfer-sftp-commands)
+ [查找您的 Amazon VPC 端点](#find-vpc-endpoint)
+ [避免 `setstat` 错误](#avoid-set-stat)
+ [使用 OpenSSH](#openssh)
+ [使用 WinSCP](#winscp)
+ [使用 Cyberduck](#cyberduck)
+ [使用 FileZilla](#filezilla)
+ [使用 Perl 客户端](#using-clients-with-perl-modules)
+ [使用 LFTP](#using-client-lftp)
+ [上传后处理](#post-processing-upload)
+ [SFTP 消息](#sftp-transfer-activity-types)

## 可用SFTP/FTPS/FTP命令
<a name="transfer-sftp-commands"></a>

下表描述了 SFTP AWS Transfer Family、FTPS 和 FTP 协议的可用命令。

**注意**  
该表提到了仅支持存储桶和对象的 Amazon S3 的*文件*和*目录*：无层次结构。但是，您可以在对象键名称中使用前缀来暗示层次结构，并以类似于文件夹的方式组织数据。*Amazon Simple Storage Service 用户指南*中的[使用对象元数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html)中描述了该行为。


**SFTP/FTPS/FTP 命令**  

| 命令 | Amazon S3 | Amazon EFS | 
| --- | --- | --- | 
| cd | 支持 | 支持 | 
| chgrp | 不支持  | 支持（仅 root 或 owner） | 
| chmod | 不支持 | 支持（仅 root） | 
| chmtime | 不支持 | 支持 | 
| chown | 不支持 | 支持（仅 root） | 
| get | 支持 | 支持（包括解析符号链接） | 
| ln -s | 不支持  | 支持 | 
| ls/dir | 支持 | 支持 | 
| mkdir | 支持 | 支持 | 
| put | 支持 | 支持 | 
| pwd | 支持 | 支持 | 
| rename |  仅支持文件  不支持会覆盖现有文件的重命名。   | 支持  不支持会覆盖现有文件或目录的重命名。  | 
| rm | 支持 | 支持 | 
| rmdir | 支持（仅限空目录） | 支持 | 
| version | 支持 | 支持 | 

## 查找您的 Amazon VPC 端点
<a name="find-vpc-endpoint"></a>

如果您的 Transfer Family 服务器的端点类型是 VPC，则识别用于传输文件的端点并不简单。在这种情况下，使用以下过程查找您的 Amazon VPC 端点。

**查找您的亚马逊 VPC 终端节点**

1. 导航到您的服务器详细信息页面。

1. 在**端点详细信息**窗格中，选择 **VPC**。  
![\[\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/server-details-endpoint-vpc.png)

1. 在 Amazon VPC 控制面板中，选择 **VPC 端点 ID**。

1. 在 **DNS 名称**列表中，您的服务器端点是第一个列出的端点。  
![\[\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/server-details-endpoint-vpc-2.png)

## 避免 `setstat` 错误
<a name="avoid-set-stat"></a>

一些 SFTP 文件传输客户端可以在上传文件时尝试使用命令（例如 SETSTAT）更改远程文件的属性，包括时间戳和权限。但是，这些命令与 Amazon S3 等对象存储系统不兼容。由于这种不兼容性，即使文件以其他方式成功上传，从这些客户端上传文件也可能导致错误。
+ 当您调用 `CreateServer` 或 `UpdateServer` API 时，使用 `ProtocolDetails` 选项 `SetStatOption` 可以忽略当客户端尝试对要上传到 S3 存储桶的文件使用 SETSTAT 时生成的错误。
+ 将该值设置为 `ENABLE_NO_OP` 以使 Transfer Family 服务器忽略 SETSTAT 命令，并上传文件而无需对您的 SFTP 客户端进行任何更改。
+ 请注意，虽然该`SetStatOption``ENABLE_NO_OP`设置忽略了错误，但它*确实*会在日志中 CloudWatch 生成一个日志条目，因此您可以确定客户端何时进行 SETSTAT 调用。

 有关此选项的 API 详细信息，请参阅[ProtocolDetails](https://docs.aws.amazon.com/transfer/latest/APIReference/API_ProtocolDetails.html)。

## 使用 OpenSSH
<a name="openssh"></a>

本节包含使用 OpenSSH 从命令行传输文件的说明。

**注意**  
此客户端仅适用于启用 SFTP 的服务器。

**Topics**
+ [使用 OpenSSH](#openssh-use)
+ [使用 `scp` 命令](#openssh-scp)

### 使用 OpenSSH
<a name="openssh-use"></a>

**AWS Transfer Family 使用 OpenSSH 命令行实用程序传输文件**

1. 在 Linux、macOS 或 Windows 上，打开命令终端。

1. 在提示符中，输入以下命令：

   `sftp -i transfer-key sftp_user@service_endpoint`

   在前面的命令中，`sftp_user` 是用户名，`transfer-key` 是 SSH 私有密钥。此处`service_endpoint`是服务器的终端节点，如所选服务器的 AWS Transfer Family 控制台中所示。
**注意**  
此命令使用默认`ssh_config`文件中的设置。除非您之前编辑过此文件，否则 SFTP 使用端口 22。您可以通过在命令中添加**-P**标志来指定其他端口（例如 2222），如下所示。  

   ```
   sftp -P 2222 -i transfer-key sftp_user@service_endpoint
   ```
或者，如果您一直想使用端口 2222 或端口 22000，则可以更新文件中的`ssh_config`默认端口。

   此时应显示 `sftp` 提示符。

1.  （可选）要查看用户的主目录，请在 `sftp` 提示符下输入以下命令：

   `pwd` 

1. 要将文件从您的文件系统上传到 Transfer Family 服务器，请使用 `put` 命令。例如，要上传 `hello.txt`（假设该文件位于文件系统的当前目录中），请在 `sftp` 提示符下运行以下命令：

   `put hello.txt` 

   此时将显示类似于下文的消息，指示文件传输正在进行或者已完成。

   `Uploading hello.txt to /amzn-s3-demo-bucket/home/sftp_user/hello.txt`

   `hello.txt 100% 127 0.1KB/s 00:00`

**注意**  
在您的服务器创建之后，环境中的 DNS 服务可能需要几分钟时间才能解析服务器端点主机名。

### 使用 `scp` 命令
<a name="openssh-scp"></a>

Transfer Family 不支持 SCP 协议。但是，如果您需要此功能，则可以使用 OpenSSH `scp` 命令。

通过 SFTP 使用 SCP 的建议是使用 OpenSSH 版本 9.0 或更高版本。在 OpenSSH 版本 9 及更高版本中，该`scp`命令默认使用 SFTP 协议进行文件传输，而不是传统的 SCP 协议。

**重要**  
确保您的 Transfer Family 服务器已配置为使用 S3 优化的目录访问权限。

## 使用 WinSCP
<a name="winscp"></a>

按照下文中的说明，使用 WinSCP 从命令行传输文件。

**注意**  
如果您使用的是 WinSCP 5.19，则可以使用您的证书和文件直接连接到 Amazon S3。 AWS upload/download 有关更多详细信息，请参阅[连接到 Amazon S3 服务](https://winscp.net/eng/docs/guide_amazon_s3)。

**AWS Transfer Family 使用 WinSCP 传输文件**

1. 打开 WinSCP 客户端。

1. 在**登录**对话框中，为**文件协议**选择一个协议：**SFTP** 或 **FTP**。

   如果您选择了**加密**，请选择下列选项之一：
   + FTP **没有加密**
   + 适用于 FTPS 的 **TLS/SSL 显式加密**

1. 对于**主机名**，输入您的服务器端点。服务器端点位于**服务器详细信息**页面。有关更多信息，请参阅 [查看 SFTP、FTPS 和 FTP 服务器的详细信息](configuring-servers-view-info.md)。

   如果您的服务器使用 VPC 端点，请参阅 [查找您的 Amazon VPC 端点](#find-vpc-endpoint)。

1. 在**端口号**中，输入以下内容：
   + 适用于 SFTP 的 **22**
   + 适用于 FTP/FTPS 的 **21**

1. 在**用户名**中，输入您为特定身份提供商创建的用户名称。

   **提示：**用户名应是您为身份提供商创建或配置的用户之一。 AWS Transfer Family 提供以下身份提供商：
   + [与服务托管用户合作](service-managed-users.md)
   + [使用微软 Active Directory 的 AWS 目录服务](directory-services-users.md)
   + [使用自定义身份提供程序](custom-idp-intro.md)

1. 选择**高级**打开**高级站点设置**对话框。在 **SSH** 部分中，选择**身份验证**。

1. 对于**私有密钥文件**，从文件系统中浏览并选择 SSH 私有密钥文件。

   如果 WinSCP 提供将 SSH 私有密钥转换为 PPK 格式，请选择**确定**。

1. 选择**确定**以返回到**登录**对话框，然后选择**保存**。

1. 在**将会话保存为站点**对话框中，选择**确定**以完成您的连接设置。

1. 在**登录**对话框中，选择**工具**，然后选择**首选项**。

1. 在**首选项**对话框中的**传输**中，选择**耐力**。

   对于 “**允许传输 resume/transfer 到临时文件名**” 选项，选择 “**禁用**”。
**重要**  
如果您启用此选项，则会增加上传成本，从而显著降低上传性能。它还可能导致大文件上传失败。

1. 对于**传输**，选择**背景**，然后清除**使用多个连接进行单次传输**复选框。

   **提示：**如果选择此选项，则上传大文件可能会以不可预知的方式失败。例如，可以创建会产生 Amazon S3 费用的孤立分段上传。还可能发生静默数据损坏。

1. 执行文件传输。

   您可以使用 drag-and-drop方法在目标窗口和源窗口之间复制文件。在 WinSCP 中，您可以使用工具栏图标来上传、下载、删除、编辑或修改文件的属性。

**注意**  
如果您使用 Amazon EFS 进行存储，则本说明不适用。  
尝试更改远程文件属性（包括时间戳）的命令与 Amazon S3 等对象存储系统不兼容。因此，如果您使用 Amazon S3 进行存储，请务必在执行文件传输之前禁用 WinSCP 时间戳设置（或按 `SetStatOption` 中所述使用 [避免 `setstat` 错误](#avoid-set-stat)）。为此，请在 **WinSCP 传输设置**对话框中，禁用**设置权限**上传选项和**保留时间戳**常用选项。

## 使用 Cyberduck
<a name="cyberduck"></a>

按照下文中的说明，使用 Cyberduck 从命令行传输文件。

**AWS Transfer Family 使用 Cyberduck 传输文件**

1. 打开 [Cyberduck](https://cyberduck.io/download/) 客户端。

1. 选择**打开连接**。

1. 在**打开连接**对话框中，选择协议：**SFTP（SSH 文件传输协议）**、**FTP-SSL（显式身份验证 TLS）**或 **FTP（文件传输协议）**。

1. 对于**服务器**，输入您的服务器端点。服务器端点位于**服务器详细信息**页面。有关更多信息，请参阅 [查看 SFTP、FTPS 和 FTP 服务器的详细信息](configuring-servers-view-info.md)。

   如果您的服务器使用 VPC 端点，请参阅 [查找您的 Amazon VPC 端点](#find-vpc-endpoint)。

1. 在**端口号**中，输入以下内容：
   + 适用于 SFTP 的 **22**
   + 适用于 FTP/FTPS 的 **21**

1. 对于**用户名**，输入您在[管理服务器端点的用户](create-user.md)中创建的用户的名称。

1. 如果选择了 SFTP，则在 **SSH 私有密钥**中，选择或输入 SSH 私有密钥。

1. 选择**连接**。

1. 执行文件传输。

   根据您的文件所在的位置，执行以下操作之一：
   + 在您的本地目录（源）中，选择您要传输的文件，然后将这些文件拖放到 Amazon S3 目录（目标）中。
   + 在 Amazon S3 目录（源）中，选择您要传输的文件，然后将这些文件拖放到您的本地目录（目标）中。

## 使用 FileZilla
<a name="filezilla"></a>

按照以下说明使用传输文件 FileZilla。

**设置 FileZilla 文件传输**

1. 打开 FileZilla 客户端。

1. 选择**文件**，然后选择**站点管理器**。

1. 在**站点管理器**对话框中，选择**新建站点**。

1. 在**常规**选项卡的**协议**中选择一个协议：**SFTP** 或 **FTP**。

   如果您选择了**加密**，请选择下列选项之一：
   + **仅使用纯 FTP（不安全）**— 用于 FTP
   + **使用 TLS 上的显式 FTP（如果可用**）— 用于 FTPS

1. 在**主机名**中，输入您正在使用的协议，然后输入您的服务器端点。服务器端点位于**服务器详细信息**页面。有关更多信息，请参阅 [查看 SFTP、FTPS 和 FTP 服务器的详细信息](configuring-servers-view-info.md)。
   + 如果您使用的是 SFTP，请输入：`sftp://hostname`
   +  如果您使用的是 FTPS，请输入：`ftps://hostname`

   请务必*hostname*替换为实际的服务器端点。

   如果您的服务器使用 VPC 端点，请参阅 [查找您的 Amazon VPC 端点](#find-vpc-endpoint)。

1. 在**端口号**中，输入以下内容：
   + 适用于 SFTP 的 **22**
   + 适用于 FTP/FTPS 的 **21**

1. 如果选择了 SFTP，则选择**密钥文件**作为**登录类型**。

   对于**密钥文件**，选择或输入 SSH 私有密钥。

1. 对于**用户名**，输入您在 [管理服务器端点的用户](create-user.md) 中创建的用户的名称。

1. 选择**连接**。

1. 执行文件传输。
**注意**  
如果您中断正在进行的文件传输， AWS Transfer Family 可能会在您的 Amazon S3 存储桶中写入部分对象。如果您中断上传，在继续之前，请检查 Amazon S3 存储桶中文件大小是否与源对象的文件大小相符。

## 使用 Perl 客户端
<a name="using-clients-with-perl-modules"></a>

如果您使用 NET::SFTP::Foreign perl 客户端，则必须将设置`queue_size`为。`1`例如：

`my $sftp = Net::SFTP::Foreign->new('user@s-12345.server.transfer.us-east-2.amazonaws.com', queue_size => 1);`

**注意**  
 [1.92.02](https://metacpan.org/changes/release/SALVA/Net-SFTP-Foreign-1.93#L12) 之前的 `Net::SFTP::Foreign` 修订版本需要使用此解决方法。

## 使用 LFTP
<a name="using-client-lftp"></a>

LFTP 是一个免费的 FTP 客户端，它允许用户通过命令行界面从大多数 Linux 计算机上执行文件传输。

 对于大文件下载，LFTP 存在已知的乱序数据包问题，导致文件传输失败。

## 上传后处理
<a name="post-processing-upload"></a>

您可以查看上传后的处理信息，包括 Amazon S3 对象元数据和事件通知。

**Topics**
+ [Amazon S3 对象元数据](#post-processing-S3-object-metadata)
+ [Amazon S3 事件通知](#post-processing-S3-event-notifications)

### Amazon S3 对象元数据
<a name="post-processing-S3-object-metadata"></a>

作为对象元数据的一部分，您会看到一个名为 `x-amz-meta-user-agent` 的密钥，其值为 `AWSTransfer`，`x-amz-meta-user-agent-id` 的值为 `username@server-id`。`username` 是上传文件的 Transfer Family 用户，`server-id` 也是用于上传的服务器。可以使用对 Lambda 函数中的 S3 对象进行[HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectHEAD.html)操作来访问这些信息。

![\[“元数据” 屏幕显示有关 Amazon S3 对象元数据的信息 AWS Transfer Family。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/s3-object-metadata.png)


### Amazon S3 事件通知
<a name="post-processing-S3-event-notifications"></a>

当使用 Transfer Family 将对象上传到您的 S3 存储桶时，`RoleSessionName` 作为 `[AWS:Role Unique Identifier]/username.sessionid@server-id` 包含在 [S3 事件通知结构](https://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html)的请求者字段中。例如，以下是来自 S3 访问权限日志的、用于复制到 S3 存储桶中的请求者字段示例内容。

`arn:aws:sts::AWS-Account-ID:assumed-role/IamRoleName/username.sessionid@server-id`

在上述中请求者字段中，它显示了名为 `IamRoleName` 的 IAM 角色。有关配置 S3 事件通知的更多信息，请参阅 *Amazon Simple Storage Service 开发人员指南*中的[配置 Amazon S3 事件通知](https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html)。有关 AWS Identity and Access Management (IAM) 角色唯一标识符的更多信息，请参阅*AWS Identity and Access Management 用户指南*中的[唯一标识符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids)。

## SFTP 消息
<a name="sftp-transfer-activity-types"></a>

本节介绍使用 Transfer Family 服务器时，您在传输 SFTP 文件期间或之后可能收到的客户端消息。有关任何 SFTP 事件的更多信息，请查看您的 SFTP 客户端日志。您可以使用该信息对任何错误进行故障排除，也可以将该信息转发给您的网络团队，以帮助他们识别问题。


**SFTP 客户端消息**  

| Activity | 说明 | 
| --- | --- | 
| 身份验证失败 | 用户身份验证失败。这可能是来自自定义身份提供商或服务托管用户的任何类型的故障。事件中的详细信息有助于阐明失败的根本原因。 | 
| CLOSE | 表示已成功关闭打开的文件或目录。 | 
| 已连接/已断开 | 表示正常连接成功和断开连接。 | 
| 创建符号链接  | 符号链接已创建（成功或失败）。 | 
| DELETE | 文件已删除（成功或失败）。 | 
| ERROR | 一个一般的、意想不到的错误。相关的描述包含可以帮助您或您的网络管理员识别具体问题的信息。 | 
| 退出原因 | 当意外错误导致您的 SFTP 会话终止时发出。与事件关联的消息描述了原因。 | 
| MKDIR | 目录已创建（成功或失败）。 | 
| OPEN | 已打开文件进行读取或写入（成功或失败） | 
| 部分关闭 | 当文件仍处于打开状态但未收到 CLOSE 消息时，客户端与服务器断开了连接。Transfer Family 存储文件中收到的部分（实际上可能是完整的文件），并发出 PARTIAL\$1CLOSE 事件以提醒客户注意问题。工作流集成还会收到一个onPartialClose事件，以适当地处理文件。 | 
| RENAME | 文件已重命名（成功或失败） | 
| RMDIR | 目录已删除（成功或失败） | 
| SETSTAT |  文件的属性已更改（成功或失败）。  如果你使用亚马逊 S3 进行存储，Transfer Family 不支持 SETSTAT。本[避免 `setstat` 错误](#avoid-set-stat)节详细介绍了如何通过关闭设置来避免`SetStat`错误。这样可以避免你收到`fail unsupported error`：相反，你会收到`success but do nothing`消息。   | 
| TLS\$1恢复失败  | 服务器配置为强制执行 TLS 会话恢复，但客户端不支持。 | 