以前从服务端同步文件到本地,我很喜欢用 scp。不过,scp 有个不好的点就是你必须输入远程的路径,这就要求你得想办法记住你要同步的文件路径名。当然,你可以使用两个终端协同合作:一个终端负责执行 scp 命令,另一个则负责登录服务器,通过 cd
和 pwd
等来检索路径。今天发现了一个更好用的远程文件同步工具,叫做 sftp。如果对 sftp 不了解,那么你至少应该听过 ftp 吧。ftp 的全称是 File Transfer Protocol,是 OSI 模型中的一个应用层协议,用于两个远端主机间的文件传输。而 sftp 的全称则是 Secure File Transfer Protocol,是基于 ftp 却使用 ssh 来进行加密传输的协议。对 sftp 工具有这一层的认识也就够了,接下来我们就来动手看看如何使用它。
一般来说,使用 ssh 连接远程服务器,只需指定下面的命令即可:
$ ssh -p 1234 -o ServerAliveInterval=30 user@remote-server-ip
在这个命令中,-p
参数指定远程 ssh 端口号,-o
则指定一系列参数,比如这里的 ServerAliveInterval=30
。user
是远程服务器的用户名,而 remote-server-ip
是远程服务器的 ip 地址,例如:120.23.3.16
。
sftp 的使用类似,例如
$ sftp -P 1234 -o ServerAliveInterval=30 user@remote-server-ip
需要注意的是,这里指定端口号的参数变成了大写的 -P
了。当输入完远程登录的密码后,就会跳出一行
sftp>
表明我们已经成功地通过 sftp 连上了远程主机。接下来可以输入 cd
,pwd
,ls
等命令在远程主机上进行目录导航,这个和一般的目录导航命令没有两样。如果要导航本地主机,只需要在这几个命令中加上前缀 l
即可,例如 lcd
,lpwd
,lls
等。
当然了,目录导航可不是我们的主要目的,我们需要在两台主机间传输文件。这在 sftp 眼中再简单不过了,只需要一行短短的命令就够了:
sftp> get filename
或者
sftp> put filename
get
是从远程同步到本地的命令,而 put
则是从本地同步到远程的命令,而 filename
是当前目录下的一个文件名。如果想重命名传输下来的文件,只需要在后面加上新的文件名即可,和平常我们执行 cp
命令是一样的。例如
sftp> get filename filename1
若要拷贝整个目录,也只需要指定递归参数 -r
即可,这也和我们平常执行 cp
命令是一样的。例如
sftp> get -r directory
怎么样,比起 scp
是不是简单多了?
除此之外,另一个命令也是我们常用的,就是 df
,用于显示当前的硬盘使用情况
sftp> df
Size Used Avail (root) %Capacity
41151808 8708644 30329732 32443164 21%
df
还可以配合 -h
参数
sftp> df -h
Size Used Avail (root) %Capacity
39.2GB 8.3GB 28.9GB 30.9GB 21%
好了,以上介绍的只是 sftp 的简单用法。有需求的话,今后还可以往深层次继续探索下去。