tar & split remote files saving output locally 从输出中删除 "tar: Removing leading `/' from member names" 消息

tar & split remote files saving output locally remove "tar: Removing leading `/' from member names" message from output

这是一个由两部分组成的问题。

我制作了一个 bash 登录远程服务器的脚本,制作了一个 list.txt 并将其保存在本地。

#!/bin/bash
sshpass -p "xxxx" ssh user@pass ls /path/to/files/ | grep "^.*iso" > list.txt

然后使用 list.txt

starts 一个 for 循环
for f in $(cat list.txt); do

下一个命令拆分target文件并保存在本地

sshpass -p "xxxx" ssh user@pass tar --no-same-owner -czf - /path/to/files/$f | split -b 10M - "$f.tar.bz2.part"

问题 1

我需要帮助理解上面的命令,为什么它在本地保存 *part 文件?尽管那是我打算做的,但我想更好地理解它,我如何反过来做,tar 并拆分文件将输出保存到远程目录(翻转上面命令中发生的事情使用相同的工具 sshpass 是一项要求)

问题 2

当运行上面的命令时,即使我已经让它不冗长它仍然打印这条消息

tar: Removing leading `/' from member names

我如何摆脱它,因为我有自己的回声输出作为脚本的一部分我在网上搜索后尝试了以下但我认为我将一些命令放在一起会混淆 tar 并破坏操作。

我试过这些都没有成功

sshpass -p "xxxx" ssh user@pass tar --no-same-owner -czfP - /path/to/files/$f | split -b 10M - "$f.tar.bz2.part

sshpass -p "xxxx" ssh user@pass tar --no-same-owner -czf -C /path/to/files/$f | split -b 10M - "$f.tar.bz2.part

sshpass -p "xxxx" ssh user@pass tar --no-same-owner -czf - /path/to/files/$f | split -b 10M - "$f.tar.bz2.part > /dev/null 2>&1

sshpass -p "xxxx" ssh user@pass tar --no-same-owner -czf - /path/to/files/$f  > /dev/null 2>&1 | split -b 10M - "$f.tar.bz2.part

以上所有操作都中断了操作,我希望它根本不显示任何消息。我怀疑它与正则表达式以及管道如何通过参数有关。欢迎任何意见。

无论如何,这只是脚本的一部分,另一部分在 tar 之后上传处理后的文件并拆分它,但我不得不在本地将其分解为几个命令 'tar | split',然后上传通过 rclone。如果我可以通过管道传输 split 的输出并通过 ssh 远程保存它,效率会更高。

首先,使用sshpass时必须考虑安全漏洞。

关于问题1:

使用带有 -f - 选项的 tar 将即时创建 tar 并将发送到 stdout| 分隔命令。

  1. sshpass -p "xxxx" ssh user@pass tar --no-same-owner -czf - /path/to/files/$f - 远程运行
  2. split -b 10M - "$f.tar.bz2.part" - 在本地运行 shell

第二个命令从第一个命令(tar 输出)读取 stdin 并在本地创建文件。 如果您想在远程机器上执行所有操作,您可以像这样将其余命令括在引号中(阅读其他有关 qouting 的资源)。

sshpass -p "xxxx" ssh user@pass 'tar --no-same-owner -czf - /path/to/files/$f | split -b 10M - "$f.tar.bz2.part"'

关于问题2

tar: Removing leading '/' from member namestar 命令生成,该命令将 errors/warnings 发送到 STDERR,在终端中,STDERR 默认为用户屏幕。

因此您可以通过添加 2>/dev/null:

来抑制 tar 错误

sshpass -p "xxxx" ssh user@pass tar --no-same-owner -czf - /path/to/files/$f 2 > /dev/null | split -b 10M - "$f.tar.bz2.part