第六章:通过SSH复制文件

FTP——File Transfer Protocol,是几十年来在机器之间复制文件的标准方法,甚至早于TCP/IP。它以未加密的方式传输所有内容,使其大致与telnet一样不安全。在传输过程中可以查看或更改文件。其他旧协议(RCP)甚至更糟糕。使用SSH在机器之间安全地传输文件怎么样?

有很多方法可以使用SSH来移动文件。rsync等应用程序可以使用SSH作为传输机制。一些窗口管理器包含SSH文件传输工具。本书介绍两种特定的协议:SCP和SFTP,适用于类Unix和MS系统。大多数其他通过SSH传输文件的工具实际上都是这些协议之一的前端。

SCP(Secure Copy Protocol)被设计用来取代RCP。

SFTP(SSH File Transfer Protocol)旨在取代FTP。这是一个交互式协议,允许你浏览远程文件系统。OpenSSH包含客户端程序 sftp(1)scp(1) ,而Windows客户端可以将WinSCP用于这两种协议。

第六章:通过SSH复制文件通过OpenSSH拷贝文件scp(1)sftp(1)更改用户名和配置使用 WinSCP复制文件使用WinSCP配置 SCP 和 SFTP 服务器SFTP-Only 用户禁止SSH文件复制

通过OpenSSH拷贝文件

OpenSSH包括两个文件传输程序 scpsftp 。我们将从更简单但不那么灵活的程序开始。

scp(1)

您可以使用 scp(1) 复制单个文件。语法遵循通常的Unix语义:

用冒号(colon)分隔主机和文件名,如下所示:

一旦您进行了身份验证,scp 就会通过加密通道传输文件。

如果不在命令中输入元素,则假定它没有变化。例如,要将本地文件 data.txt 复制到服务器 sloth,请运行:

我没有在源端输入机器名,因此假设它是本地机器。我输入了远程主机名,但没有输入远程文件名,因此文件名不会更改。我的文件 data.txt 被复制到我的 sloth 登录目录中。

如果目标文件已存在,scp 会自动覆盖它。如果帐户没有覆盖文件的权限,则复制失败。 scp 程序假设,如果你告诉它覆盖现有文件,你有充分的理由这样做。因此,我建议在以 root 身份登录时不要复制文件。

您必须在主机名后使用冒号。跳过冒号时, scp 假定参数是文件名。下面示例中,我跳过冒号,将文件 data.txt 复制到本地计算机上的文件 sloth 中:

至少,这是一个非常安全的本地副本。

要更改远程端的文件名,请提供一个新的文件名:

如果源文件位于其他计算机上,并且您想将其复制到本地主机,请将远程主机名指定为源:

您可以将文件复制到具有足够权限的任何位置或从中复制文件:

要递归地将目录复制到另一台机器,请使用参数 -rp 。在这里,我在远程主机上复制我的主目录,覆盖任何同名文件:

scp 程序故意从 cp(1)rcp(1) 中借用了许多命令行选项。所以它的选项通常与 ssh 不匹配。它是 rcp(1) 的直接替代,因此 rcp 标志优先。不过,如果您有更复杂的复制需求,请查看文档。

scp(1) 程序主要是由即使前期的 rcp(1) 代码构建而成。现在没有人真正关注它了。

如果有复杂的文件复制要求,可以考虑 sftp(1)

sftp(1)

sftp比scp更灵活。SCP只复制文件,SFTP允许更多不同的文件操作,如重命名和删除文件、列出目录等。你会发现一些不同的协议以“安全”和“FTP”的变体命名,所以不要混淆。SFTP与SSH上的FTP(FTP over SSH)不同,也不是SSL上的FTP(FTP over SSL)。

SFTP命令是故意从FTP命令复制的,以简化两者之间的转换。对FTP命令行的大部分知识都适用于SFTP,但我们将介绍基础知识。

使用 sftp 命令和远程主机名打开一个连接:

认证成功后就连上远程主机了,你会看到一个SFTP提示符:

登录后,输入问号或单词help将列出SFTP服务器支持的所有命令。大部分与FTP命令相同。

使用 put 命令加文件名可以将文件从本地计算机复制到服务器:

使用 get 命令加文件名可以将文件从服务器复制到本地计算机:

如果您的连接在下载完成之前中断,请使用 reget 从中断的地方继续下载。reget 不会执行文件完整性检查,只会查看偏移量。

要更改服务器上的文件名,请使用 rename ,然后使用当前文件名和新文件名:

使用 cd 命令可以变更在服务器上的目录:

要更改客户端上的目录,可使用 lcd 命令:

使用 quitexit 命令结束SFTP会话。

更改用户名和配置

使用 scpsftp ,如果您在远程计算机上使用不同的帐户名,请将帐户名和 @ 符号放在服务器名之前,就像通过 ssh 连接时一样。(老式的远程复制不支持此选项。)

记住这一点的最简单方法是在 ssh_config 中创建一个条目。这两个文件复制程序都从 ssh_config 中获取配置,因此只需在那里进行一次更改,即可影响整个软件套件。

