在 Red Hat Enterprise Linux 中传输文件

Red Hat Enterprise LinuxBeginner
立即练习

介绍

在本实验中,你将获得在 RHEL 系统上高效安全地管理和传输文件的实践经验。你将学习如何创建、列出和提取来自 tar 归档文件(包括压缩归档文件)中的文件,这对于打包和备份数据至关重要。

此外,本实验将指导你使用 sftp 进行交互式文件传输和 rsync 进行稳健高效的文件同步,确保网络操作期间的数据完整性和安全性。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 94%。获得了学习者 99% 的好评率。

创建和列出 tar 存档

本步骤将介绍如何创建和列出 tar 归档文件。tar 工具是一个强大的命令行工具,用于归档文件和目录。它常用于备份和传输文件。

tar 命令需要一个操作选项来指定它应该执行的操作。常见的操作选项包括:

  • -c--create:创建新的归档文件。
  • -t--list:列出归档文件的内容。
  • -x--extract:从归档文件中提取文件。

此外,tar 通常使用通用选项来修改其行为:

  • -v--verbose:在归档或提取过程中显示正在处理的文件。
  • -f--file:指定归档文件名。此选项必须后跟归档文件名。

让我们首先创建一些我们将要归档的示例文件。导航到你的 ~/project 目录,这是你的默认工作目录。

cd ~/project

现在,创建一个名为 my_files 的新目录,并在其中创建一些示例文本文件。

mkdir my_files
echo "这是文件1的内容。" > my_files/file1.txt
echo "这是文件2的内容。" > my_files/file2.txt
echo "这是文件3的内容。" > my_files/file3.txt
ls my_files

你应该看到三个文件列出:

file1.txt  file2.txt  file3.txt

现在,让我们创建一个 my_files 目录的 tar 归档文件。我们将把归档文件命名为 my_archive.tar

tar -cvf my_archive.tar my_files

输出将显示正在添加到归档文件中的文件:

my_files/
my_files/file1.txt
my_files/file2.txt
my_files/file3.txt

你可以验证归档文件 my_archive.tar 已在当前目录中创建:

ls

你应该看到 my_archive.tarmy_files 一起列出:

my_archive.tar  my_files

接下来,让我们使用 -t (列出) 和 -f (文件) 选项列出 my_archive.tar 文件的内容。

tar -tf my_archive.tar

输出将显示归档文件的内容:

my_files/
my_files/file1.txt
my_files/file2.txt
my_files/file3.txt

如果你想查看更详细的信息,例如文件权限、所有权和大小,你可以添加 -v (详细) 选项:

tar -tvf my_archive.tar

输出将类似于此,提供有关每个归档项的更多详细信息:

drwxr-xr-x labex/labex        0 2023-10-27 10:00 my_files/
-rw-r--r-- labex/labex       22 2023-10-27 10:00 my_files/file1.txt
-rw-r--r-- labex/labex       22 2023-10-27 10:00 my_files/file2.txt
-rw-r--r-- labex/labex       22 2023-10-27 10:00 my_files/file3.txt

请注意,tar 默认情况下会从绝对路径中删除前导 /,并在归档时。这是为了防止在提取归档文件时意外覆盖系统文件。例如,如果你要归档 /etc/hosts,它将在 tar 文件中存储为 etc/hosts。这允许你将其提取到新位置,而不会影响原始的 /etc/hosts 文件。

从 tar 存档中提取文件

本步骤将介绍如何从 tar 归档文件中提取文件。提取文件是将归档内容取出并放回文件系统中的过程。

提取文件的首要选项是 -x--extract。你通常还会使用 -f 来指定归档文件,以及 -v 来显示提取文件的详细信息。

在提取之前,最好将归档文件提取到一个空目录,以避免覆盖现有文件或将它们与其他内容混合。让我们在你的 ~/project 目录中创建一个名为 extracted_files 的新目录。

