FTP——File Transfer Protocol,是几十年来在机器之间复制文件的标准方法,设置早于TCP/IP。它以未加密的方式传输所有内容,在传输过程中可以查看或更改文件。
有很多方法可以使用SSH来移动文件。rsync等应用程序可以使用SSH作为传输机制。一些窗口管理器包含SSH文件传输工具。本身介绍两种特定的协议:SCP和SFTP,适用于类Unix和MS系统。大多数其他通过SSH传输文件的工具实际上都是这些协议之一的前端。
SCP——Secure Copy Protocol被设计用来取代RCP。
SFTP旨在取代FTP。这是一个交互式协议,允许你浏览远程文件系统。
OpenSSH包含客户端程序sftp和scp,而Windows客户端可以将WinSCP用于这两种协议。
OpenSSH包括两个文件传输程序scp和sftp。我们将从更简单但不那么灵活的程序开始。
您可以使用scp复制单个文件。语法遵循通常的Unix语义:
xxxxxxxxxx
$ scp what-you-have where-you-want-it
用冒号分隔主机和文件名,如下所示:
xxxxxxxxxx
$ scp source-host:filename destination-host:filename
一旦您进行了身份验证,scp就会通过加密通道传输文件。
如果不在命令中输入元素,则假定它没有变化。例如,要将本地文件data.txt复制到服务器懒惰,请运行:
xxxxxxxxxx
$ scp data.txt sloth:
我没有在源端输入机器名,因此假设它是本地机器。我输入了远程主机名,但没有输入远程文件名,因此文件名不会更改。我的文件data.txt被复制到我的懒惰登录目录中。
如果目标文件已存在,scp会自动覆盖它。如果帐户没有覆盖文件的权限,则复制失败。scp程序假设,如果你告诉它覆盖现有文件,你有充分的理由这样做。因此,我建议在以root身份登录时不要复制文件。
您必须在主机名后使用冒号。跳过冒号时,scp假定参数是文件名。下面示例中,我跳过冒号,将文件data.txt复制到本地计算机上的文件slow中:
xxxxxxxxxx
$ scp data.txt sloth
至少,这是一个非常安全的本地副本。
要更改远程端的文件名,请提供一个新的文件名:
xxxxxxxxxx
$ scp data.txt sloth:stuff.txt
如果源文件位于其他计算机上,并且您想将其复制到本地主机,请将远程主机名指定为源:
xxxxxxxxxx
$ scp sloth:data2.txt data2.txt
您可以将文件复制到具有足够权限的任何位置或从中复制文件:
xxxxxxxxxx
$ scp sloth:/var/log/messages sloth-messages
要递归地将目录复制到另一台机器,请使用参数-rp。在这里,我在远程主机上复制我的主目录,覆盖任何同名文件:
xxxxxxxxxx
$ scp -rp /home/mwlucas sloth:
scp程序故意从cp和rcp中借用了许多命令行选项。所以它的选项通常与ssh不匹配。
scp程序主要是由即使前期的rcp代码构建而成。现在没有人真正关注它了。如果有复杂的文件复制要求,可以考虑sftp。
sftp比scp更灵活。scp只复制文件,sftp允许更多不同的文件操作,如重命名和删除文件、列出目录等。
SFTP命令是故意从FTP命令复制的,以简化两者之间的转换。对FTP命令行的大部分只是都适用于SFTP。
使用sftp命令和远程主机名打开一个连接:
xxxxxxxxxx
$ sftp pride
认证成功后就连上远程主机了,你会看到一个SFTP提示符:
xxxxxxxxxx
sftp>
登录后,输入问号或单词help将列出SFTP服务器支持的所有命令。大部分与FTP命令相同。
使用put命令加文件名可以将文件从本地计算机复制到服务器:
xxxxxxxxxx
sftp> put upload.txt
使用get命令加文件名可以将文件从服务器复制到本地计算机:
xxxxxxxxxx
sftp> get download.txt
如果您的连接在下载完成之前中断,请使用reget从中断的地方继续下载。reget不会执行文件完整性检查,只会查看偏移量。
要更改服务器上的文件名,请使用rename,然后使用当前文件名和新文件名:
xxxxxxxxxx
sftp> rename data.txt old-data.txt
使用cd命令可以变更在服务器上的目录:
xxxxxxxxxx
sftp> cd /var/log
要更改客户端上的目录,可使用lcd命令:
xxxxxxxxxx
sftp> lcd Downloads
使用quit或exit命令结束SFTP会话。
使用scp或sftp,如果您在远程计算机上使用不同的帐户名,请将帐户名和@符号放在服务器名之前,就像通过ssh连接时一样。(老式的远程复制不支持此选项。)
xxxxxxxxxx
$ scp data.txt doofus@sloth:
记住这一点的最简单方法是在ssh_config中创建一个条目。这两个文件复制程序都从ssh_config中获取配置,因此只需在那里进行一次更改,即可影响整个软件套件。
虽然这两个程序都使用命令行参数来更改它们的行为方式,但这些参数与ssh(1)不一致。SFTP旨在取代FTP,而SCP取代RCP。开发人员优先考虑安慰迁移用户,而不是使用ssh风格的选项。例如,您可以使用-P而不是ssh(1)使用的-p来更改这些端口中的每一个。
避免混淆:使用ssh_config。
PuTTY安装程序附带了出色的命令行SCP和SFTP客户端,但如果你运行的是Windows,你可能想要一个漂亮的图形界面。WinSCP是适用于Microsoft Windows的SCP、SFTP、FTP和WebDav客户端。它根据服务器支持的内容在协议之间透明地切换。
从以下位置获取WinSCPhttps://winscp.net.虽然在您的家庭或企业中使用WinSCP是免费的,但其许可证(GPLv2)限制了将更改后的程序版本重新分发给您的客户。如果您希望在自己的产品中包含WinSCP,请仔细阅读许可证。
WinSCP附带了标准的Windows安装程序。默认值对大多数用户来说都很好,并且包括方便的功能,例如在选择文件时将WinSCP添加到右键菜单中。如果您没有将Pageant和puttygen作为PuTTY的一部分安装,安装程序还会安装它们。我们将在第7章中使用这些。 启动WinSCP,您将看到WinSCP的Login界面。
左侧包含您保存的连接。在右侧设置新连接。输入服务器的主机名、用户名和密码。如果需要,请更改端口。您可以通过点击“保存”来保存此连接。
WinSCP可以导入您的PuTTY主机密钥缓存。选择工具->导入。您将看到PuTTY密钥缓存的内容,每个缓存旁边都有一个复选框。验证您要使用的每个服务器都已选中,然后选择“确定”。WinSCP现在可以继承您验证主机密钥所做的所有工作。
在PuTTY中验证主机密钥后,您可以返回WinSCP并将验证后的密钥导入其中。
双击WinSCP。输入您的用户名、密码和SSH服务器的主机名。WinSCP将登录并打开一个双窗口。左侧显示本地主目录,右侧显示远程服务器上的主目录。这被称为“指挥官风格”界面。将文件从一侧拖放到另一侧。
您可以告诉WinSCP使用“资源管理器风格”界面。它将打开一个窗口,其样式与其他Windows资源管理器窗口完全相同,其中包含远程主机。要查看本地目录,您必须打开一个单独的窗口。要启用资源管理器样式,请选择工具->首选项->界面,然后选择资源管理器。你的WinSCP现在看起来很像Windows,甚至会让你感到困惑。
借助WinSCP的上下文菜单,您现在可以右键单击文件并选择“发送到WinSCP”来上传文件。
OpenSSH默认支持SCP和SFTP。两者都不需要太多的配置,但你可以改变它们的行为方式。
对于SCP,scp程序必须位于系统的默认$PATH中。如果SSH服务器找不到scp,用户将收到一个错误的消息。on或off,present或not,是你唯一的选择。
sshd服务器附带了一个SFTP服务器,由sshd_config条目激活:
xxxxxxxxxx
Subsystem sftp /usr/libexec/sftp-server
仅此条目的存在就足以启用SFTP支持。
你可能有需要访问服务器或从服务器复制文件的用户,但不需要shell访问权限。
OpenSSH支持SFTP-only用户。这通常与chroot结合使用,允许用户仅访问文件系统的一部分。你将在支持多个客户的web服务器中看到这一点,其中每个站点应该只能访问其站点的文件。
当需要shell访问权限的chroot用户需要chroot中的一堆文件时,仅使用SFTP的用户只需要一个sshd_config关键字。
首先,为SFTP-only用户创建一个组,例如sftponly。通过在sshd_config中使用匹配项,拒绝这些用户访问其主目录之外的任何内容,只允许条目进行SFTP访问:
xxxxxxxxxx
Match Group sftponly
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
我们使用ChrootDirectory关键字将用户锁定在一个目录中。ForceCommand关键字限制用户只能访问一个命令。就是这样!内部SFTP服务器提供用户可能需要的所有用户区命令和设备节点访问。
您可能希望禁用通过SSH复制文件的功能,同时仍允许用户进行命令行访问。这真的很难。您可以从主机中删除/usr/libexec/sftp-server和/usr/bin/scp,并在sshd_config中禁用sftp,但这只会禁用复制文件的明显方法。用户是狡猾的小动物,尤其是沮丧的用户,他们认为系统管理员正在阻止他们完成工作。用户可以通过多种方法复制文件。其中许多通过网络发送未加密的数据。具有shell访问权限的用户始终可以将文件从一个主机复制到另一个主机。
如果必须阻止用户复制文件,请使用chroot并限制用户可以访问的文件。他们仍然可以复制文件,但只能复制chroot中的文件。