如何使用 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.tar
,tar -c
将写入档案,tar -x
将从中提取。-f -
是一种特殊语法,表示“写入标准输出”(如果创建)或“从标准输入读取”(如果提取)。
这允许在管道中使用tar
。客户端命令通过管道传输tar
到ssh
。在远程端,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