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服务器传输文件,可以使用:
- $ lftp username@ftphost
它会提示你输入密码,然后显示一个像下面那样的登录提示符:
- lftp username@ftphost:~>
你可以在提示符后输入命令,如下所示。
用
cd directory
改变目录。用
lcd
改变本地主机的目录。用
mkdir
创建目录。用
get filename
下载文件:
- lftp username@ftphost:~> get filename
- 用
put filename
从当前目录上传文件:
- lftp username@ftphost:~> put filename
- 用
quit
退出lftp
会话。
lftp
提示符支持命令自动补全。
7.5.3 补充内容
让我们看看其他可用于网络文件传输的技术及命令。
- FTP自动传输
ftp
是一个基于FTP文件传输的命令。相比较而言,lftp
的用法更灵活。lftp
和ftp
为用户启动一个交互式会话(通过显示消息提示用户输入)。如果我们不使用交互模式,而是希望进行自动文件传输,又该怎么做呢?下面的脚本可以用来实现FTP自动传输。
#!/bin/bash
#文件名: ftp.sh
#用途:自动化 FTP 传输
HOST='domain.com'
USER='foo'
PASSWD='password'
ftp -i -n $HOST <<EOF
user ${USER} ${PASSWD}
binary
cd /home/slynux
puttestfile.jpg
getserverfile.jpg
quit
EOF
上面的脚本包含下列结构:
<<EOF
DATA
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会话来说,余下的命令都是一样的。
- cd /home/slynux
- put testfile.jpg
- get serverfile.jpg
运行sftp
:
- $ sftp user@domainname
和lftp
类似,输入quit
命令可以退出sftp
会话。
SSH服务器有时候并不在默认的端口22上运行。如果它在其他端口运行,我们可以在sftp
中用 -oPort=PORTNO
来指定端口号。
例如:
- $ sftp -oPort=422 user@slynux.org
![]()
-oPort
应该作为sftp
命令的第一个参数。
- RSYNC
作为一款重要的命令行工具,rsync
广泛用于网络文件文件与系统快照的备份。6.10节详细讲解了rsync
的用法。
- SCP
SCP(Secure Copy,安全复制)是一项比传统远程复制工具rcp
更安全的文件复制技术。文件都是通过SSH加密通道进行传输的。我们可以像下面这样轻松地将文件传输到远程主机:
- $ scp filename user@remotehost:/home/path
该命令会提示你输入密码。我们可以用SSH自动登录功能来免于输入密码。7.7节讲解了SSH自动登录。
因此,用scp
传输文件无需特定的脚本。一旦实现了SSH自动登录,scp
就可以直接执行,而不需要再提示输入密码。
命令中的remotehost
可以使IP地址或域名。scp
命令的格式是:
- $ scp SOURCE DESTINATION
SOURCE
或DESTINATION
可以采用形如username@localhost:/path
的格式。例如:
- $ scp user@remotehost:/home/path/filename filename
上面的命令将远程主机中的文件复制到当前目录,并采用给定的文件名。
如果SSH没有运行在端口22,使用 -oPort
,并采用和sftp
相同的语法。
- 用SCP进行递归复制
使用scp
的 -r
选项,我们可以在两台网络主机之间对文件夹进行递归复制:
- $ scp -r /home/slynux user@remotehost:/home/backups
- # 将目录/home/slynux递归复制到远程主机中
scp
的 -p
选项能够在复制文件的同时保留文件的权限和模式。
7.5.4 参考
1.5节讲解了如何用EOF实现标准输入。