最佳搭档相得益彰,搭档中的每一方都为整体贡献独特且不可替代的部分。但有些搭档非常奇怪。今年的最佳搭档就是这种情况:tar 和 ssh 命令。
等等,什么?!
是的,没错,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 盘等。可以使用如下命令在本地主机上创建 home 目录的备份。
tar -cvf /tmp/home.tar /home
此命令在 /tmp 目录中创建了一个名为 home.tar 的 tar 文件(也称为 tarball)。该文件是 home 目录中所有内容的备份。嗯,这不错,但也不是很有趣,因为这很常见。
但有趣的是,尽管很多人没有意识到,如果未使用 -f 选项指定目标输出文件,则 tar 命令的输出将直接发送到 STDOUT。
tar -cv /home
这意味着 tar 命令的完整输出(即正在备份的文件)被发送到终端,这开辟了一些有趣的可能性,例如将 STDOUT 数据流重定向到备份文件。这看起来像以下命令。
tar -cv /home > /tmp/home.tar
此命令执行的功能与本节中的第一个 tar 命令相同,但方式略有不同且更有趣。
奇怪的搭档
我们可以使用类似于以下命令的命令将远程主机的 home 目录备份到该远程主机的 /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 欢呼吧。
12 条评论