如何使用SFTP通过远程服务器安全传输文件

来自菜鸟教程
跳转至:导航、​搜索

介绍

FTP,即 文件传输协议 ,是一种流行的、未加密的在两个远程系统之间传输文件的方法。 截至 2022 年,由于缺乏安全性,它已被大多数现代软件弃用,并且大多只能用于遗留应用程序。

SFTP 代表 Secure 文件传输协议,是一种内置于 SSH 中的独立协议,可以通过安全连接实现 FTP 命令。 通常,它可以在仍然需要 FTP 服务器的任何环境中充当替代品。

几乎在所有情况下,SFTP 都比 FTP 更可取,因为它具有底层的安全特性和搭载 SSH 连接的能力。 FTP 是一种不安全的协议,只能在有限的情况下或在您信任的网络上使用。

尽管 SFTP 已集成到许多图形工具中,但本指南将通过其交互式命令行界面演示如何使用它。

如何连接 SFTP

默认情况下,SFTP 使用 SSH 协议进行身份验证并建立安全连接。 因此,可以使用与 SSH 相同的身份验证方法。

尽管您可以默认使用密码进行身份验证,但我们建议您创建 SSH 密钥并将您的公钥传输到您需要访问的任何系统。 这更加安全,从长远来看可以节省您的时间。

如果您还没有这样做,请参阅设置 SSH 密钥 以访问您的服务器的指南。

如果您可以使用 SSH 连接到计算机,那么您已经完成了使用 SFTP 管理文件所需的所有必要要求。 使用以下命令测试 SSH 访问:

ssh sammy@your_server_ip_or_remote_hostname

如果可行,请键入以下内容退出:

exit

现在我们可以通过发出以下命令来建立 SFTP 会话:

sftp sammy@your_server_ip_or_remote_hostname

您将连接远程系统,您的提示将更改为 SFTP 提示。

如果您正在使用自定义 SSH 端口(不是默认端口 22),则可以按如下方式打开 SFTP 会话:

sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname

这将通过您指定的端口将您连接到远程系统。

在 SFTP 中获得帮助

首先要学习的最有用的命令是 help 命令。 这使您可以访问其他 SFTP 命令的摘要。 您可以通过在提示符中键入以下任何一个来调用它:

help

或者

?

这将显示可用命令的列表:

OutputAvailable commands:
bye                                Quit sftp
cd path                            Change remote directory to 'path'
chgrp grp path                     Change group of file 'path' to 'grp'
chmod mode path                    Change permissions of file 'path' to 'mode'
chown own path                     Change owner of file 'path' to 'own'
df [-hi] [path]                    Display statistics for current directory or
                                   filesystem containing 'path'
exit                               Quit sftp
get [-Ppr] remote [local]          Download file
help                               Display this help text
lcd path                           Change local directory to 'path'
. . .

我们将探讨您在以下部分中看到的一些命令。

使用 SFTP 导航

我们可以使用许多功能类似于它们的 shell 对应物的命令来浏览远程系统的文件层次结构。

首先,让我们通过找出我们当前在远程系统上的哪个目录来定位自己。 就像在典型的 shell 会话中一样,我们可以键入以下内容来获取当前目录:

pwd
OutputRemote working directory: /home/demouser

我们可以用另一个熟悉的命令查看远程系统当前目录的内容:

ls
OutputSummary.txt     info.html       temp.txt        testDirectory

请注意,SFTP 界面中可用的命令与典型的 shell 语法不是 1:1 匹配的,并且功能也不丰富。 但是,它们确实实现了一些更重要的可选标志,例如将 -la 添加到 ls 以查看更多文件元数据和权限:

ls -la
Outputdrwxr-xr-x    5 demouser   demouser       4096 Aug 13 15:11 .
drwxr-xr-x    3 root     root         4096 Aug 13 15:02 ..
-rw-------    1 demouser   demouser          5 Aug 13 15:04 .bash_history
-rw-r--r--    1 demouser   demouser        220 Aug 13 15:02 .bash_logout
-rw-r--r--    1 demouser   demouser       3486 Aug 13 15:02 .bashrc
drwx------    2 demouser   demouser       4096 Aug 13 15:04 .cache
-rw-r--r--    1 demouser   demouser        675 Aug 13 15:02 .profile
. . .

要进入另一个目录,我们可以发出以下命令:

cd testDirectory

我们现在可以遍历远程文件系统,但是如果我们需要访问本地文件系统怎么办? 我们可以通过在命令前面加上本地的 l 来将命令定向到本地文件系统。

到目前为止讨论的所有命令都有本地等价物。 我们可以打印本地工作目录:

lpwd
OutputLocal working directory: /Users/demouser

我们可以列出本地机器上当前目录的内容:

lls
OutputDesktop         local.txt       test.html
Documents       analysis.rtf        zebra.html

我们还可以在本地系统上更改要与之交互的目录:

lcd Desktop

使用 SFTP 传输文件

