2015 年度最佳搭档:tar 和 ssh

目前还没有读者喜欢这篇文章。
Best couple of cats

互联网档案馆。由 Opensource.com 修改。CC BY-SA 4.0

最佳搭档相得益彰,搭档中的每一方都为整体贡献了独特且不可替代的部分。但有些搭档非常奇特。我们今年的最佳搭档就是这种情况:tarssh 命令。

等等——什么?!

是的,没错,tar 和 ssh 命令以有趣的方式协同工作,尤其是在充分考虑标准 I/O (STDIO) 的功能时,标准 I/O 也称为 标准流

ssh

ssh 命令是一种安全且复杂的终端模拟器,允许用户登录到远程计算机以访问 shell 会话并运行命令。因此,我可以登录到远程计算机并在远程计算机上运行 ls 命令。结果显示在我本地主机上的 ssh 终端模拟器窗口中。命令的标准输出 (STDOUT) 显示在我的终端窗口中,但它仍然在远程主机上,本地主机无法使用。

这很简单,每个人都这样做。但下一步更有趣。与其在远程计算机上维护终端会话并发出多个命令,我只需使用如下命令在远程计算机上运行单个命令,结果将显示在本地主机上。这假设 SSH 公钥/私钥对 (PPKP) 正在使用中,并且我每次向远程主机发出命令时都不必输入密码

ssh remotehost ls

现在我可以在本地主机上使用该命令的结果,因为标准输出数据流通过 SSH 隧道发送到本地主机。好的,这很好,但这意味着什么呢?

在回答这个问题之前,让我们先看看 tar 命令。

tar

tar 命令用于进行备份。名称 tar 代表 Tape ARchive(磁带归档),但该命令可以与任何类型的记录介质一起使用,例如磁带、硬盘驱动器、U 盘等。可以使用如下命令在本地主机上创建主目录的备份

tar -cvf /tmp/home.tar /home

此命令在 /tmp 目录中创建了一个名为 home.tar 的 tar 文件(也称为 tarball)。该文件是主目录中所有内容的备份。嗯,这很好,但也不是很有趣,因为它很常见。

但有趣的是,虽然很多人没有意识到,但如果未使用 -f 选项指定目标输出文件,则 tar 命令的输出将直接发送到 STDOUT

tar -cv /home

这意味着 tar 命令的完整输出(即正在备份的文件)将发送到终端,这带来了一些有趣的可能性,例如将 STDOUT 数据流重定向到备份文件。该命令如下所示

tar -cv /home > /tmp/home.tar

此命令执行与本节中的第一个 tar 命令相同的功能,但方式略有不同且更有趣。

奇特的搭档

我们可以使用类似于以下命令的命令,将远程主机的主目录备份到该远程主机的 /tmp 目录

ssh remotehost "tar -cvf /tmp/home.tar /home"

请注意,要在远程主机上执行的命令用引号括起来,以确保远程执行正确的命令;这对于 shell 和我们人类来说都是一种澄清。对此命令稍作更改,我们可以得到一个命令,在该命令中,我们只需将 tar 命令的输出重定向到远程主机上的 /tmp 目录

ssh remotehost "tar -cv /home > /tmp/home.tar"

此命令产生与前一个命令完全相同的结果。在这种情况下,tar 命令的 STDOUT 数据流完全保留在远程主机上,并重定向到备份文件。然而,下一个命令开启了许多新的可能性。你能看出它做了什么吗?

ssh remotehost "tar -cv /home" > /tmp/home.tar

在这种情况下,来自 tar 命令的 STDOUT 数据流通过 SSH 连接发送到本地主机。然后,此数据流被重定向到本地主机上的备份文件 /tmp/home.tar。通过简单地将尾部的引号向左移动,命令被更改,以便我们现在有一个可以将远程主机备份到本地主机的命令。

我每天都使用我们今年的最佳搭档来执行备份。我有一个脚本,它使用 ssh 和 tar,以及 SSH 公钥加密,将多个远程主机备份到本地主机上的外部 USB 硬盘驱动器。这两个命令简化了必要的任务,最好的部分是它们是免费和开源软件——免费如啤酒,也自由如言论。

