介绍

FTP,或“文件传输协议”是在两个远程系统之间传输文件的常用方法。

SFTP代表SSH文件传输协议或安全文件传输协议,是与SSH打包在一起的独立协议,可通过安全连接以类似方式工作。优点是能够利用安全连接来传输文件并遍历本地和远程系统上的文件系统。

在几乎所有情况下,SFTP都比FTP更可取,因为它具有基本的安全功能以及能够通过SSH连接进行附加。 FTP是不安全的协议,仅应在少数情况下或在您信任的网络上使用。

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

如何与SFTP连接

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

尽管密码易于使用并默认设置,但我们建议您创建SSH密钥并将公用密钥转移到您需要访问的任何系统。从长远来看,这更加安全,可以节省您的时间。

如果尚未访问服务器,请参阅本指南以设置SSH密钥以访问服务器。

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

ssh sammy@your_server_ip_or_remote_hostname

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

exit

我们可以建立SSH连接,然后通过发出以下命令来使用该连接打开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
?

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

Available 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会话中一样,我们可以键入以下内容来获取当前目录:

pwd
Remote working directory: /home/demouser

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

ls
Summary.txt     info.html       temp.txt        testDirectory

请注意,SFTP界面中的命令不是普通的shell命令,功能也不丰富,但是它们确实实现了一些更重要的可选标志:

ls -la
drwxr-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
Local working directory: /Users/demouser

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

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

我们还可以更改希望与本地系统进行交互的目录:

lcd Desktop

使用SFTP传输文件

导航远程文件系统和本地文件系统的用途非常有限,无法在两者之间传输文件。

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

如果我们想从远程主机下载文件,可以通过发出以下命令来完成:

get remoteFile
Fetching /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
Uploading localFile to /home/demouser/localFile
localFile                                     100% 7607     7.4KB/s   00:00

与“ get”一起使用的相同标志适用于“ put”。因此,要复制整个本地目录,可以发出:

put -r localDirectory
注意:当前Ubuntu版本(至少14.04至15.10)随附的OpenSSH版本中当前存在一个错误,该错误会导致上述命令无法正常运行。在发出上述命令以使用多版本的OpenSSH将内容传输到服务器时,将出现以下错误:无法规范化:没有这样的文件或目录。  要变通解决此问题,请首先通过键入mkdir localDirectory在远程端上创建目标目录。之后,以上命令应正确完成。

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

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

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

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

!
df -h
Filesystem      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。

可以通过以下方法完成相关的工作:

get /etc/passwd
!less passwd

root: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
root: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”命令在远程文件系统上可以正常工作:

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

没有用于操作本地文件权限的命令,但是您可以设置本地umask,以便复制到本地系统的所有文件都具有适当的权限。

可以使用“ lumask”命令来完成:

lumask 022
Local umask: 022

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

SFTP允许您分别使用“ lmkdir”和“ mkdir”在本地和远程系统上创建目录。这些工作按预期方式进行。

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

ln
rm
rmdir

这些命令复制了Shell版本的基本行为。如果需要在本地文件系统上执行这些操作,请记住,可以通过发出以下命令进入外壳:

!

或者在本地系统上执行单个命令,方法是在命令前加上“!”像这样:

!chmod 644 somefile

完成SFTP会话后,请使用“退出”或“再见”关闭连接。

bye

结论

尽管SFTP是一个简单的工具,但是它对于管理服务器和在服务器之间传输文件非常有用。

例如,您可以使用SFTP使特定用户无需SSH访问即可传输文件。有关此过程的更多信息,请查看我们的教程,该教程关于如何在Ubuntu 16.04上启用无Shell访问的SFTP以及如何在CentOS 7上启用无Shell访问的SFTP。

如果您习惯于使用FTP或SCP完成传输,则SFTP是利用两者优势的好方法。尽管它并不适合每种情况,但它是您可以使用的灵活工具。