如何在没有临时文件的情况下通过 ssh 发送 .tar 档案?tar 中的“-f -”选项是什么?

如何在没有临时文件的情况下通过 ssh 发送 .tar 档案?tar 中的“-f -”选项是什么?

如何使用 tar 命令通过 ssh 对档案进行压缩和解压缩,而不创建临时文件:

我有一个例子:

脚本客户端

#!/bin/bash
tar -cf - myFile.txt | ssh $IP_SERVER ./ScriptServer.sh 

脚本服务器

#!/bin/bash
tar -x -C ~/backups/ -f -

这些代码片段不是我的,而且我不明白-f -tar 命令是如何工作的,手册页也没用。

答案1

使用-f archive.tartar -c将写入档案,tar -x将从中提取。-f -是一种特殊语法,表示“写入标准输出”(如果创建)或“从标准输入读取”(如果提取)。

这允许在管道中使用tar。客户端命令通过管道传输tarssh。在远程端,SSH 服务器运行./ScriptServer.sh并将传入流推送到其标准输入。tar -f -脚本内部读取此流。

您说得对,这-f -在 in 中没有记录man 1 tar(至少在我读过的手册中没有记录)。如果没有-f该工具,无论如何都应该使用 stdout 或 stdin。很少有其他工具支持使用特殊的“文件名”来明确指向 stdout 或 stdin;我想对in-的支持只是对这个半标准的遵守。-f -tar

答案2

我不明白-f -tar 命令如何工作,手册页毫无用处。

您正在查看哪个man页面?通过系统命令行查看的页面man tar还是其他方式查看的页面?查看此在线手册页tar—同样如此就像这个—显示以下内容:

-f, --file=ARCHIVE
use archive file or device ARCHIVE

因此,-f将从特定文件读取输入……但是, 后面的 是什么--f它肯定不是一个文件。它基本上是一个特殊字符,告诉命令(在本例中)从stdin(标准输入)获取数据……而这stdin来自第一个脚本通过管道将输出传输到目标上的接收脚本(|通过 SSH 管道传输到目标上的接收脚本)。

答案3

以下是在接收方无需创建脚本的示例。要通过未压缩的流将文件从本地传输到远程 unix:

LocalDir="./"
LocalFile="myFile.txt"
RemoteIP="192.168.1.1"
RemoteDir="~/backups/"

cd "$LocalDir"
tar -cf - "$LocalFile" | ssh $RemoteIP "cd '$RemoteDir'; tar -xf -"

POSIX Tar 不压缩文件,只连接文件。您也可以通过以下方式添加轻度压缩

tar -cf - "$LocalFile" | gzip -1 | \
   ssh $RemoteIP "cd '$RemoteDir'; gzip -cd | tar -xf -"

由于传输时间较长,我不建议您添加深度压缩。

如果你想要一行代码,这里是:

tar -cf - myFile.txt | gzip -1 | ssh 192.168.1.1 "cd backups; gzip -cd | tar -xf -"

已测试将文件从 RHEL6 传输到 Solaris11 以及从 Solaris 传输到 RHEL。

答案4

第一个命令“tar -cf -”将把 tar 创建到标准输出(stdout)而不是常规文件。

这将通过 ssh 作为 stdin 发送,并由服务器脚本使用。

也可以看看 :https://www.cyberciti.biz/faq/howto-use-tar-command-through-network-over-ssh-session/https://www.linuxjournal.com/content/working-stdin-and-stdout

相关内容