在工作站和 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 . 在这里我们使用 . 来表示本地的当前路径。 使用 rsyncrsync 是强大的同步文件的命令行工具,它比 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 表示在传输过程中进行压缩来减少传输量。 下载只需要将 SRC 和 DEST 的地位对换。 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 图形客户端。下载地址
|