在工作站和 PC 间传输文件

我们经常会将我们本地的一些文件上传到工作站上,或是从工作站下载文件。这些工作用命令行可以轻松完成。

建议在传输文件之前对要传输的文件进行打包,以便有更高的传输效率。在 Linux 下可以使用 tar 工具进行打包。

$ tar -cjf archive.tar.bz2 folder1/ folder2/

上面的命令是将两个文件夹下的所有文件打包到 archive.tar.bz2 文件中,并进行一定压缩。在工作站打包数据建议使用这个命令。

Windows 用户可以使用 WinRAR 或者 Zip 进行打包。

在服务器中,相应的解包命令为

$ tar -xjf archive.tar.bz2
$ unzip archive.zip
$ unrar e archive.rar

Linux 或 Mac

使用 scp

在命令行中可以使用 scp 命令进行传输文件。这是依赖于 SSH 的一个命令,如果已经配置了 SSH 无密码 登录那么每次复制将不必输入密码。否则,每次传输文件都需要输入密码。

以下命令均在本地计算机中执行。

$ scp file username@ip_address:
$ scp file username@ip_address:Documents/

上面的第一条命令即可将 file 传输到工作站相应账号的 HOME 文件夹下,如果想要指定目录,可以直接写 相对于 HOME 文件夹的路径,例如第二条命令。

如果要使用 scp 命令复制文件夹,需要加上 -r 参数。

$ scp -r folder username@ip_address:

从服务器传输文件到本地只需将两个参数的位置调换。

$ scp username@ip_address:file .

在这里我们使用 . 来表示本地的当前路径。

使用 rsync

rsync 是强大的同步文件的命令行工具,它比 scp 更加智能。rsync 支持从本地到本地, 从本地到服务器,从服务器到本地的文件传输。使用 rsync 访问服务器依赖于 SSH 的 配置。下面的例子假定用户已经配置了 SSH 无密码登录。

传输文件

rsync 基本的传输文件命令为

# 下载文件
rsync [OPTION...] [USER@]HOST:SRC... [DEST]

# 上传文件
rsync [OPTION...] SRC... [USER@]HOST:DEST

其中 SRC 表示来源的路径,DEST 表示目标路径。由于要访问服务器,因此当来源或 目标不是本地时,需要指定服务器的用户和主机名。用户和主机名的指定可以直接使用 SSH 的 .ssh/config 表示的格式。

因此上传可用

# 假设已经配好了 SSH config,server 表示的主机有意义
rsync -avz folder server:

# 如果没有配置 SSH config
rsync -avz folder user@server_ip:

其中的三个选项,a 表示归档模式,在这个模式下传输将递归地进行,并保留文件的 权限信息;v 表示将中间信息输出;z 表示在传输过程中进行压缩来减少传输量。 下载只需要将 SRCDEST 的地位对换。

rsync 的优势在于,每次在传输之前会对文件进行比较,只会传输那些真正改变的文件, 在多数情况下会极大减小传输量。下面是一个例子。

[liuhy@laptop ~]$ ls test/
total 0                        # test 文件夹只有三个文件
-rw-rw-r--. 1 liuhy liuhy 0 Jul  1 15:25 1.txt
-rw-rw-r--. 1 liuhy liuhy 0 Jul  1 15:25 2.txt
-rw-rw-r--. 1 liuhy liuhy 0 Jul  1 15:25 3.txt

# 使用 rsync 上传
[liuhy@laptop ~]$ rsync -avz test server:
sending incremental file list
test/
test/1.txt
test/2.txt
test/3.txt

sent 213 bytes  received 80 bytes  195.33 bytes/sec
total size is 0  speedup is 0.00

# 创建新文件 4.txt
[liuhy@laptop ~]$ echo "hello world" >> test/4.txt
[liuhy@laptop ~]$ rsync -avz test server:
sending incremental file list
test/
test/4.txt                    # <- 只上传了这一个文件!

