7.5 传输文件

计算机联网的主要目的就是资源共享。在资源共享方面,使用最多的是文件共享。有很多不同的方法可以在网络节点上传输文件。这则攻略就讨论了如何用常见的协议FTP、SFTP、RSYNC和SCP传输文件。

7.5.1 新手上路

用来在网络上传输文件的命令多数都已默认包含在安装好的Linux中。通过FTP传输文件可以使用lftp命令,通过SSH传输文件可以使用sftp,RSYNC使用SSH与rsync命令,并借助scp通过SSH进行传输。

7.5.2 实战演练

文件传输协议(File Transfer Protocol,FTP)是一个古老的用于网络主机之间传输文件的文件传输协议。我们可以用lftp命令访问FTP服务器以便传输文件。它使用端口21。只有远程主机上安装有FTP服务器才能使用FTP。很多公共网站都是用FTP共享文件。

要连接FTP服务器传输文件,可以使用:

  1. $ lftp username@ftphost

它会提示你输入密码,然后显示一个像下面那样的登录提示符:

  1. lftp username@ftphost:~>

你可以在提示符后输入命令,如下所示。

  • cd directory改变目录。

  • lcd改变本地主机的目录。

  • mkdir创建目录。

  • get filename下载文件:

  1. lftp username@ftphost:~> get filename
  • put filename从当前目录上传文件:
  1. lftp username@ftphost:~> put filename
  • quit退出lftp会话。

lftp提示符支持命令自动补全。

7.5.3 补充内容

让我们看看其他可用于网络文件传输的技术及命令。

  • FTP自动传输

ftp是一个基于FTP文件传输的命令。相比较而言,lftp的用法更灵活。lftpftp为用户启动一个交互式会话(通过显示消息提示用户输入)。如果我们不使用交互模式,而是希望进行自动文件传输,又该怎么做呢?下面的脚本可以用来实现FTP自动传输。

  1. #!/bin/bash
  2. #文件名: ftp.sh
  3. #用途:自动化 FTP 传输
  4. HOST='domain.com'
  5. USER='foo'
  6. PASSWD='password'
  7. ftp -i -n $HOST <<EOF
  8. user ${USER} ${PASSWD}
  9. binary
  10. cd /home/slynux
  11. puttestfile.jpg
  12. getserverfile.jpg
  13. quit
  14. EOF

上面的脚本包含下列结构:

  1. <<EOF
  2. DATA
  3. EOF

这是用来通过stdin向FTP命令发送数据。1.5节中已讲解了重定向到stdin的各种方法。

在示例脚本中,ftp的选项 -i关闭用户的交互会话,user ${USER} ${PASSWD}设置用户名和密码,binary将文件模式设置为二进制模式。

  • SFTP

SFTP(Secure FTP,安全FTP)是一个类似于FTP的文件传输系统,它运行在SSH连接之上。SFTP利用SSH连接模拟FTP接口。它不需要远端运行FTP服务器来执行文件传输,但必须安装并运行OpenSSH服务器。SFTP是一个交互式命令,提供了命令提示符。

下面的命令用来执行文件传输。对于特定主机、用户和密码的自动化FTP会话来说,余下的命令都是一样的。

  1. cd /home/slynux
  2. put testfile.jpg
  3. get serverfile.jpg

运行sftp

  1. $ sftp user@domainname

lftp类似,输入quit命令可以退出sftp会话。

SSH服务器有时候并不在默认的端口22上运行。如果它在其他端口运行,我们可以在sftp中用 -oPort=PORTNO来指定端口号。

例如:

  1. $ sftp -oPort=422 user@slynux.org

7.5 传输文件 - 图1 -oPort应该作为sftp命令的第一个参数。

  • RSYNC

作为一款重要的命令行工具,rsync广泛用于网络文件文件与系统快照的备份。6.10节详细讲解了rsync的用法。

  • SCP

SCP(Secure Copy,安全复制)是一项比传统远程复制工具rcp更安全的文件复制技术。文件都是通过SSH加密通道进行传输的。我们可以像下面这样轻松地将文件传输到远程主机:

  1. $ scp filename user@remotehost:/home/path

该命令会提示你输入密码。我们可以用SSH自动登录功能来免于输入密码。7.7节讲解了SSH自动登录。

因此,用scp传输文件无需特定的脚本。一旦实现了SSH自动登录,scp就可以直接执行,而不需要再提示输入密码。

命令中的remotehost可以使IP地址或域名。scp命令的格式是:

  1. $ scp SOURCE DESTINATION

SOURCEDESTINATION可以采用形如username@localhost:/path的格式。例如:

  1. $ scp user@remotehost:/home/path/filename filename

上面的命令将远程主机中的文件复制到当前目录,并采用给定的文件名。

如果SSH没有运行在端口22,使用 -oPort,并采用和sftp相同的语法。

  • 用SCP进行递归复制

使用scp-r选项,我们可以在两台网络主机之间对文件夹进行递归复制:

  1. $ scp -r /home/slynux user@remotehost:/home/backups
  2. # 将目录/home/slynux递归复制到远程主机中

scp-p选项能够在复制文件的同时保留文件的权限和模式。

7.5.4 参考

1.5节讲解了如何用EOF实现标准输入。