如何利用SFTP在远程服务器中保障文件传输安全

提供:ZStack云计算

SFTP是什么?

FTP,全称为“文件传输协议”,是一种高人气远程系统间文件传输方法。

SFTP的全称则为SSH文件传输协议,或者安全文件传输协议,这是一套打包在SSH当中的独立协议,能够以类似的方式通过安全连接完成文件传输。其优势在于利用安全连接传输文件,同时能够遍历本地与远程系统上的文件系统。

在大多数情况下,SFTP都拥有更出色的底层安全功能与SSH连接承载能力。FTP的安全性则比较低下,意味着大家应当只在特定场景或者受信网络中使用。

尽管SFTP被集成在多种图形工具当中,但在今天的教程里,我们将介绍如何通过其交互命令行界面进行使用。

如何接入SFTP

在默认情况下,SFTP采用SSH协议来验证并建立安全连接。有鉴于此,SSH中的验证方法也都适用于SFTP。

虽然默认情况下可以轻松使用并设置密码,但这里建议大家创建SSH密钥并将公钥传输至任何需要访问的系统当中。这样做的安全性更高,且从长远角度讲能够显著节约时间。

这里建议大家参阅SSH密钥设置一文以了解如何完成上述操作。

如果大家能够利用SSH接入设备,即相当于完成了利用SFTP管理文件的全部先决条件。使用以下命令测试SSH访问:

ssh username@remote_hostname_or_IP

如果结果正常,直接退出:

exit

我们也可以使用以下命令建立一条SSH连接,而后打开SFTP会话:

sftp username@remote_hostname_or_IP

大家将接入远程系统,提示符也将变更为SFTP提示符。

获取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以保持合适的权限与访问次数:

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

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

请注意,此命令不具备本地版本,但我们可以使用!命令加以解决。

!命令会让我们前往一套本地shell,在这里我们可以在本地系统上执行任何命令。下面检查磁盘使用量:

!
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

没有专门修改本地文件权限的命令,但大家可以设置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无疑是对二者的优势进行了结合。尽管其并非适合所有环境,但它仍然是一款值得尝试的灵活工具。

本文来源自DigitalOcean Community。英文原文:How To Use SFTP to Securely Transfer Files with a Remote Server By Justin Ellingwood

翻译:diradw

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值