sent 184 bytes  received 42 bytes  150.67 bytes/sec
total size is 12  speedup is 0.05

同步时删除

使用 rsync 上传文件时,如果 SRC 的文件比 DEST 的文件要少时,rsync 默认不会去 处理 DEST 多出来的文件。如果要实现真的的完全同步,即删除 DEST 多出来的文件,需要 给 rsync 加上 --delete 选项。

接着上面的例子,在本地删除 1.txt,并告诉服务器也要删除这个文件

[liuhy@laptop ~]$ rm test/1.txt       # 删除 1.txt
[liuhy@laptop ~]$ rsync -avz --delete test server:
sending incremental file list
test/
deleting test/1.txt                   # <- 在做删除操作!

sent 113 bytes  received 37 bytes  100.00 bytes/sec
total size is 12  speedup is 0.08

断点续传

rsync 的同步算法只能针对整个的文件。默认情况下,如果文件传输不完整,rsync 会 扔掉这些文件,在下次传输的时候重新处理。当要传输单个大文件时,由于网络等多方面 原因,传输很难一次完成,这时候就需要断点续传功能。

# 使用 rsync 指定 --partial 选项来保留传输未完成的文件
[liuhy@laptop Downloads]$ rsync -avz --partial --progress gcc-7.3.0.tar.xz server:
sending incremental file list
gcc-7.3.0.tar.xz
     36,208,640  57%   11.43MB/s    0:00:02  ^CKilled by signal 2.
                                           # ^ 使用 Ctrl+C 强制终止
rsync error: unexplained error (code 255) at rsync.c(638) [sender=3.1.2]
# 指定 --append 选项来传输未完成的文件
[liuhy@laptop Downloads]$ rsync -avz --append --progress gcc-7.3.0.tar.xz server:
sending incremental file list
gcc-7.3.0.tar.xz
     62,462,388 100%   11.71MB/s    0:00:02 (xfr#1, to-chk=0/1)

sent 26,481,503 bytes  received 34 bytes  7,566,153.43 bytes/sec
total size is 62,462,388  speedup is 2.36
  # ^ 注意这是从 57% 开始传的,sent 和 total size 不一样。

将工作站目录挂载到本地

如果不想使用 scp 命令,可以利用 sshfs 将服务器的 HOME 目录挂载到本地。这并不会消耗你本地的存储空间。

首先,使用如下命令安装 sshfs 应用

$ sudo apt install sshfs

其中 apt 是 ubuntu/debian 的安装包管理器,如果你在使用其它 Linux 发行版,请使用相应的安装包管理器进行安装。

安装完毕后,在你喜欢的本地目录下建立挂载点,为了方便,可以选择个人的本地 HOME 文件夹。

$ mkdir workstation

其中 workstation 为挂载点的名称,可以随意填写。

最后,将服务器端的 HOME 文件夹挂载到本地

$ sshfs username@ip_address: workstation

其中 username 为你用户名,ip_address为服务器的地址。上面命令的最后一个 workstation 表示将服务器文件夹挂载到刚创建的挂载点 workstation 上。使用时请将其替换成你实际创建挂载点的路径。

挂载成功后,你可以从挂载点处(在本说明中为本地 HOME 文件夹下的 workstation 目录)直接访问你的服务器远端的目录,非常方便。

当你不需要使用服务器文件时,需要将服务器挂载目录卸载。命令为

$ fusermount -u workstation

其中 workstation 为你事先创建好的挂载点。卸载前请确保本地没有程序在使用远程目录下的文件。

Windows

使用 WinSCP 图形客户端。下载地址

  • 在下图中分别输入服务器IP,用户名,密码。
    client1
    在 WinSCP 中同样可以配置 SSH 无密码登录,点击“高级”即可进行类似设置(需要 ppk 文件:生成方法)。

  • 进入传输面板进行操作即可。