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

介绍

FTP,即 _File Transfer Protocol,是两种远程系统之间传输文件的一种流行的非加密方法,截至2022年,由于缺乏安全性,它已经被大多数现代软件所剥夺,而且主要只能用于传统应用程序。

SFTP,即 Secure 文件传输协议,是一个单独的协议,嵌入到 SSH 中,可以通过安全连接执行 FTP 命令. 通常,它可以在任何需要 FTP 服务器的环境中作为 drop-in 替代品。

在几乎所有情况下,SFTP优于FTP,因为其潜在的安全特性和在SSH连接上备份的能力。

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

如何使用 SFTP 连接

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

虽然您可以默认使用密码进行身份验证,但我们建议您创建SSH密钥并将公共密钥转移到您需要访问的任何系统中。

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

如果您可以使用 SSH 连接到机器,那么您已经完成了使用 SFTP 来管理文件所需的所有必要要求。

1ssh sammy@your_server_ip_or_remote_hostname

如果它奏效,请通过键入退出:

1exit

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

1sftp sammy@your_server_ip_or_remote_hostname

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

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

1sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname

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

在 SFTP 获得帮助

最有用的命令首先学习是帮助命令. 这为您提供了访问其他SFTP命令的摘要。

1help

1?

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

 1[secondary_label Output]
 2Available commands:
 3bye Quit sftp
 4cd path Change remote directory to 'path'
 5chgrp grp path Change group of file 'path' to 'grp'
 6chmod mode path Change permissions of file 'path' to 'mode'
 7chown own path Change owner of file 'path' to 'own'
 8df [-hi] [path]                    Display statistics for current directory or
 9                                   filesystem containing 'path'
10exit Quit sftp
11get [-Ppr] remote [local]          Download file
12help Display this help text
13lcd path Change local directory to 'path'
14. . .

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

使用 SFTP 导航

我们可以通过远程系统的文件等级进行导航,使用一些类似于其壳对手的命令。

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

1pwd
1[secondary_label Output]
2Remote working directory: /home/demouser

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

1ls
1[secondary_label Output]
2Summary.txt info.html temp.txt testDirectory

