介绍
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 还允许您分别使用 lmkdir
和 mkdir
在本地和远程系统上创建目录。
其余文件命令仅针对远程文件系统:
ln rm rmdir
这些命令复制了它们的 shell 等效项的核心行为。 如果您需要在本地文件系统上执行这些操作,请记住您可以通过发出以下命令进入 shell:
!
或者通过在命令前加上 !
来在本地系统上执行单个命令,如下所示:
!chmod 644 somefile
完成 SFTP 会话后,使用 exit
或 bye
关闭连接。
bye
结论
尽管 SFTP 语法远不如现代 shell 工具全面,但它对于提供与传统 FTP 语法的兼容性或谨慎限制某些环境的远程用户可用的功能很有用。
例如,您可以使用 SFTP 使特定用户能够在没有 SSH 访问权限的情况下传输文件。 有关此过程的更多信息,请查看我们关于 如何在没有 Shell 访问的情况下启用 SFTP 的教程。
如果您习惯于使用 FTP 或 SCP 来完成传输,那么 SFTP 是利用两者优势的好方法。 虽然它并不适用于所有情况,但它是一个灵活的工具,可以在您的曲目中使用。