网络文件操作与传输全攻略
1. 脚本文件的包含与用户输入读取
在脚本编写中,有时需要包含其他脚本文件的内容。例如,执行以下命令可以运行
config.sh
文件中的命令:
. config.sh
这种文件“包含”的语法不会启动子 shell,对于一组需要使用同一个配置文件的脚本来说非常有用。
另外,
read
命令可以从标准输入读取一行文本,并将其存储在一个变量中。示例如下:
$ read var
这是一个 shell 内置命令,它可以和 shell 的其他未在本文中提及的功能结合使用。
2. 何时(不)使用 shell 脚本
shell 的功能十分丰富,很难在一篇文章中涵盖其所有重要元素。如果你对 shell 的其他功能感兴趣,可以参考一些关于 shell 编程的书籍。不过,当你开始使用
read
命令等时,需要思考是否使用了正确的工具。要记住,shell 脚本最擅长处理文件和简单命令。如果编写的内容变得复杂,尤其是涉及字符串操作或复杂的算术运算时,或许应该考虑使用 Python、Perl 或 awk 等脚本语言。
3. 网络文件传输方式
在网络环境中,经常需要在不同计算机之间传输和共享文件。下面介绍几种常见的文件传输方法。
3.1 快速复制
如果你想快速将本地计算机上的一个或多个文件复制到网络中的另一台计算机,而不考虑将其复制回来或进行复杂操作,可以使用 Python 来实现。操作步骤如下:
1. 进入包含要复制文件的目录。
2. 执行以下命令:
$ python -m SimpleHTTPServer
这个命令会启动一个基本的 Web 服务器,使该目录对网络中的任何浏览器可用。通常,它会在端口 8000 上运行。例如,如果执行该命令的计算机 IP 地址是 10.1.2.4,那么在目标计算机上访问
http://10.1.2.4:8000
就可以获取所需的文件。
3.2 rsync 工具
如果要移动整个目录结构,
scp -r
是一种方法,或者使用
tar
管道可以获得更好的性能:
$ tar cBvf - diretório | ssh host_remoto tar xBvpf -
但这些方法不够灵活,传输完成后,远程主机可能无法获得目录的精确副本。如果需要定期执行此类任务,尤其是计划自动化该过程,建议使用专门的同步工具
rsync
。在 Linux 中,
rsync
是标准的同步工具,性能良好,且提供了多种传输方式。
以下是
rsync
的一些基本操作模式和特点:
-
基本使用
:要使
rsync
在两个主机之间工作,源主机和目标主机都必须安装
rsync
,并且需要有从一台计算机访问另一台计算机的方式。最简单的文件传输方式是使用远程 shell 账户,通常假设使用 SSH 访问。例如,将一组文件复制到远程主机的主目录,可以使用以下命令:
$ rsync arquivo1 arquivo2 ... host:
在现代系统中,
rsync
默认使用 SSH 连接到远程主机。需要注意错误信息
rsync not found
,这表示远程 shell 无法在系统中找到
rsync
。如果
rsync
不在远程路径中,但系统中已安装,可以使用
--rsync-path=path
手动指定其位置。如果远程主机的用户名不同,需要在主机名前加上用户名,如:
$ rsync arquivo1 arquivo2 ... usuário@host:
默认情况下,
rsync
只复制文件。如果指定一个目录作为参数,会看到
skipping directory dir
的提示。要完整地传输整个目录层次结构,包括符号链接、权限、模式和设备等,需要使用
-a
选项。如果要将文件复制到远程主机的其他目录,可以这样操作:
$ rsync -a dir host:dir_destino
如果不确定文件传输会产生什么结果,可以使用
-nv
选项组合。
-n
表示以“试运行”模式操作,即不实际复制任何文件;
-v
表示详细模式,会显示传输细节和涉及的文件:
$ rsync -nva dir host:dir_destino
输出示例如下:
building file list ... done
ml/nftrans/nftrans.html
[more files]
wrote 2183 bytes read 24 bytes 401.27 bytes/sec
-
创建目录结构的精确副本
:默认情况下,
rsync复制文件和目录时不考虑目标目录的先前内容。例如,将包含文件a和b的目录d传输到已经有文件d/c的计算机上,传输后目标目录将包含d/a、d/b和d/c。要创建源目录的精确副本,需要删除目标目录中不存在于源目录的文件,可以使用--delete选项:
$ rsync -a --delete dir host:dir_destino
需要注意的是,这可能很危险,通常应该检查目标目录,避免意外删除重要文件。如果不确定,可以使用
-n
选项进行“试运行”。
-
使用结尾斜杠的影响
:在
rsync命令中指定目录作为源时,结尾的斜杠会显著改变其行为。例如:
$ rsync -a dir host:dir_dest
执行该命令后,远程主机的
dir_dest
目录中会包含一个
dir
子目录。而使用:
$ rsync -a dir/ host:dir_dest
rsync
会将
dir
目录中的所有内容复制到远程主机的
dir_dest
目录中,而不会在目标主机上创建
dir
目录。需要注意的是,在传输文件和目录时,意外添加结尾斜杠通常只是一种不便;但将结尾斜杠与
--delete
选项结合使用时,要格外小心,以免误删文件。
-
排除文件和目录
:
rsync可以排除文件和目录的传输。例如,要将本地的src目录传输到远程主机,但排除所有名为.git的文件和目录,可以使用以下命令:
$ rsync -a --exclude=.git src host:
如果要排除特定的项目,可以定义以
/
开头的绝对路径,如:
$ rsync -a --exclude=/src/.git src host:
这里的第一个
/
不是系统的根目录,而是传输的基础目录。以下是一些排除模式的技巧:
- 可以使用任意数量的
--exclude
参数。
- 如果相同的排除模式经常使用,可以将它们放在一个简单的文本文件中(每行一个模式),并使用
--exclude-from=arquivo
。
- 要排除名为
item
的目录,但包含同名的文件,可以使用
--exclude=item/
。
- 排除模式基于完整的文件名或目录名组件,可以包含简单的通配符。例如,
t*s
可以匹配
this
,但不匹配
ethers
。
- 如果排除的目录或文件名模式过于严格,可以使用
--include
来明确包含其他文件或目录。
-
传输完整性、安全措施和详细模式
:为了提高操作速度,
rsync使用快速检查来确定传输源中的文件是否已经存在于目标中。这种快速检查结合了文件大小和最后修改日期。第一次将完整的目录层次结构传输到远程主机时,rsync会发现目标中没有任何文件并进行全部传输。使用rsync -n可以进行测试。
当源文件和目标文件不同时,
rsync
会传输源文件并覆盖远程目标中的任何现有文件。但默认行为可能不够合适,你可能需要额外的保证或安全措施。以下是一些实用的选项:
-
--checksum
(缩写:
-c
):计算文件的校验和(通常是唯一签名),以确保文件相同。这会在传输过程中消耗额外的 I/O 和 CPU 资源,但在处理敏感数据或大小一致的文件时是必要的。
-
--ignore-existing
:不覆盖目标中已经存在的文件。
-
--backup
(缩写:
-b
):不覆盖目标中已有的文件,而是在传输新文件之前,将现有文件重命名并添加后缀
~
。
-
--suffix=s
:将
--backup
使用的后缀从
~
更改为
s
。
-
--update
(缩写:
-u
):不覆盖目标中日期晚于源文件的文件。
默认情况下,
rsync
会在出现问题时才输出信息。可以使用
rsync -v
启用详细模式,或使用
rsync -vv
获取更详细的信息。要在传输完成后获得完整的摘要,可以使用
rsync --stats
。
以下是
rsync
常用选项的总结表格:
| 选项 | 作用 |
| ---- | ---- |
|
-a
| 递归传输目录,保留文件属性 |
|
-n
| 试运行,不实际复制文件 |
|
-v
| 详细模式,显示传输细节 |
|
--delete
| 删除目标目录中不存在于源目录的文件 |
|
--checksum
| 计算文件校验和 |
|
--ignore-existing
| 不覆盖目标中已有的文件 |
|
--backup
| 备份目标中已有的文件 |
|
--suffix=s
| 修改备份文件的后缀 |
|
--update
| 不覆盖目标中日期较新的文件 |
|
-z
| 压缩数据传输 |
|
--bwlimit
| 限制带宽 |
以下是
rsync
基本操作的流程图:
graph TD;
A[开始] --> B[指定源和目标];
B --> C{是否需要排除文件};
C -- 是 --> D[使用 --exclude 选项];
C -- 否 --> E{是否需要创建精确副本};
D --> E;
E -- 是 --> F[使用 --delete 选项];
E -- 否 --> G{是否需要详细信息};
F --> G;
G -- 是 --> H[使用 -v 选项];
G -- 否 --> I[执行 rsync 命令];
H --> I;
I --> J[结束];
通过以上介绍,你可以根据不同的需求选择合适的文件传输方法和
rsync
选项,确保文件在网络中的安全、高效传输。
3.2 rsync 工具(续)
-
压缩
:很多用户喜欢将
-z选项与-a选项结合使用,在传输前压缩数据:
$ rsync -az dir host:dir_destino
压缩在某些情况下可以提高性能,比如通过慢速连接(如许多 DSL 连接的上行慢速链路)传输大量数据,或者两台主机之间的延迟较高时。但在快速的本地网络中,两端的计算机可能会受到压缩和解压缩数据所需的 CPU 时间限制,此时不进行压缩的传输可能会更快。
-
限制带宽
:向远程主机上传大量数据时,很容易导致互联网连接的上行链路拥塞。即使在传输过程中不使用下行链路(通常带宽较高),如果让
rsync以最快速度运行,由于 TCP 输出数据包(如 HTTP 请求)需要与传输数据竞争上行链路带宽,连接仍会显得很慢。
为了解决这个问题,可以使用--bwlimit选项为上行链路留出一些空间。例如,要将带宽限制为 10000 Kbps,可以执行以下命令:
$ rsync --bwlimit=10000 -a dir host:dir_destino
-
从远程计算机传输文件到本地
:
rsync不仅可以将本地计算机的文件复制到远程主机,还可以将远程计算机的文件传输到本地主机。只需在命令行中将远程主机和远程源路径作为第一个参数即可。例如,要将远程主机上的dir_orig目录传输到本地主机的dir_dest目录,可以执行以下命令:
$ rsync -a host:dir_orig dir_dest
如前文所述,如果完全省略
host:
,可以使用
rsync
在本地计算机上复制目录。
-
rsync 相关的其他主题
:当需要复制多个文件时,
rsync应该是首先想到的工具之一。以批量模式运行rsync特别有用,并且有多种选项可用于使用与命令选项、日志记录和传输状态相关的辅助文件。特别是状态文件可以使长时间的传输更快,并且在传输中断时更容易恢复。
rsync还可用于创建备份。例如,可以将互联网存储区域(如亚马逊的 S3)与 Linux 系统关联,然后使用rsync --delete定期将文件系统与网络存储区域同步,从而创建一个高效的备份系统。
除了本文介绍的命令行选项外,rsync还有很多其他选项。要获取概述,可以执行rsync --help。更详细的信息可以在rsync(1)手册页以及rsync的主页http://rsync.samba.org/上找到。
4. 文件共享简介
你的 Linux 计算机可能不是网络中唯一的设备,当网络中有多台计算机时,通常有必要在它们之间共享文件。在后续内容中,主要关注 Windows 和 Mac OS X 计算机之间的文件共享,因为这是常见的跨平台文件共享场景。
文件共享可以让不同计算机方便地访问和使用彼此的文件资源。通过共享文件,可以提高工作效率,方便团队协作。例如,在一个项目中,团队成员可以将相关文件共享在一个网络位置,大家都可以随时访问和更新这些文件。
在实现文件共享时,需要考虑安全性和权限管理。不同的用户可能需要不同的访问权限,如只读、读写等。同时,还需要确保共享文件的完整性和可用性,避免数据丢失或损坏。
以下是常见的文件共享方式对比表格:
| 共享方式 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| 基于网络协议(如 SMB、NFS) | 支持多平台,可设置详细权限 | 需要配置服务器,安全性要求高 | 企业内部网络,多用户共享 |
| 使用云存储 | 方便远程访问,自动备份 | 依赖网络,可能有存储限制和费用 | 个人或团队需要远程协作 |
| 直接连接共享(如 USB 共享) | 简单快速,无需网络 | 共享范围有限 | 临时文件共享 |
以下是文件共享基本流程的流程图:
graph TD;
A[开始] --> B[选择共享方式];
B --> C{是否需要配置服务器};
C -- 是 --> D[配置服务器和权限];
C -- 否 --> E[设置共享文件或目录];
D --> E;
E --> F{是否需要加密};
F -- 是 --> G[设置加密];
F -- 否 --> H[允许其他计算机访问];
G --> H;
H --> I[结束];
通过合理选择文件共享方式和配置相关参数,可以满足不同场景下的文件共享需求,提高工作和生活的便利性。
总之,在网络环境中进行文件操作和传输时,无论是快速复制文件、使用
rsync
工具进行目录同步,还是实现文件共享,都有多种方法和工具可供选择。根据具体的需求和场景,选择合适的方式和工具,并正确配置相关参数,能够确保文件的安全、高效传输和共享,为工作和生活带来极大的便利。
超级会员免费看
6504

被折叠的 条评论
为什么被折叠?



