Linux 环境中有多种方式可以实现不同主机之间的文件传输或同步。在不同的场景下,选择合适的方法进行传输会大大提高工作效率以及质量。本文通过总结 Linux 环境下常用的几种文件传输方法,结合具体使用实例以及对这些方法优缺点的分析对比,希望能够对需要在 Linux 或 unix 环境下进行文件传输或同步的朋友提供一些帮助。
ftp
ftp 命令使用文件传输协议(File Transfer Protocol, FTP)在本地主机和远程主机之间或者在两个远程主机之间进行文件传输。
FTP 协议允许数据在不同文件系统的主机之间传输。尽管这个协议在传输数据上提供了高适应性,但是它并没有尝试去保留一个特定文件系统上的文件属性(例如一个文件的保护模式或者修改次数)。而且 FTP 协议很少对一个文件系统的整体结构作假定,也不提供这样的功能,比如递归的拷贝子目录。在使用 ftp 命令时,需要注意 FTP 协议的这些特性。当需要保留文件属性或者需要递归的拷贝子目录时,可以使用 rcp/scp 等命令。
基本语法
ftp 命令的一般格式如下:
$ ftp 主机名 /IP
其中“主机名 /IP ”是所要连接的远程机的主机名或 IP 地址。在命令行中,主机名属于可选项,如果指定主机名,ftp 将试图与远程机的 ftp 服务程序进行连接;如果没有指定主机名,ftp 将给出提示符,等待用户输入命令:
$ ftp ftp > |
此时在 ftp> 提示符后面输入 open 子命令加主机名或 IP 地址,将试图连接指定的主机。不管使用哪一种方法,如果连接成功,需要在远程机上登录。用户如果在远程机上有帐号,就可以通过 ftp 使用这一帐号并需要提供口令。在远程机上的用户帐号的读写权限决定该用户在远程机上能下载什么文件和能将上载文件放到哪个目录中。在远程站点上登录成功后,在“ ftp> ”提示符下可以自由使用 ftp 提供的各种子命令,最常用的子命令如下表所示。
表 1. ftp 子命令
命令 | 描述 |
ls | 列出远程机的当前目录 |
cd | 在远程机上改变工作目录 |
lcd | 在本地机上改变工作目录 |
ascii | 设置文件传输方式为 ASCII 模式 |
binary | 设置文件传输方式为二进制模式 |
close | 终止当前的 ftp 会话 |
get (mget) | 从远程机传送指定文件到本地机 |
put (mput) | 从本地机传送指定文件到远程机 |
open | 连接远程 ftp 站点 |
quit | 断开与远程机的连接并退出 ftp |
? | 显示本地帮助信息 |
! | 转到 Shell 中 |
prompt 1 | 关闭交互模式 |
使用实例:
利用编写 ftp 脚本可以自动完成文件传输任务。具体方法是使用 ftp 命令的 -in 选项,并重定向 ftp 命令的输入。现在我们来编写一个利用 ftp 登录到远程服务器,并以 bin 的文件格式,在 /home 目录下,下载 file1.log 以及 file2.sh 至本机 /opt/ibm/,并从本地 /opt 目录上传文件 file3.jave 至远程服务器 /home 的自动化脚本。
ftp -ni <<+ open $IP user $USERNAME $PASSWD bin cd /home lcd /opt/ibm mget file1.log file2.sh lcd /opt mput file3.jave ls bye |
rcp
rcp 意为“ remote file copy ”(远程文件拷贝)。该命令用于计算机之间进行文件拷贝。其有两种格式。第一种格式用于文件到文件的拷贝;第二种格式用于把文件或目录拷贝到另一个目录中。
基本语法
rcp [-px] [-k realm] file1 file2 rcp [-px] [-r] [-k realm] file directory |
每个文件或目录参数既可以是远程文件名也可以是本地文件名。远程文件名具有如下形式:rname@rhost:path,其中 rname 为远程用户名,rhost 为远程计算机名,path 为该文件的路径。下表说明了 rcp 命令各个参数的含义。
表 2. rcp 命令的命令行参数
选项 | 描述 |
-r | 递归地将源目录中的所有内容拷贝到目的目录中。若使用该选项,目的须为一个目录。 |
-p | 试图保留源文件的修改时间和模式,忽略 umask 。 |
-k | 请求 rcp 获得在指定区域内的远程主机的 Kerberos 许可,而不是获得由 krb_relmofhost(3)确定的远程主机区域内的远程主机的 Kerberos 许可。 |
-x | 为传送的所有数据进行 DES 加密。这会影响响应时间和 CPU 利用率,但是可以提高安全性。 |
如果在文件名中指定的路径不是完整的路径名,则该路径将被解释为相对远程机上同名用户的主目录。若没有给出远程用户名,则使用当前用户名。如果远程机上的路径包含特殊 shell 字符,需要使用反斜线(\)、双引号(”)或单引号(’)将其括起来,使所有的 shell 元字符都能被远程地解释。需要说明的是,rcp 不提示输入口令,它通过 rsh(remote shell)命令来执行拷贝。
使用实例:
- 将本地文件复制到远程登录目录中
rcp <source> <remoteDir>
- 将多个本地文件复制到远程登录目录的子目录中
rcp <source1> <source2> <source3> <subdirectory in remote system>
- 将多个文件从多个远程源复制到使用不同用户名的远程目标中
rcp <host1.user1:source1> <host2.user2:source2> <dest.destuser:directory>
scp
scp 命令在网络上的主机之间拷贝文件,它是安全拷贝(secure copy)的缩写。 scp 命令使用 ssh 来传输数据,并使用与 ssh 相同的认证模式,提供同样的安全保障。 scp 命令的用法和 rcp 命令非常类似,这里就不做过多介绍了。一般推荐使用 scp 命令,因为它比 rcp 更安全。
我们可以通过配置 ssh,使得在两台机器间拷贝文件时不需要每次都输入用户名和密码。
基本语法