如何通过网络 SSH 会话使用 tar 命令
tar 归档实用程序的 GNU 版本(以及其他旧版本的 tar)可通过网络通过 ssh 会话使用。由于连接不安全,请勿使用 telnet/nc 命令。您可以使用 Unix/Linux 管道来创建档案。让我们看一些示例,了解如何通过 ssh 安全地使用 tar 命令在 Linux、BSD/macOS 或类 Unix 系统上创建档案。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 是的 |
要求 | Linux 或 Unix 终端 |
类别 | 备份管理 |
先决条件 | tar 和 ssh 命令 |
操作系统兼容性 | BSD • Linux • macOS • Unix |
预计阅读时间 | 8 分钟 |
通过 ssh 使用 tar 命令的语法
通过 ssh 进入 box 并运行 tar 命令的语法如下(不要忘记>操作符):
上述命令使用 SSH以名为 user 的用户(例如user@box )连接到名为box 的远程主机,在该服务器上创建“ /dir1/ ”目录的压缩 tar 存档,并将其保存为名为/destination/file.tar.gz的本地压缩存档:
$ ssh user@box tar czf - /dir1/ > /destination/file.tar.gz
- ssh:使用 ssh 连接到远程主机。
- user@box:这是远程主机的用户名和主机名。
- tar:使用 tar 命令创建或提取档案。
- czf:以 .tar.gz 格式创建压缩档案。
- -:连字符(“ -“)表示标准输出 (stdout)。通常,您会将存档名称传递给选项-f。但是,在这种情况下,您声明存档应写入标准输出,而不是文件。
- /dir1/:将使用该服务器上的 tar 命令存档的目录的名称(user@box)
- /destination/file.tar.gz:这是将在本地主机上创建的文件。
这是另一种语法
在下面的例子中,我将使用 ssh 命令连接到远程主机 user@box,并在远程主机上执行以下命令,在本地计算机上创建一个名为file.tar.gz的新文件
: 以下是 GNU/tar 的简化语法:
上述命令将在名为 www-1 的远程服务器的 /etc/nginx/ 目录中创建文件 nginx.conf 的压缩档案,并将其保存到本地主机或桌面上的文件 archive.tar.gz 中。下面为您分解 shell 功夫:
$ ssh user@box 'cd /dir1/ && tar -cf - file | gzip -9' >file.tar.gz
$ ssh ubuntu@www-1 'tar -I "gzip -9" -C /etc/nginx/ -cf - nginx.conf' >archive.tar.gz
- ssh ubuntu@www-1:此命令使用 SSH 以用户 ubuntu 身份连接到远程主机 www-1。
- 'tar -I "gzip -9" -C /etc/nginx/ -cf - nginx.conf' :这是在名为ubuntu@www-1 的远程主机上执行的命令。tar 命令选项如下:
- 该-I选项传递给 tar 以压缩输出。在本例中,命令为“gzip -9”。
- 该-C选项被传递给 tar,以便在创建档案之前更改到目录 /etc/nginx/。
- 这些-cf -选项告诉 tar 创建档案并将其写入标准输出 (stdout)。
- > archive.tar.gz:shell kung-fu 的最后一部分将命令的输出重定向到当前目录中本地主机上的文件“ archive.tar.gz ”。
示例
以下命令通过 ssh 会话将 /wwwdata 目录备份到 dumpserver.example.in (IP 192.168.1.201) 主机:
或
示例输出:
# tar zcvf - /wwwdata | ssh user@dumpserver.example.in "cat > /backup/wwwdata.tar.gz"
# tar zcvf - /wwwdata | ssh vivek@192.168.1.201 "cat > /backup/wwwdata.tar.gz"
tar: Removing leading `/' from member names /wwwdata/ /wwwdata/n/example.in/ /wwwdata/c/example.com/ .... .. ... Password:
使用ls命令查看文件:
$ ls -l file.tar.gz
使用 tar 和 ssh 创建加密档案
在此示例中,使用 gpg 命令存档 /data2/。以下 shell kung-fu 压缩 /data2/ 目录,使用 gpg 对其进行加密,然后使用 SSH 将加密存档传输到远程服务器 nas03。远程服务器使用基于当前日期动态生成的文件名保存加密存档文件:
这是一个由多个 Linux 命令组成的管道。因此,让我一步一步地为您分解:
$ tar zcf - /data2/ | gpg -e | ssh vivek@nas03 'cat - > data2-dd-mm-yyyy.tar.gz.gpg'
- tar zcf - /data2/ :运行 tar 命令,使用以下 tar 选项创建/data2/目录的压缩存档:
- -z:使用 gzip 命令压缩档案。
- -c:创建一个新的档案。
- -f - :使用标准输出(stdout)作为存档文件,由名为-的文件表示。换句话说,该命令创建/data2/目录的 gzip 压缩存档,并将该压缩数据输出到标准输出(stdout),并使用 shell 管道将数据传递给 gpg。
- | gpg -e:(|管道符号)将前一个 tar 命令的输出连接到下一个命名命令的输入。gpg 命令用于加密和解密。- e传递给 gpg 以加密输入数据。因此,tar 生成的压缩存档作为输入通过管道传输到 gpg 以进行加密。
- | ssh vivek@nas03 'cat -> data2-dd-mm-yyyy.tar.gz.gpg':这是命令的最后一部分,使用 ssh 连接到名为nas03 的远程服务器,用户名为vivek 。它对nas03执行远程命令,使用单引号保护 shell 转义。远程cat 命令(cat -> data2-dd-mm-yyyy.tar.gz.gpg)获取从前一个命令(gpg)收到的输入,并将其重定向到远程服务器上名为data2-dd-mm-yyyy.tar.gz.gpg的文件。您需要将文件名中的占位符dd、mm和yyyy替换为实际日期(格式为日-月-年或根据您的语言环境)。结果,来自gpg的加密数据通过 SSH 传输到远程服务器,并以指定的文件名保存为加密存档文件。
请注意,当使用 sudo 或任何其他需要伪终端分配的命令时,您可能会收到如下所示的 ssh 命令错误:
为了避免此问题,请将-t选项传递给 ssh 命令,如下所示:
# tar zcvf - /wwwdata | ssh -t vivek@192.168.1.201 "sudo cat > /backup/wwwdata.tar.gz"
在 ssh 会话中使用 tar 命令
从远程机器(server1.example.com)复制到本地系统如下:
$ cd /path/local/dir/
$ ssh vivek@server1.example.com 'tar zcf - /some/dir' | tar zxf -
使用 tar 和 ssh 进行 Linux 系统硬盘备份/镜像
让我们将名为 /dev/sdvf 的整个硬盘驱动器从本地计算机复制到远程 AWS EC2 云备份服务器:
# dd if=/dev/sdvf | ssh backupimg@vpc-aws-mumbai-backup-001 'dd of=prod-disk-hostname-sdvf-dd-mm-yyyy.img'
要从服务器上的映像恢复本地驱动器,请反向执行该命令。例如,我们可以从存储在远程 AWS EC2 云备份服务器上的映像恢复本地硬盘驱动器,如下所示:
# ssh backupimg@vpc-aws-mumbai-backup-001 'dd if=prod-disk-hostname-sdvf-dd-mm-yyyy.img' | dd of=/dev/sdvf
将数据移动到新的 Linux 系统
scp 和其他命令复制目录结构的问题在于,符号链接、特殊设备、套接字、命名管道和其他内容不会被复制。因此,我们使用 tar 而不是 ssh。例如,从 nuc-box 复制所有数据。在 x230 笔记本电脑上打开终端并运行 ssh 命令和 tar 命令:
$ ssh vivek@nuc-box 'tar czf - /home/vivek' | tar xvzf - -C /home/vivek
通过网络 SSH 会话对磁带设备使用 tar 命令
Linux 下默认的第一个 SCSI 磁带驱动器是 /dev/st0。您可以在此处阅读有关 Linux下使用的磁带驱动器命名约定的更多信息。您也可以使用 dd 命令以便更清楚:
# tar cvzf - /wwwdata | ssh root@192.168.1.201 "dd of=/backup/wwwdata.tar.gz"
也可以将备份转储到远程磁带设备:
可以使用mt 命令倒带,然后使用cat 命令转储它:
换句话说,上述命令使用 ssh 命令连接到名为 root@192.168.1.201 的远程主机,创建 /wwwdata 目录的压缩存档(.tar.gz)。然后,它使用 shell 命令替换在远程主机上执行以下命令:
mt 命令倒带磁带设备 /dev/nst0,然后将压缩存档的内容写入名为 /dev/nst0 的磁带设备。
# tar cvzf - /wwwdata | ssh root@192.168.1.201 "cat > /dev/nst0"
# tar cvzf - /wwwdata | ssh root@192.168.1.201 $(mt -f /dev/nst0 rewind; cat > /dev/nst0)$
$(mt -f /dev/nst0 rewind; cat > /dev/nst0)$
如何通过ssh提取 tar
语法非常简单:
在此示例中,通过 ssh 会话将 tar 备份从远程机器恢复到本地目录:
如果您希望在cron 作业或脚本中使用上述命令,则请考虑使用SSH 密钥来摆脱密码。
$ cat my-data.tar.gz | ssh user@server1.example.com "tar zxvf -"
$ cat my-data.tar.gz | ssh user@server1.example.com "cd /path/to/dest/; tar zxvf -"
# cd /
# ssh root@192.168.1.201 "cat /backup/wwwdata.tar.gz" | tar zxvf -
如何通过 SSH 使用进度条进行 tar
默认情况下,您的系统上可能未安装pv命令。因此,请使用Alpine Linux 上的apk 命令、 RHEL 等上的dnf 命令/ yum 命令、Debian、Ubuntu 等上的apt 命令/ apt-get 命令、SUSE/OpenSUSE 上的 zypper 命令、Arch Linux 上的 pacman 命令来安装pv。
$ cd /dir/to/backup/
$ tar zcf - . | pv | ssh vivek@server1.example.com "cat > /backups/box42/backup-dd-mm-yyyy.tgz"
$ cd /tmp/data/
$ tar zcf - . | \
pv | \
ssh vivek@centos7 "cat > /tmp/data.tgz"
有关 tar 通过 ssh 的更多示例:
$ tar cvjf - * | ssh vivek@example "(cd /dest/; tar xjf -)"
$ tar cvzf - mydir/ | ssh vivek@backupbox "cat > /backups/myfile.tgz"
$ tar cvzf - /var/www/html | ssh vivek@server1.example.com "dd of=/backups/www.tar.gz"
$ ssh vivek@box2 "cat /backups/www.tar.gz" | tar xvzf -
$ tar cvjf - * | ssh root@home.nas02 "(cd /dest/; tar xjf - )"
请务必阅读 tar 命令/ssh 命令/bash 命令手册页,以获取使用 help 命令或 man 命令的更多信息:
$ man tar
$ man bash
$ man ssh
关于 SSHFS(FUSE 文件系统)的说明
您可以使用sshfs 挂载远程目录并运行 tar 命令:
其中,
# mkdir /data/
# sshfs vivek@server1.example.com:/ /data/
# tar -zcvf /data/file.tar.gz /home/vivek/
- mkdir /data/ :使用mkdir命令创建一个名为“/data/”的新目录。
- sshfs vivek@server1.example.com:/ /data/:使用 sshfs 命令(SSH 文件系统)将服务器“server1.example.com”的远程目录挂载到本地“/data/”目录。
- tar -zcvf /data/file.tar.gz /home/vivek/:使用 tar 命令创建“/home/vivek/”目录的压缩档案,并将其作为“file.tar.gz”保存在“/data/”目录中。
结论
您学习了如何通过 ssh 会话使用 tar 命令安全地传输档案、文件和图像。在某些情况下,在 ssh 上执行 tar 时,您可以避免两端都关闭压缩,以加快文件传输速度。例如:有关更多信息,
请参阅 GNU/tar主页和此处的文档
$ tar cvf - /wwwdata | ssh user@dumpserver.example.in "cat > /backup/wwwdata.tar"
$ ssh vivek@server1 'tar c .' | tar xvf - -C /home/vivek/