SFTP是什么?
FTP,全称为“文件传输协议”,是一种高人气远程系统间文件传输方法。
SFTP的全称则为SSH文件传输协议,或者安全文件传输协议,这是一套打包在SSH当中的独立协议,能够以类似的方式通过安全连接完成文件传输。其优势在于利用安全连接传输文件,同时能够遍历本地与远程系统上的文件系统。
在大多数情况下,SFTP都拥有更出色的底层安全功能与SSH连接承载能力。FTP的安全性则比较低下,意味着大家应当只在特定场景或者受信网络中使用。
尽管SFTP被集成在多种图形工具当中,但在今天的教程里,我们将介绍如何通过其交互命令行界面进行使用。
如何接入SFTP
在默认情况下,SFTP采用SSH协议来验证并建立安全连接。有鉴于此,SSH中的验证方法也都适用于SFTP。
虽然默认情况下可以轻松使用并设置密码,但这里建议大家创建SSH密钥并将公钥传输至任何需要访问的系统当中。这样做的安全性更高,且从长远角度讲能够显著节约时间。
如果大家能够利用SSH接入设备,即相当于完成了利用SFTP管理文件的全部先决条件。使用以下命令测试SSH访问:
ssh username@remote_hostname_or_IP
如果结果正常,直接退出:
exit
我们也可以使用以下命令建立一条SSH连接,而后打开SFTP会话:
sftp username@remote_hostname_or_IP
大家将接入远程系统,提示符也将变更为SFTP提示符。
获取SFTP帮助信息
首先要了解的就是帮助命令,即help,其能够帮助我们了解SFTP的各项常规操作。大家可以在提示符中直接输入:
help
?
列出的可用命令如下:
大家还可以在下面的章节中了解到其中部分命令的使用方式。
利用SFTP进行导航
我们可以利用多种命令功能对远程系统中的文件结构进行导航。
首先,我们找到当前远程系统上的目录。与常见的shell会话一样,我们可以使用以下命令:
pwd
Remote working directory: /home/demouser
我们可以利用另一条类似的命令查看远程系统中的当前目录内容:
ls
Summary.txt info.html temp.txt testDirectory
请注意,SFTP界面中的命令并非普通shell命令,而且也非富功能型,但其同样能够实现更多重要的可选标记:
ls -la
要前往其它目录,则:
cd testDirectory
现在我们可以对远程文件系统进行遍历了,但我们如何访问自己的本地文件系统呢?我们可以通过添加l将命令指向本地文件系统。
这时所有命令都将指向当前本地工作目录:
lpwd
Local working directory: /Users/demouser
我们可以列出当前目录中的全部内容:
lls
我们也可以变更想要交互的本地系统目录:
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以保持合适的权限与访问次数:
get -Pr someDirectory
将本地文件传输至远程系统
将本地文件传输至远程系统可使用put命令:
put localFile
Uploading localFile to /home/demouser/localFile
localFile 100% 7607 7.4KB/s 00:00
同样的,put也支持get命令的各标记,因此大家也可以使用以下命令:
put -r localDirectory
请注意,当前OpenSSH版本存在一项bug,导致以上命令无法正常执行。如果使用问题版本OpenSSH执行以上命令,则会返回下列错误提示:
Couldn't canonicalise: No such file or directory.
为了解决这一问题,我们需要使用mkdir localDirectory命令在远程端创建目标目录,而后即可正常使用上述命令。
我们也可以使用df命令完成文件的下载与上传。在它的帮助一,大家可以检查自身是否拥有足够的传输存储空间:
df -h
请注意,此命令不具备本地版本,但我们可以使用!命令加以解决。
!命令会让我们前往一套本地shell,在这里我们可以在本地系统上执行任何命令。下面检查磁盘使用量:
!
df -h
任何其它本地命令都能够正常起效。要返回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
没有专门修改本地文件权限的命令,但大家可以设置local umask,这样任意文件在被复制到本地系统时都将拥有合适的权限。
这里我们需要使用lumask命令:
lumask 022
Local umask: 022
现在全部下载完成的常规文件(只要未使用-p)都将拥有644权限。
SFTP允许大家利用lmkdir与mkdir分别在本地与远程系统上创建目录。
其它文件命令则只适用于远程文件系统:
ln
rm
rmdir
这些命令与其shell版本在作用上完全一致。如果大家需要在本地文件系统上执行这些操作,请记得使用!命令首先进入shell。
或者也可直接将!作为前缀:
!chmod 644 somefile
在完成SFTP会话内的操作后,使用exit或者bye断开连接。
bye
总结
尽管SFTP是一款简单的工具,但其非常适用于管理服务器并在不同服务器间实现文件传输。
如果大家之前使用FTP或者SCP进行文件传输,那么SFTP无疑是对二者的优势进行了结合。尽管其并非适合所有环境,但它仍然是一款值得尝试的灵活工具。