虽然这两个程序都使用命令行参数来更改它们的行为方式,但这些参数与 ssh(1) 不一致。SFTP旨在取代FTP,而SCP取代RCP。开发人员优先考虑安慰迁移用户,而不是使用 ssh- 风格的选项。例如,您可以使用 -P 而不是 ssh(1) 使用的 -p 来更改这些端口中的每一个。避免混淆:使用 ssh_config

使用 WinSCP复制文件

PuTTY安装程序附带了出色的命令行SCP和SFTP客户端,但如果你运行的是Windows,你可能想要一个漂亮的图形界面。WinSCP是适用于Microsoft Windows的SCP、SFTP、FTP和WebDav客户端。它根据服务器支持的内容在协议之间透明地切换。

从以下位置获取WinSCP https://winscp.net 。虽然在您的家庭或企业中使用WinSCP是免费的,但其许可证(GPLv2)限制了将更改后的程序版本重新分发给您的客户。如果您希望在自己的产品中包含WinSCP,请仔细阅读许可证。

WinSCP附带了标准的Windows安装程序。默认值对大多数用户来说都很好,并且包括方便的功能,例如在选择文件时将WinSCP添加到右键菜单中。如果您没有将Pageant和puttygen作为PuTTY的一部分安装,安装程序还会安装它们。我们将在第7章中使用这些。

启动WinSCP,您将看到此屏幕。

6-1

左侧包含您保存的连接。在右侧设置新连接。输入服务器的主机名、用户名和密码。如果需要,请更改端口。您可以通过点击“保存”来保存此连接。

WinSCP可以导入您的PuTTY主机密钥缓存。选择 Tools->Import 。您将看到PuTTY密钥缓存的内容,每个缓存旁边都有一个复选框。验证您要使用的每个服务器都已选中,然后选择 OK 。WinSCP现在可以继承您验证主机密钥所做的所有工作。

在PuTTY中验证主机密钥后,您可以返回WinSCP并将验证后的密钥导入其中。

使用WinSCP

双击WinSCP。输入您的用户名、密码和SSH服务器的主机名。WinSCP将登录并打开一个双窗口。左侧显示本地主目录,右侧显示远程服务器上的主目录。这被称为 Commander-Style 界面。将文件从一侧拖放到另一侧。

您可以告诉WinSCP使用 Explorer-style 界面。它将打开一个窗口,其样式与其他Windows资源管理器窗口完全相同,其中包含远程主机。要查看本地目录,您必须打开一个单独的窗口。要启用资源管理器样式,请选择 Tools->Preferences-> Interface ,然后选择资源管理器。你的WinSCP现在看起来很像Windows,甚至会让你感到困惑。

借助WinSCP的上下文菜单,您现在可以右键单击文件并选择 Send To WinSCP 来上传文件。

配置 SCP 和 SFTP 服务器

OpenSSH默认支持SCP和SFTP。两者都不需要太多的配置,但你可以改变它们的行为方式。

对于SCP,scp(1) 程序必须位于系统的默认 $PATH 中。如果SSH服务器找不到 scp ,用户将收到一个错误的消息。onoffpresentnot ,是你唯一的选项。

sshd 服务器附带了一个SFTP服务器,由 sshd_config 条目激活:

仅此条目的存在就足以启用SFTP支持。

SFTP-Only 用户

你可能有需要访问服务器或从服务器复制文件的用户,但不需要shell访问权限。OpenSSH支持SFTP-only用户。这通常与chroot(【第3章】)结合使用,允许用户仅访问文件系统的一部分。你将在支持多个客户的web服务器中看到这一点,其中每个站点应该只能访问其站点的文件。

当需要shell访问权限的chroot用户需要chroot中的一堆文件时,仅使用SFTP的用户只需要一个 sshd_config 关键字。

首先,为SFTP-only用户创建一个组,例如 sftponly 。通过在 sshd_config 中使用匹配项,拒绝这些用户访问其主目录之外的任何内容,只允许条目进行SFTP访问:

我们使用 ChrootDirectory 关键字将用户锁定在一个目录中。ForceCommand 关键字限制用户只能访问一个命令。就是这样!内部SFTP服务器提供用户可能需要的所有用户区命令和设备节点访问。

禁止SSH文件复制

您可能希望禁用通过SSH复制文件的功能,同时仍允许用户进行命令行访问。这真的很难。您可以从主机中删除 /usr/libexec/sftp-server/usr/bin/scp ,并在 sshd_config 中禁用SFTP,但这只会禁用复制文件的明显方法。用户是狡猾的小动物(tricky little critters),尤其是沮丧的用户,他们认为系统管理员正在阻止他们完成工作。用户可以通过多种方法复制文件。其中许多通过网络发送未加密的数据。具有shell访问权限的用户始终可以将文件从一个主机复制到另一个主机。

如果必须阻止用户复制文件,请使用chroot并限制用户可以访问的文件。他们仍然可以复制文件,但只能复制chroot中的文件。