tar通过 SSH 使用文件名流式传输返回的结果
要获取您希望从.tar文件中检索的数据,您需要将结果传递tar给带有--to-command选项的命令字符串。在下面的示例中,我们将运行三个命令。
# Send the files name back to your shell
echo $TAR_FILENAME
# Send the contents of the file back
cat /dev/stdin
# Send EOF (Ctrl+d) back (note: since we're already in a $'' we don't use the $ again)
echo '\004'
在您的 shell 中捕获信息后,我们就可以开始处理数据了。这是一个三步过程。
- 获取文件名
- 请注意,在这段代码中,我们根本不处理目录(只是将它们剥离;即
dir/1.dat -> 1.dat)
- 您可以编写代码通过用空格替换正斜杠
/并迭代每个目录名称来为文件创建目录,但这似乎超出了范围。
- 检查 EOF(文件结尾)
- 将内容添加到文件
# Get the files via ssh and tar
files=$(ssh -n <user@server> $'tar -xf <tar-file> --wildcards \'*\' --to-command=$\'echo $TAR_FILENAME; cat /dev/stdin; echo \'\004\'\'')
# Keeps track of what state we're in (filename or content)
state="filename"
filename=""
# Each line is one of these:
# - file's name
# - file's data
# - EOF
while read line; do
if [[ $state == "filename" ]]; then
filename=${line/*\//}
touch $filename
echo "Copying: $filename"
state="content"
elif [[ $state == "content" ]]; then
# look for EOF (ctrl+d)
if [[ $line == $'\004' ]]; then
filename=""
state="filename"
else
# append data to file
echo $line >> <output-folder>/$filename
fi
fi
# Double quotes here are very important
done < <(echo -e "$files")
替代方案:tar+scp
如果上面的例子看起来过于复杂,那就是它正在做的事情。更多地接触磁盘并需要分离 ssh 连接的另一种方法是将您需要的文件从.tar文件中提取到一个文件夹中,然后scp将该文件夹返回到您的工作站。
ssh -n <username>@<server> 'mkdir output/; tar -C output/ -xf <tar-file> --wildcards *.dat *.def'
scp -r <username>@<server>:output/ ./
击穿
首先,我们将创建一个地方来保存我们输出的文件。如果您已经知道它们所在的文件夹,则可以跳过此步骤。
mkdir output/
然后,我们会将匹配的文件提取到我们创建的这个文件夹中(如果您不希望它们位于不同的文件夹中,请删除该-C output/选项)。
tar -C output/ -xf <tar-file> --wildcards *.dat *.def
最后,现在我们再次在我们的机器上运行命令,我们可以运行scp以重新连接到远程机器并拉回文件。
scp -r <username>@<server>:output/ ./