因此,让我们为今年 Opensource.com 的最佳搭档:tar 和 ssh 欢呼吧。

David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。自 1996 年以来,他一直从事 Linux 和开源软件工作,自 1969 年以来一直从事计算机工作。他强烈拥护并宣传“系统管理员的 Linux 哲学”。

12 条评论

David,写得非常好!我想起了 Rob Pike 或 Brian Kernighan 等人撰写的关于“使用 Unix 命令做事”的经典书籍,这让我有点难过,因为在终端窗口中做事被认为如此神秘。像这样的文章向我们所有人表明,它一点也不神秘。谢谢!

感谢您的友好评论。我不确定您是否将我与 Pike 和 Kernighan 相提并论,但我仍然很荣幸能与他们并列。

我同意,很多人因为认为命令行界面 (CLI) 非常神秘而避开它,这确实令人难过,但实际上并非如此。它只是不同而已。

我希望我写的一些文章能够激励人们尝试命令行界面。

再次感谢!

回复 作者 clhermansen

David,我同意 Chris 的看法。我很少在终端窗口中工作,但我总是喜欢阅读您的文章。感谢您选择我们的年度最佳搭档!

我认为 Neal Stephenson 在《In the Beginning was the Command Line》中很好地表达了这一点,他说驾驶配备 GUI 的汽车会容易得多,但安全性会降低很多。

我喜欢想象驾驶员看到前面的汽车减速:好的,文件->刹车,现在出现刹车踏板的滑块... 碰撞。

顺便说一句,我们中的一些人年纪足够大,记得命令行即使不是实际不存在,也很少见。

我使用这个“搭档”多年了。这是我长期以来进行 P2V、V2V 迁移的首选方式:root@live_on_new_formated_disk# ssh remotehost "tar czpf /" tar xzpf -

这是一种非常优雅的执行迁移的方式,无需使用任何中间临时文件。我喜欢它!

感谢分享。

回复 作者 SysOp (未验证)

尝试谷歌搜索“ssh tar pipe tar”。大约有数千篇文章向您展示如何执行 ssh-tar-pipe-tar 技巧,但您_未能将其包含在您的文章中_,但我们其他人已经使用了 20 多年。

至少有人在这里的评论中提到了它。

回复 作者 dboth

David,文章写得太棒了!我经常使用 tar 和 ssh。我在 Red Hat 机器上运行 Lotus Notes,并且必须每晚备份邮件文件。我编写了一个包含 tar、ssh 和 rsync 的脚本,每晚备份邮件。Linux 在命令行上非常强大。

谢谢 David,文章很棒。我经常使用 tar 和 ssh,但从未真正想过将它们结合起来。

不客气!我很高兴我的文章为您提供了一些新的见解。

对我来说,这一切都真正回归到 Linux 哲学。每个程序只做一件事,并且做得很好。ssh 非常擅长加密通信,而 tar 非常擅长创建和管理归档数据流。将这些强大的程序结合起来使我们能够做一些每个程序的创建者可能从未想过的事情。对于我们这些使用命令行界面的人来说,还有数百个这样的程序可用。

感谢您的评论。

回复 作者 MicheleMcN

我提名这篇文章为 2015 年研究最少且最不完整的文章。

它也符合 1995 年的闪回,但即使在那时我们也知道“ssh-tar-pipe-tar”技巧(这篇文章中甚至没有)。

只需谷歌搜索“ssh tar pipe tar”,您就会找到数千篇比这篇文章更具信息量的文章。

起初我以为这将是“ssh-tar-pipe-tar”技巧,我准备推荐使用 rsync 和 ssh,以将文件复制到/从远程系统。但是 David 确实提出了一个我没有想到的用例,即从远程系统上的文件创建本地 tarball。

我还要给他加分,因为他解释了重定向在 ssh 命令中的使用。这让一些初学者感到困惑,他很好地涵盖了这一点。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.