如果我们想从远程主机下载文件,我们可以使用 get 命令:

get remoteFile
OutputFetching /home/demouser/remoteFile to remoteFile
/home/demouser/remoteFile                       100%   37KB  36.8KB/s   00:01

如您所见,默认情况下,get 命令将远程文件下载到本地文件系统上的同名文件中。

我们可以通过在之后指定名称来将远程文件复制到不同的名称:

get remoteFile localFile

get 命令也接受一些选项标志。 例如,我们可以通过指定递归选项来复制目录及其所有内容:

get -r someDirectory

我们可以通过使用 -P-p 标志告诉 SFTP 维护适当的权限和访问时间:

get -Pr someDirectory

将本地文件传输到远程系统

将文件传输到远程系统的工作方式相同,但使用 put 命令:

put localFile
OutputUploading localFile to /home/demouser/localFile
localFile                                     100% 7607     7.4KB/s   00:00

get 一起使用的相同标志适用于 put。 因此,要复制整个本地目录,您可以运行 put -r

put -r localDirectory

df 命令是下载和上传文件时有用的一种熟悉的工具,它的工作方式与命令行版本类似。 使用它,您可以检查您是否有足够的空间来完成您感兴趣的传输:

df -h
Output    Size     Used    Avail   (root)    %Capacity
  19.9GB   1016MB   17.9GB   18.9GB           4%

请注意,此命令没有本地变体,但我们可以通过发出 ! 命令来解决这个问题。

! 命令将我们放入本地 shell,我们可以在其中运行本地系统上可用的任何命令。 我们可以通过键入以下内容来检查磁盘使用情况:

!

进而

df -h
OutputFilesystem      Size   Used  Avail Capacity  Mounted on
/dev/disk0s2   595Gi   52Gi  544Gi     9%    /
devfs          181Ki  181Ki    0Bi   100%    /dev
map -hosts       0Bi    0Bi    0Bi   100%    /net
map auto_home    0Bi    0Bi    0Bi   100%    /home

任何其他本地命令都将按预期工作。 要返回您的 SFTP 会话,请键入:

exit

您现在应该会看到 SFTP 提示返回。

使用 SFTP 进行简单的文件操作

SFTP 允许您执行某些类型的文件系统管理。 例如,您可以使用以下命令更改远程系统上文件的所有者:

chown userID file

请注意,与系统 chmod 命令不同,SFTP 命令不接受用户名,而是使用 UID。 不幸的是,没有内置方法可以从 SFTP 界面中了解适当的 UID。

作为一种解决方法,您可以从 /etc/passwd 文件中读取,该文件在大多数 Linux 环境中将用户名与 UID 相关联:

get /etc/passwd
!less passwd
Outputroot:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
. . .

请注意,我们不是单独给出 ! 命令,而是将其用作本地 shell 命令的前缀。 这可以运行我们本地机器上可用的任何命令,并且之前可以与本地 df 命令一起使用。

UID 将位于文件的第三列,由冒号字符表示。

同样,我们可以通过以下方式更改文件的组所有者:

chgrp groupID file

同样,没有内置方法可以获取远程系统组的列表。 我们可以使用以下命令解决它:

get /etc/group
!less group
Outputroot:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
. . .

第三列包含与第一列中名称关联的组的 ID。 这就是我们正在寻找的。

chmod SFTP 命令在远程文件系统上正常工作:

chmod 777 publicFile
OutputChanging mode on /home/demouser/publicFile

操作本地文件权限没有等效的命令,但是可以设置本地的umask,这样任何复制到本地系统的文件都会有相应的权限。

这可以通过 lumask 命令完成:

lumask 022
OutputLocal umask: 022

现在所有下载的常规文件(只要不使用 -p 标志)将具有 644 权限。

SFTP 还允许您分别使用 lmkdirmkdir 在本地和远程系统上创建目录。

其余文件命令仅针对远程文件系统:

ln
rm
rmdir

这些命令复制了它们的 shell 等效项的核心行为。 如果您需要在本地文件系统上执行这些操作,请记住您可以通过发出以下命令进入 shell:

!

或者通过在命令前加上 ! 来在本地系统上执行单个命令,如下所示:

!chmod 644 somefile

完成 SFTP 会话后,使用 exitbye 关闭连接。

bye

结论

尽管 SFTP 语法远不如现代 shell 工具全面,但它对于提供与传统 FTP 语法的兼容性或谨慎限制某些环境的远程用户可用的功能很有用。

例如,您可以使用 SFTP 使特定用户能够在没有 SSH 访问权限的情况下传输文件。 有关此过程的更多信息,请查看我们关于 如何在没有 Shell 访问的情况下启用 SFTP 的教程。

如果您习惯于使用 FTP 或 SCP 来完成传输,那么 SFTP 是利用两者优势的好方法。 虽然它并不适用于所有情况,但它是一个灵活的工具,可以在您的曲目中使用。