请注意, SFTP 界面内可用的命令不是典型的壳语法的 1:1 匹配,并且并不具有丰富的功能,但是,它们确实执行了一些更重要的可选旗帜,例如将 -la 添加到 `ls' 以查看更多文件元数据和权限:

1ls -la
1[secondary_label Output]
2drwxr-xr-x 5 demouser demouser 4096 Aug 13 15:11 .
3drwxr-xr-x 3 root root 4096 Aug 13 15:02 ..
4-rw-------    1 demouser demouser 5 Aug 13 15:04 .bash_history
5-rw-r--r--    1 demouser demouser 220 Aug 13 15:02 .bash_logout
6-rw-r--r--    1 demouser demouser 3486 Aug 13 15:02 .bashrc
7drwx------    2 demouser demouser 4096 Aug 13 15:04 .cache
8-rw-r--r--    1 demouser demouser 675 Aug 13 15:02 .profile
9. . .

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

1cd testDirectory

我们现在可以穿过远程文件系统,但如果我们需要访问我们的本地文件系统,我们可以通过以l为本地命令来指向本地文件系统。

迄今为止讨论的所有命令都具有本地等级,我们可以打印本地工作目录:

1lpwd
1[secondary_label Output]
2Local working directory: /Users/demouser

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

1lls
1[secondary_label Output]
2Desktop			local.txt		test.html
3Documents		analysis.rtf		zebra.html

我们还可以更改我们想要在本地系统上互动的目录:

1lcd Desktop

使用 SFTP 传输文件

如果我们想从我们的远程主机下载文件,我们可以使用得到命令这样做:

1get remoteFile
1[secondary_label Output]
2Fetching /home/demouser/remoteFile to remoteFile
3/home/demouser/remoteFile 100%   37KB 36.8KB/s 00:01

正如您所看到的,默认情况下,得到命令将远程文件下载到本地文件系统上具有相同名称的文件中。

我们可以将远程文件复制到另一个名称,然后指定名称:

1get remoteFile localFile

得到命令也接受一些选项旗帜,例如,我们可以通过指定重复选项来复制一个目录及其所有内容:

1get -r someDirectory

我們可以告訴 SFTP 使用「-P」或「-p」旗號來保持適當的權限和存取時間:

1get -Pr someDirectory

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

将文件传输到远程系统的操作方式是相同的,但使用放置命令:

1put localFile
1[secondary_label Output]
2Uploading localFile to /home/demouser/localFile
3localFile 100% 7607 7.4KB/s 00:00

得到相同的旗帜适用于放置,因此,要复制整个本地目录,您可以运行放置 -r:

1put -r localDirectory

在下载和上传文件时有用的一个熟悉的工具是df命令,它与命令行版本类似。

1df -h
1[secondary_label Output]
2    Size Used Avail   (root)    %Capacity
3  19.9GB 1016MB 17.9GB 18.9GB 4%

请注意,这个命令没有本地变异,但我们可以通过发出!命令来绕过这一点。

命令!将我们放入一个本地壳,在那里我们可以运行我们本地系统上可用的任何命令。

1!

然后

1df -h
1[secondary_label Output]
2Filesystem Size Used Avail Capacity Mounted on
3/dev/disk0s2 595Gi 52Gi 544Gi 9%    /
4devfs 181Ki 181Ki 0Bi 100%    /dev
5map -hosts 0Bi 0Bi 0Bi 100%    /net
6map auto_home 0Bi 0Bi 0Bi 100%    /home

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

1exit

你现在应该看到SFTP即时返回。

简单的文件操纵与SFTP

SFTP 允许您执行某些类型的文件系统维护,例如,您可以通过:

1chown userID file

注意,与系统chmod命令不同,SFTP命令不接受用户名,而是使用UID。

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

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

请注意,我们没有用!命令作为本地壳命令的前缀,而是用它来运行我们本地机器上可用的任何命令,并且可以早些时候使用本地df命令。

UID 将位于文件的第三列中,由 kolon 字符划定。

同样,我们可以更改一个文件的组所有者:

1chgrp groupID file

再一次,没有内置的方式来获取远程系统的组列表,我们可以通过以下命令来处理它:

1get /etc/group
2!less group
 1[secondary_label Output]
 2root:x:0:
 3daemon:x:1:
 4bin:x:2:
 5sys:x:3:
 6adm:x:4:
 7tty:x:5:
 8disk:x:6:
 9lp:x:7:
10. . .

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

chmod SFTP 命令在远程文件系统上正常运行:

1chmod 777 publicFile
1[secondary_label Output]
2Changing mode on /home/demouser/publicFile

对于操纵本地文件权限,没有同等命令,但您可以设置本地 umask,以便将任何复制到本地系统的文件具有相应的权限。

这可以用lumask命令完成:

1lumask 022
1[secondary_label Output]
2Local umask: 022

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

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

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

1ln
2rm
3rmdir

如果您需要在本地文件系统上执行这些操作,请记住,您可以通过发出此命令落入一个壳中:

1!

或者在本地系统上执行一个单一的命令,以!为前缀:

1!chmod 644 somefile

当您完成 SFTP 会话时,使用退出再见来关闭连接。

1bye

结论

虽然 SFTP 语法比现代壳工具更不全面,但它可以用于提供与传统 FTP 语法的兼容性,或者仔细限制某些环境的远程用户可用的功能。

例如,您可以使用 SFTP 允许特定用户在没有 SSH 访问的情况下传输文件. 有关此过程的更多信息,请参阅我们的教程 如何启用 SFTP 无壳访问

如果你习惯了使用FTP或SCP来完成你的转移,SFTP是利用两者的优势的好方法,虽然它不适合每一个情况,但它是一个灵活的工具,你必须在你的报表中。

Published At
Categories with 技术
Tagged with
comments powered by Disqus