cd ~/project
mkdir extracted_files

现在,导航到 extracted_files 目录。这确保了归档内容将被提取到此处。

cd extracted_files

现在,让我们将 my_archive.tar (位于父目录 ~/project 中) 的内容提取到当前的 extracted_files 目录中。

tar -xvf ../my_archive.tar

输出将显示正在提取的文件:

my_files/
my_files/file1.txt
my_files/file2.txt
my_files/file3.txt

提取后,你可以列出当前目录 (~/project/extracted_files) 的内容,以验证 my_files 目录及其内容已成功提取。

ls

你应该看到 my_files 目录:

my_files

现在,让我们检查 extracted_filesmy_files 目录的内容:

ls my_files

你应该看到原始文件:

file1.txt  file2.txt  file3.txt

你还可以查看其中一个提取文件的內容以确认其完整性:

cat my_files/file1.txt

输出应为:

This is file1 content.

在提取文件时,tar 命令使用当前的 umask 来设置提取文件的权限。但是,如果你想保留归档文件中文件的原始权限,可以使用 -p--preserve-permissions 选项。这在处理需要特定权限的可执行脚本或配置文件时特别有用。对于 root 用户,此选项通常默认启用。对于普通用户,如果权限保留很重要,最好包含它。

在本实验中,我们不会明确演示 -p 选项,因为默认行为足以满足我们的文本文件需求。但是,请记住此选项,以便在未来的用例中使用。

创建压缩的 tar 存档

本步骤将介绍如何创建压缩的 tar 归档文件。虽然 tar 本身只是打包文件,但它可以与压缩工具(如 gzipbzip2xz)集成,创建更小的归档文件。这对于节省磁盘空间和减少传输时间至关重要。

tar 命令为不同的压缩算法提供了特定的选项:

  • -z--gzip:使用 gzip 压缩,生成 .tar.gz.tgz 后缀。这是最常见且最快的压缩方法。
  • -j--bzip2:使用 bzip2 压缩,生成 .tar.bz2.tbz 后缀。它通常比 gzip 提供更好的压缩效果,但速度较慢。
  • -J--xz:使用 xz 压缩,生成 .tar.xz.txz 后缀。它在三种方法中提供最佳的压缩比,但速度最慢。
  • -a--auto-compress:允许 tar 根据归档文件的后缀自动确定压缩算法(例如,.tar.gz 暗示使用 gzip)。这是一个方便的选项。

让我们首先确保你位于 ~/project 目录。

cd ~/project

首先,我们将创建一个 gzip 压缩的 my_files 目录归档文件。我们将将其命名为 my_archive.tar.gz

tar -czvf my_archive.tar.gz my_files

输出将显示正在添加和压缩的文件:

my_files/
my_files/file1.txt
my_files/file2.txt
my_files/file3.txt

你可以验证压缩归档文件的创建:

ls -lh my_archive.tar.gz

ls-lh 选项提供人类可读的大小。你将看到类似于此的输出,显示文件大小:

-rw-r--r-- 1 labex labex 180 Oct 27 10:00 my_archive.tar.gz

(注意:实际大小可能略有不同,具体取决于系统和内容,但对于这些小型文本文件来说,它会是一个较小的尺寸。)

现在,让我们尝试创建一个 xz 压缩的归档文件,它通常提供更好的压缩效果。我们将将其命名为 my_archive.tar.xz

tar -cJvf my_archive.tar.xz my_files

同样,输出将显示正在处理的文件:

my_files/
my_files/file1.txt
my_files/file2.txt
my_files/file3.txt

检查 xz 归档文件的大小:

ls -lh my_archive.tar.xz

你可能会注意到 my_archive.tar.xzmy_archive.tar.gz 略小,这表明 xz 具有更好的压缩比。

-rw-r--r-- 1 labex labex 168 Oct 27 10:00 my_archive.tar.xz

