管理压缩的TAR归档文件
目标
完成本节内容后,您应该能够使用 tar 将文件和目录归档到压缩文件中,并提取现有的 tar 压缩文件的内容。
tar命令
在创建备份和通过网络传输数据时,归档和压缩文件很有用。 tar命令是用于创建和使用备份档案的最古老,最常见的命令之一。
使用 tar,用户可以将大量的文件集合到一个文件(存档)中。tar存档是一个结构化的文件数据序列,其中包含了每个文件的元数据和索引,这样可以提取单个文件。压缩包可以使用gzip、bzip2或xz压缩。
tar命令可以列出存档的内容或将其文件提取到当前系统中。
选定的tar选项
tar命令选项分为操作(您要执行的操作):常规选项和压缩选项。 下表显示了常用选项的简写和完整名称及其说明:
tar操作概述
选项 | 描述 |
---|---|
-c, --create | 创建新存档。 |
-x, --extract | 从现有档案中提取。 |
-t, --list | 列出存档的目录。 |
选定的tar常用选项
选项 | 描述 |
---|---|
-v, --verbose | 详细。 显示要归档或提取的文件. |
-f, --file= | 文件名。此选项后必须加上要使用或创建的存档的文件名。 |
-p, --preserve-permissions | 在提取存档时,保留文件和目录的权限,不减去umask。 |
tar压缩选项概述
选项 | 描述 |
---|---|
-z, --gzip | 使用gzip压缩(.tar.gz)。 |
-j, --bzip2 | 使用bzip2压缩(.tar.bz2)。bzip2通常比gzip有更好的压缩率。 |
-J, --xz | 使用 xz 压缩(.tar.xz)。xz压缩通常比bzip2有更好的压缩率。 |
tar命令的列出选项
tar命令需要以下三个选项之一:
- 使用-c或--create选项创建存档。
- 使用-t或--list选项列出存档的内容。
- 使用-x或--extract选项提取存档文件。
其他常用选项包括:
- 使用 -f 或 --file= 选项,指定操作的文件名。
- 使用-v或--verbose选项显示详细信息; 查看哪些文件添加到存档或从存档中提取。
存档文件和目录
创建新存档时,首先使用的选项是c选项,然后是f选项,然后是单个空格,然后是要创建的存档的文件名,最后是应该添加到存档中的文件和目录列表。除非另有指定,否则存档将在当前目录中创建。
下面的命令将在用户的主目录中创建一个名为 archive.tar 的存档,其中包含 file1、file2 和 file3 的内容。
[user@host ~]$ tar -cf archive.tar file1 file2 file3
[user@host ~]$ ls archive.tar
archive.tar
上述的tar命令也可以使用长版本选项来执行。
[user@host ~]$ tar --file=archive.tar --create file1 file2 file3
为了使tar能够归档选定的文件,必须执行tar命令的用户才能读取文件。 例如,创建/etc文件夹及其所有内容的新档案需要root特权,因为只有root用户被允许读取/etc目录中存在的所有文件。 无特权的用户可以创建/etc目录的存档,但是该存档会忽略不包含对该用户的读取权限的文件,并且会忽略不包含对该用户的读取和执行权限的目录。
要创建名为/root/etc.tar的tar压缩包,以用户根目录/etc为内容。
[root@host ~]# tar -cf /root/etc.tar /etc
tar: Removing leading `/' from member names
[root@host ~]#
列出存档的内容
t选项指示tar列出归档文件的内容(目录,因此是t)。将f选项与要查询的存档的名称一起使用。例如:
[root@host ~]# tar -tf /root/etc.tar
etc/
etc/fstab
etc/crypttab
etc/mtab
...output omitted...
从存档中提取文件
tar存档文件通常应该提取到一个空目录中,以确保它不会覆盖任何现有文件。当root提取存档文件时,tar命令将保留文件的原始用户和组所有权。如果普通用户使用tar提取文件,则文件所有权属于从存档中提取文件的用户。
要将文件从/root/etc.tar存档还原到/root/etcbackup目录,请运行:
[root@host ~]# mkdir /root/etcbackup
[root@host ~]# cd /root/etcbackup
[root@host etcbackup]# tar -tf /root/etc.tar
etc/
etc/fstab
etc/crypttab
etc/mtab
...output omitted...
[root@host etcbackup]# tar -xf /root/etc.tar
默认情况下,从存档提取文件时,从存档内容的权限中减去umask。要保留存档文件的权限,请在提取存档文件时使用p选项。
在本例中,将在/root/scripts目录中提取名为/root/myscripts.tar的存档文件,同时保留所提取文件的权限:
[root@host ~]# mkdir /root/scripts
[root@host ~]# cd /root/scripts
[root@host scripts]# tar -xpf /root/myscripts.tar
创建压缩存档
tar命令支持三种压缩方式。tar命令支持三种不同的压缩方法。gzip压缩是最快也是最古老的压缩方式,在各发行版甚至是跨平台的压缩方式中,bzip2压缩相比于gzip会创建更小的归档文件,但压缩的范围没有gzip那么广,而xz压缩方式相对较新,但通常提供了现有方法中最好的压缩比。
最好使用一个顶级目录,其中可以包含其他目录和文件,以有组织的方式简化文件的提取。
使用以下选项之一创建压缩tar存档:
-z或 --gzip用于gzip压缩(filename.tar.gz或filename.tgz)。
-j 或 --bzip2用于bzip2压缩 (filename.tar.bz2)
-J 或 -xz 用于 xz 压缩 (filename.tar.xz)
创建一个名为/root/etcbackup.tar.gz的gzip压缩存档,内容来自于主机上的/etc目录。
[root@host ~]# tar -czf /root/etcbackup.tar.gz /etc
tar: Removing leading `/' from member names
要创建一个名为/root/logbackup.tar.bz2的bzip2压缩存档,内容来自主机上的/var/log目录。
[root@host ~]$ tar -cjf /root/logbackup.tar.bz2 /var/log
tar: Removing leading `/' from member names
创建一个名为/root/sshconfig.tar.xz的压缩存档,内容来自主机上的/etc/ssh目录。
[root@host ~]$ tar -cJf /root/sshconfig.tar.xz /etc/ssh
tar: Removing leading `/' from member names
创建存档后,使用 tf 选项验证存档的内容。在列出压缩存档文件的内容时,并不是必须使用压缩代理选项。例如,要列出使用 gzip 压缩的 /root/etcbackup.tar.gz 文件中存档的内容,请使用以下命令。
[root@host ~]# tar -tf /root/etcbackup.tar.gz /etc
etc/
etc/fstab
etc/crypttab
etc/mtab
...output omitted...
提取压缩存档
提取压缩的tar归档文件的第一步是确定应将归档文件提取到何处,然后创建并更改到目标目录。 tar命令确定使用了哪种压缩,通常不必使用创建归档文件时使用的相同压缩选项。 将解压缩方法添加到tar命令是,如果选择这样做,则必须使用正确的解压缩类型选项; 否则,tar会产生关于在选项中指定的解压缩类型的错误,该错误与文件的解压缩类型不匹配。
要提取/tmp/etcbackup目录下的名为/root/etcbackup.tar.gz的gzip压缩压缩存档的内容。
[root@host ~]# mkdir /tmp/etcbackup
[root@host ~]# cd /tmp/etcbackup
[root@host etcbackup]# tar -tf /root/etcbackup.tar.gz
etc/
etc/fstab
etc/crypttab
etc/mtab
...output omitted...
[root@host etcbackup]# tar -xzf /root/etcbackup.tar.gz
要解压/tmp/logbackup目录下名为/root/logbackup.tar.bz2的bzip2压缩压缩存档的内容,请在/tmp/logbackup目录下解压。
[root@host ~]# mkdir /tmp/logbackup
[root@host ~]# cd /tmp/logbackup
[root@host logbackup]# tar -tf /root/logbackup.tar.bz2
var/log/
var/log/lastlog
var/log/README
var/log/private/
var/log/wtmp
var/log/btmp
...output omitted...
[root@host logbackup]# tar -xjf /root/logbackup.tar.bz2
要提取/tmp/sshbackup目录中名为/root/sshbackup.tar.xz的xz压缩存档文件的内容,请执行以下操作:
[root@host ~]$ mkdir /tmp/sshbackup
[root@host ~]# cd /tmp/sshbackup
[root@host logbackup]# tar -tf /root/sshbackup.tar.xz
etc/ssh/
etc/ssh/moduli
etc/ssh/ssh_config
etc/ssh/ssh_config.d/
etc/ssh/ssh_config.d/05-redhat.conf
etc/ssh/sshd_config
...output omitted...
[root@host sshbackup]# tar -xJf /root/sshbackup.tar.xz
列出压缩的tar归档文件的工作方式与列出未压缩的tar归档文件的工作方式相同。
此外,gzip、bzip2和xz可以单独用于压缩单个文件。例如,gzip etc.tar命令生成etc.tar.gz压缩文件,bzip2 abc.tar命令生成abc.tar.bz2压缩文件,xz myarchive.tar命令生成myarchive.tar.xz压缩文件。
要解压缩的相应命令是gunzip、bunzip2和unxz。
例如,gunzip /tmp/etc.tar.gz命令生成etc.tar未压缩的tar文件,而bunzip2 abc.tar.bz2命令生成abc.tar未压缩的tar文件,unxz myarchive.tar.xz命令生成myarchive.tar未压缩的tar文件。
在系统之间安全地传输文件
目标
完成本节后,您能够使用SSH安全地与远程系统之间传输文件。
安全拷贝传输文件
OpenSSH对于在远程系统上安全地运行shell命令非常有用。安全复制命令scp,是OpenSSH套件的一部分,它可以将文件从远程系统复制到本地系统或从本地系统复制到远程系统。该命令使用SSH服务器进行认证,并在传输时对数据进行加密。
可以为要复制的文件的源或目标指定远程位置。远程位置的格式应为[user@]host:/path。参数的user@部分是可选的,如果不指定,将使用您当前的本地用户名。当您运行该命令时,您的scp客户机将像ssh一样,使用基于密钥的身份验证或提示您输入密码,对远程SSH服务器进行身份验证。
下面的例子演示了如何将host上的本地/etc/yum.conf和/etc/hosts文件复制到远程用户的主目录下的远程host远程系统。
[user@host ~]$ scp /etc/yum.conf /etc/hosts remoteuser@remotehost:/home/remoteuser remoteuser@remotehost's password: password
yum.conf 100% 813 0.8KB/s 00:00
hosts 100% 227 0.2KB/s 00:00
你也可以从另一个方向复制一个文件,从远程系统复制到本地文件系统。在这个例子中,远程主机上的/etc/hostname文件被复制到本地目录/home/user。scp 命令以用户 remoteuser 的身份认证到 remotehost。
[user@host ~]$ scp remoteuser@remotehost:/etc/hostname /home/user
remoteuser@remotehost's password: password
hostname 100% 22 0.0KB/s 00:00
要递归复制整个目录,请使用 -r 选项。在下面的例子中,远程主机上的远程目录/var/log被递归复制到本地目录/tmp/。你必须以root身份连接到远程系统,以确保你能读取远程/var/log目录中的所有文件。
[user@host ~]$ scp -r root@remoteuser:/var/log /tmp
root@remotehost's password: password
...output omitted...
使用安全文件传输程序传输文件
要交互式地从SSH服务器上传或下载文件,请使用安全文件传输程序sftp。使用 sftp 命令的会话使用安全认证机制和加密数据传输到 SSH 服务器。
就像scp命令一样,sftp命令使用[user@]host来标识目标系统和用户名。如果您没有指定用户,该命令将尝试使用您的本地用户名作为远程用户名登录。然后你会看到一个sftp>提示符。
[user@host ~]$ sftp remoteuser@remotehost
remoteuser@remotehost's password: password
Connected to remotehost.
sftp>
交互式sftp会话接受各种命令,这些命令在远程文件系统上的工作方式与本地文件系统中的命令相同,例如ls,cd,mkdir,rmdir和pwd。 put命令将文件上传到远程系统。 get命令从远程系统下载文件。 exit命令退出sftp会话。
要将本地系统上的/ etc / hosts文件上载到remotehost上新创建的目录/ home / remoteuser / hostbackup中。 sftp会话始终假定put命令后跟本地文件系统上的文件,并从连接用户的主目录开始/ home / remoteuser:
sftp> mkdir hostbackup
sftp> cd hostbackup
sftp> put /etc/hosts
Uploading /etc/hosts to /home/remoteuser/hostbackup/hosts
/etc/hosts 100% 227 0.2KB/s 00:00
sftp>
要从远程主机上下载/etc/yum.conf到本地系统上的当前目录,请执行get /etc/yum.conf命令,然后用exit命令退出sftp会话。
sftp> get /etc/yum.conf
Fetching /etc/yum.conf to yum.conf
/etc/yum.conf 100% 813 0.8KB/s 00:00 sftp> exit
[user@host ~]$
安全地实现系统间的文件同步
目标
完成本节内容后,您能够高效、安全地将本地文件或目录的内容与远程服务器上的副本同步。
用rsync同步文件和目录
rsync命令是另一种安全地将文件从一个系统复制到另一个系统的方法。该工具使用一种算法,通过只同步文件中发生变化的部分,将复制的数据量降到最低。它与 scp 不同的是,如果两个服务器之间的文件或目录相似,rsync 会复制两个服务器上的文件系统之间的差异,而 scp 则需要复制所有的文件。
rsync的优点之一就是可以在本地系统和远程系统之间安全高效地复制文件。虽然初始同步一个目录所需的时间和复制一个目录所需的时间差不多,但任何后续的同步只需要通过网络复制差异,可能大大加快了更新速度。
rsync 最重要的选项之一是 -n 选项,用于执行测试传输。测试传输是模拟命令被执行时的情况。测试传输显示了在不使用干运行选项的情况下rsync在执行命令时的变化。在执行 rsync 操作之前,你应该先执行一个测试传输,以确保没有重要文件被覆盖或删除。
使用 rsync 同步文件和目录时,最常见的两个选项是 -v 和 -a 选项。
当同步运行时, -v 或 --verbose 选项可以提供更详细的输出。这对于故障排除和帮助查看进度非常有用。
-a或--archive选项启用“归档模式”。这是启用递归复制并启用大量有用选项以保留文件大多数特性的快速方法。存档模式与指定以下选项相同:
使用rsync -a(归档模式)启用的选项
选项 | 描述 |
---|---|
-r, --recursive | 递归同步整个目录树 |
-l, --links | 同步符号链路 |
-p, --perms | 保留权限 |
-t, --times | 保存时间戳 |
-g, --group | 保留组属性 |
-o, --owner | 保留文件的所有者 |
-D, --devices | 同步设备文件 |
存档模式不保留硬链接,因为这会给同步增加大量时间。如果您还想保留硬链接,请添加-H选项。
如果使用高级权限,则可能需要添加两个附加选项:
- -A保留ACL
- -X保留SELinux上下文
你可以使用 rsync 来同步本地文件或目录的内容与远程机器上的文件或目录的内容,并将其中任何一台机器作为源。您也可以同步两个本地文件或目录的内容。
例如,将/var/log目录的内容同步到/tmp目录。
[user@host ~]$ su -
Password: password
[root@host ~]# rsync -av /var/log
/tmp receiving incremental file list log/ log/README
log/boot.log
...output omitted...
log/tuned/tuned.log
sent 11,592,423 bytes received 779 bytes 23,186,404.00 bytes/sec total size is 11,586,755 speedup is 1.00
[user@host ~]$ ls /tmp
log ssh-RLjDdarkKiW1
[user@host ~]$
源目录末尾的斜杠用于同步目录的内容,而无需在目标目录中新建子目录。在本例中,log目录不是在/tmp目录中创建的。只有/var/log/目录的内容被同步到/tmp目录中。
[root@host ~]# rsync -av /var/log/ /tmp
sending incremental file list
./
README
boot.log
...output omitted...
tuned/tuned.log
sent 11,592,389 bytes received 778 bytes 23,186,334.00 bytes/sec total size is 11,586,755 speedup is 1.00
[root@host ~]# ls /tmp
anaconda dnf.rpm.log-20190318 private
audit dnf.rpm.log-20190324 qemu-ga
boot.log dnf.rpm.log-20190331 README
...output omitted...
和 scp 和 sftp 命令一样,对于 rsync,你可以使用 [user@]host:/path 格式指定远程位置。远程位置可以是源系统或目标系统,但这两个机器中的一个必须是本地的。
为了保留文件的所有权,你需要在目标系统中使用root身份。如果目的地是远程系统,请以root身份认证。如果目的地是本地系统,你必须以root身份运行rsync。
在这个例子中,将本地/var/log目录同步到远程主机系统上的/tmp目录。
[root@host ~]# rsync -av /var/log remotehost:/tmp
root@remotehost's password: password
receiving incremental file list
log/
log/README
log/boot.log
...output omitted...
sent 9,783 bytes received 290,576 bytes 85,816.86 bytes/sec total size is 11,585,690 speedup is 38.57
同样的,远程主机上的/var/log远程目录可以同步到主机上的/tmp本地目录。
[root@host ~]# rsync -av remotehost:/var/log /tmp
root@remotehost's password: password
receiving incremental file list
log/boot.log
log/dnf.librepo.log
log/dnf.log
...output omitted...
sent 9,783 bytes received 290,576 bytes 85,816.86 bytes/sec total size is 11,585,690 speedup is 38.57
总结
- tar 命令从一组文件和目录中创建一个存档文件,从存档中提取文件,并列出存档的内容。
- tar命令提供了一组不同的压缩方法来减少存档大小。
- 除了提供一个安全的远程shell之外,SSH服务还提供了scp和sftp命令,作为安全的方式从运行SSH服务器的远程系统中传输文件。
- rsync 命令可以安全有效地同步两个目录之间的文件,其中一个目录可以在远程系统上。