介绍
FTP(文件传输协议)是一种流行的非加密文件传输方法,用于在两个远程系统之间传输文件。截至2022年,由于缺乏安全性,大多数现代软件已将其弃用,因此它大多只能在旧应用程序中使用。
SFTP是安全文件传输协议(Secure File Transfer Protocol)的缩写,是一个独立的协议,内置于SSH中,可以通过安全连接实现FTP命令。通常,它可以在任何仍需要FTP服务器的情况下作为一种即插即用的替代方案。
在几乎所有情况下,SFTP都优于FTP,因为它具有底层的安全特性,并且可以依赖SSH连接。FTP是一种不安全的协议,只应在有限的情况下或者信任的网络上使用。
虽然SFTP已集成到许多图形工具中,但本指南将演示如何通过其交互式命令行界面使用它。
如何使用SFTP连接
默认情况下,SFTP使用SSH协议进行身份验证和建立安全连接。因此,与SSH中存在的相同身份验证方法可用。
虽然默认情况下您可以使用密码进行身份验证,但我们建议您创建SSH密钥,并将您的公钥传输到您需要访问的任何系统。这样做更安全,而且可以节省长期的时间。
如果您尚未这样做,请参阅此指南设置SSH密钥以便访问您的服务器。
如果您能够使用SSH连接到计算机,那么您已经完成了使用SFTP管理文件所需的所有必要条件。使用以下命令测试SSH访问:
如果这有效,请输入以下命令退出:
现在,我们可以通过发出以下命令建立一个SFTP会话:
您将连接到远程系统,您的提示符将变为SFTP提示符。
如果您正在使用自定义SSH端口(而不是默认端口22),那么您可以按以下方式打开一个SFTP会话:
这将通过您指定的端口连接到远程系统。
在SFTP中获取帮助
首先要学习的最有用的命令是帮助命令。这将使您可以访问其他SFTP命令的摘要。您可以通过在提示符中键入以下任一命令来调用它:
或
这将显示可用命令的列表:
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会话中一样,我们可以键入以下内容来获取当前目录:
OutputRemote working directory: /home/demouser
我们可以使用另一个熟悉的命令查看远程系统当前目录的内容:
OutputSummary.txt info.html temp.txt testDirectory
请注意,SFTP界面中可用的命令与典型的shell语法不是一一对应的,也不像那样功能丰富。但是,它们确实实现了一些更重要的可选标志,例如将-la
添加到ls
以查看更多文件元数据和权限:
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
. . .
要进入另一个目录,我们可以发出此命令:
现在我们可以遍历远程文件系统了,但是如果我们需要访问本地文件系统怎么办?我们可以在命令前加上一个l
来将命令定向到本地文件系统。
到目前为止讨论的所有命令都有本地等价命令。我们可以打印本地工作目录:
OutputLocal working directory: /Users/demouser
我们可以列出本地计算机上当前目录的内容:
OutputDesktop local.txt test.html
Documents analysis.rtf zebra.html
我们还可以更改要在本地系统上交互的目录:
使用SFTP传输文件
如果我们想要从远程主机下载文件,可以使用get
命令:
OutputFetching /home/demouser/remoteFile to remoteFile
/home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01
正如你所看到的,默认情况下,get
命令会将远程文件下载到本地文件系统中具有相同名称的文件中。
我们可以通过在其后指定名称来将远程文件复制到不同的名称:
get
命令还接受一些选项标志。例如,我们可以通过指定递归选项来复制目录及其所有内容:
我们可以使用-P
或-p
标志告知SFTP保持适当的权限和访问时间:
将本地文件传输到远程系统
将文件传输到远程系统的方式相同,但使用put
命令:
OutputUploading localFile to /home/demouser/localFile
localFile 100% 7607 7.4KB/s 00:00
与get
一起使用的相同标志也适用于put
。因此,要复制整个本地目录,可以运行put -r
:
在下载和上传文件时,一个常用的工具是df
命令,其功能类似于命令行版本。使用这个命令,您可以检查是否有足够的空间来完成您感兴趣的传输:
Output Size Used Avail (root) %Capacity
19.9GB 1016MB 17.9GB 18.9GB 4%
请注意,此命令没有本地变体,但我们可以通过使用!
命令来绕过这一点。
!
命令将我们转到本地shell,在那里我们可以运行本地系统上可用的任何命令。我们可以通过输入以下内容来检查磁盘使用情况:
然后
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会话,请键入:
现在您应该看到SFTP提示返回了。
使用SFTP进行简单的文件操作
SFTP允许您执行一些文件系统维护任务。例如,您可以使用以下命令在远程系统上更改文件的所有者:
请注意,与系统chmod
命令不同,SFTP命令不接受用户名,而是使用UID。不幸的是,在SFTP界面内部没有内置的方法来知道适当的UID。
作为解决方法,您可以从/etc/passwd
文件中读取,在大多数Linux环境中,该文件将用户名与UID关联起来:
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将位于文件的第三列,由冒号字符分隔。
类似地,我们可以使用以下命令更改文件的组所有者:
同样,没有内置的方法来获取远程系统的组列表。我们可以通过以下命令解决这个问题:
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 命令在远程文件系统上正常工作:
OutputChanging mode on /home/demouser/publicFile
没有用于操作本地文件权限的等效命令,但是您可以设置本地umask,这样任何复制到本地系统的文件都将具有相应的权限。
可以使用lumask
命令完成:
OutputLocal umask: 022
现在,所有下载的普通文件(只要没有使用-p
标志)将具有 644 权限。
SFTP 还允许您在本地和远程系统上创建目录,分别使用lmkdir
和mkdir
。
文件命令的其余部分仅针对远程文件系统:
这些命令复制了它们的 shell 等效命令的核心行为。如果您需要在本地文件系统上执行这些操作,请记住可以通过发出以下命令进入 shell:
或者通过在命令前加上!
来执行本地系统上的单个命令,就像这样:
当您完成SFTP会话时,请使用exit
或bye
来关闭连接。
结论
虽然SFTP语法远不及现代shell工具,但它可以用于提供与传统FTP语法的兼容性,或者用于在某些环境中谨慎限制远程用户可用功能的情况。
例如,您可以使用SFTP来允许特定用户在没有SSH访问权限的情况下传输文件。有关此过程的更多信息,请查看我们的教程:如何在没有Shell访问权限的情况下启用SFTP。
如果您习惯使用FTP或SCP来完成传输,那么SFTP是充分利用两者优势的好方法。虽然它并不适用于每种情况,但是它是您工具库中具有灵活性的工具。