要提取压缩的 tar 归档文件,tar 在使用 -x 选项时足够智能,通常可以自动检测压缩类型。但是,最好显式使用相应的解压缩选项 (-z-j-J) 或 -a (自动压缩) 选项。

让我们尝试将 my_archive.tar.gz 提取到名为 extracted_gz 的新目录中。

mkdir extracted_gz
tar -xzvf my_archive.tar.gz -C extracted_gz

-C 选项 (更改目录) 指示 tar 将文件提取到指定的目录。这是一个非常有用的选项,以避免弄乱你的当前目录。

验证 extracted_gz 的内容:

ls extracted_gz/my_files

你应该看到:

file1.txt  file2.txt  file3.txt

使用 sftp 安全传输文件

本实验将介绍如何使用 sftp (安全文件传输程序) 在系统之间安全地传输文件。sftp 是一款交互式文件传输程序,它使用 SSH (安全外壳) 进行安全通信,提供加密和身份验证。它属于 OpenSSH 套件的一部分。

在本实验中,我们将使用 labex 用户作为“远程”用户模拟远程系统,与同一主机上的用户交互。这允许我们在无需单独的虚拟机的情况下练习 sftp 命令。

首先,确保你位于 ~/project 目录。

cd ~/project

让我们创建一个我们将“上传”到模拟远程用户主目录的文件。

echo "This file will be uploaded via sftp." > local_file.txt

现在,启动到 localhostlabex 用户的 sftp 会话。

sftp labex@localhost

系统将提示你输入 labex@localhost 的密码。输入 labex

The authenticity of host 'localhost (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:....
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'localhost' (ED25519) to the list of known hosts.
labex@localhost's password: labex
Connected to localhost.
sftp>

你现在处于 sftp 交互提示符中。

sftp 提示符中,你可以使用类似于普通 shell 的各种命令。

  • pwd:显示远程系统当前工作目录。
  • lpwd:显示本地系统当前工作目录。
  • ls:列出远程系统上的文件。
  • lls:列出本地系统上的文件。

让我们尝试一下:

sftp> pwd
Remote working directory: /home/labex
sftp> lpwd
Local working directory: /home/labex/project
sftp> ls

ls 命令将显示远程 /home/labex 目录的内容,即你自己的主目录。)

现在,让我们将 local_file.txt 从你本地的 ~/project 目录上传到远程 labex 用户的主目录 (/home/labex)。使用 put 命令。

sftp> put local_file.txt
Uploading local_file.txt to /home/labex/local_file.txt
local_file.txt                               100%   32     0.0KB/s   00:00
sftp>

你可以通过列出远程目录来验证文件是否已上传:

sftp> ls

你应该会在 /home/labex 中列出的文件中看到 local_file.txt

接下来,让我们从远程系统“下载”一个文件。我们将从远程 labex 用户的主目录下载 .bashrc 文件到你的本地 ~/project 目录。使用 get 命令。

sftp> get .bashrc
Fetching /home/labex/.bashrc to .bashrc
/home/labex/.bashrc                          100%  193     0.2KB/s   00:00
sftp>

你可以通过列出你的本地目录来验证下载:

sftp> lls

你应该会在你的本地 ~/project 目录中看到 .bashrc

要退出 sftp 会话,请使用 exitbye 命令。

sftp> exit

你将返回到你的普通 shell 提示符。

使用 rsync 安全同步文件

本实验将介绍如何使用 rsync 命令在系统之间同步文件。rsync 是一款功能强大且多用途的工具,用于本地和远程复制和同步文件和目录。其主要优势在于它能够只传输文件之间的差异,使其在更新时非常高效。与 sftp 一样,rsync 可以使用 SSH 进行安全加密传输。

