SFTP和SCP

介绍如何使用SFTP和SCP进行数据传输,以及两者的不同。

简介

SFTP 和 SCP 都是利用 SSH 实现本地和远程服务器间的安全数据传输。由于两者都使用SSH协议,所以如果你安装好了OpenSSH, 也就可以直接使用SFTP和SCP,无需额外安全。

去掉两个命令前的S(Security),变成FTP和CP就很容易理解两个命令。CP(Copy)命令是Linux下常见的复制命令。FTP(File Transfer Protocol)是文件传输协议。加上S, 就是利用SSH协议的安全版。

SCP基本用法

1
2
3
4
5
usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]

[-l limit] [-o ssh_option] [-P port] [-S program]

[[user@]host1:]file1 ... [[user@]host2:]file2

基本用法很简单,指定源文件地址和目标文件地址,如果是远程服务器,则需要指定用户名和主机名。

SFTP基本用法

SFTP需要先连接服务器。连接方式和SSH一样。如果已经配置过SSH了,那么在SFTP后直接接配置文件中的别名即可。如何配置SSH, 可以参考这里

连接服务器后,输入命令 HELP, 就可以看到具体的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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 [-afPpRr] remote [local] Download file
reget [-fPpRr] remote [local] Resume download file
reput [-fPpRr] [local] remote Resume upload file
help Display this help text
lcd path Change local directory to 'path'
lls [ls-options [path]] Display local directory listing
lmkdir path Create local directory
ln [-s] oldpath newpath Link remote file (-s for symlink)
lpwd Print local working directory
ls [-1afhlnrSt] [path] Display remote directory listing
lumask umask Set local umask to 'umask'
mkdir path Create remote directory
progress Toggle display of progress meter
put [-afPpRr] local [remote] Upload file
pwd Display remote working directory
quit Quit sftp
rename oldpath newpath Rename remote file
rm path Delete remote file
rmdir path Remove remote directory
symlink oldpath newpath Symlink remote file
version Show SFTP version
!command Execute 'command' in local shell
! Escape to local shell
? Synonym for help

看上去好像很复杂,其实这个模型非常简单。本质上就是维护本地和远程服务器的文件系统和状态,再通过get和put操作下载和上传。

远程服务器: 由于我们已经登陆了服务器,所以可以用ls, mkdir, cd等命令和操作文件夹。

本地:和远程服务器的操作时相同的,区别是所有命令前面加上字母l,表示本地。如lls, lmkdir, lcd.

文件传输: 通过上面两步,我们得到两个路径,远程服务器路径和本地路径。然后通过get file就可以将远程服务器路径下的文件下载到本地路径下。put命令同理。

SCP和SFTP不同点

关键点是交互方式的不同。SCP是非交互式的,SFTP是交互式的。

什么是交互式?交互式即是工具本身会帮助你保存某些状态,减少人的心智负担。

交互式本身适合人的操作,所以手动从远程服务器中获取文件我比较喜欢用SFTP. 有些工具甚至会提供STFP的图形界面,比如MobaXterm.

那非交互式适合什么呢?适合编写脚本。

编写脚本的时候其实不需要工具去记忆某些状态,因为脚本本身就可以通过变量来记录状态,通过脚本显式和统一地记录状态会更为清晰和易用。

所以如果需要编写脚本传输数据,显然使用SCP更好。

Author: 方镇澎
Link: http://fzp.github.io/2019/09/28/2019-9-29-sftp-scp/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.