rsync 最常用的选项包括:

  • -a--archive:这是几个选项 (-rlptgoD) 的组合,保留大多数文件属性(递归、链接、权限、时间、组、所有者、设备文件)。它通常被称为“归档模式”,对于大多数同步任务强烈推荐。
  • -v--verbose:提高详细程度,显示更多关于传输的详细信息。
  • -z--compress:在传输过程中压缩文件数据,这可以加快通过慢速链接的传输速度。
  • -h--human-readable:以人类可读的格式输出数字。
  • -n--dry-run:执行试运行,不做任何更改。在实际执行命令之前,这对于验证 rsync 将执行的操作非常有用。

让我们首先确保你位于 ~/project 目录。

cd ~/project

我们将通过创建源目录和目标目录来模拟同步场景。

创建一个包含一些文件的源目录 source_dir

mkdir source_dir
echo "Content of fileA" > source_dir/fileA.txt
echo "Content of fileB" > source_dir/fileB.txt
mkdir source_dir/subdir
echo "Content of subfile1" > source_dir/subdir/subfile1.txt

创建一个空的目的地目录 dest_dir

mkdir dest_dir

现在,让我们执行一次试运行,看看 rsync 在将 source_dir 同步到 dest_dir 时会做什么。我们将使用 -avh 选项,用于归档模式、详细输出和人类可读的大小,以及 -n 用于试运行。

rsync -avhn source_dir/ dest_dir/

关于尾部斜杠的重要说明:

  • source_dir/:尾部斜杠表示“复制 source_dir 的内容”。
  • source_dir:没有尾部斜杠表示“将 source_dir 本身复制到目标”。

试运行的输出将显示 将要 传输的文件:

sending incremental file list
./
fileA.txt
fileB.txt
subdir/
subdir/subfile1.txt

sent 186 bytes  received 12 bytes  396.00 bytes/sec
total size is 66  speedup is 0.33 (DRY RUN)

注意结尾的 (DRY RUN),表示没有实际更改。

现在,让我们执行实际的同步。移除 -n 选项。

rsync -avh source_dir/ dest_dir/

输出将类似于试运行,但没有 (DRY RUN) 标签:

sending incremental file list
./
fileA.txt
fileB.txt
subdir/
subdir/subfile1.txt

sent 186 bytes  received 12 bytes  396.00 bytes/sec
total size is 66  speedup is 0.33

验证文件已复制到 dest_dir

ls -R dest_dir

你应该看到:

dest_dir:
fileA.txt  fileB.txt  subdir

dest_dir/subdir:
subfile1.txt

现在,让我们修改 source_dir 中的文件并添加新文件,看看 rsync 的效率。

echo "Updated content for fileA" > source_dir/fileA.txt
echo "New file content" > source_dir/new_file.txt

再次执行试运行,看看这次 rsync 将传输哪些内容:

rsync -avhn source_dir/ dest_dir/

输出将仅显示更改和新文件:

sending incremental file list
./
fileA.txt
new_file.txt

sent 128 bytes  received 12 bytes  280.00 bytes/sec
total size is 100  speedup is 0.71 (DRY RUN)

这演示了 rsync 仅传输差异的功能。

现在,再次执行实际的同步:

rsync -avh source_dir/ dest_dir/

再次验证 dest_dir 的内容:

ls -R dest_dir
cat dest_dir/fileA.txt
cat dest_dir/new_file.txt

你应该在 dest_dir 中看到 new_file.txt,并且 fileA.txt 应该包含 "Updated content for fileA"。

总结

在本实验中,我们通过使用必要的命令行工具,获得了在 RHEL 系统上管理和传输文件的实践经验。我们首先掌握了 tar 工具,学习了如何创建、列出和提取存档中的文件,包括创建压缩的 tar.gz 存档以实现高效的存储和传输。

随后,我们探索了安全的文件传输方法。我们利用 sftp 在系统之间进行交互式和安全的文件传输,了解了其上传和下载文件的功能。最后,我们深入研究了 rsync,这是一个用于同步文件和目录的强大工具,重点介绍了其在处理增量更新和确保不同位置的数据一致性方面的效率。