我正尝试通过ssh解压多个tar文件:
ssh user@hostname "cat /dir/file*.tgz" | tar xvzf -
上述方法仅适用于远程服务器上的第一个文件匹配项。本地(目标)服务器只接收一个文件。但是通配符已被验证可匹配多个文件。
是否有其他方法可以实现此功能?
另一个想法是,避免多次使用 ssh
命令以及 scp
命令(因为这两个命令至少需要来回传递每个文件一次):
ssh user@hostname 'tar cf - /dir/file*.tgz' | tar xf - --to-command='tar xzvf -'
tar
调用将所有文件打包在一起,在客户端再次使用第二个 tar
调用将它们解压,然后对每个条目调用 tar xzv
。这类似于sehe的base64答案,但更高效,因为它不会让文件变大。tar --catenate -f existing.tar appendix*.tar
,但是(a)它不能进行流式传输 (b) 它不能处理压缩存档。 - sehetar
手册页的组合。但我很高兴我们能帮忙。 - Paŭlo Ebermannmkdir /tmp/tars
scp 'user@hostname:/dir/file*.tgz' /tmp/tars/
foreach tarname in /tmp/tars/*.tgz; do tar xzvf "$tarname"; done
如果绝对不能存储临时副本:
ssh user@hostname 'ls /dir/file*.tgz' | while read tarname;
do
ssh user@hostname "cat '/dir/$tarname'" | tar xzvf -
done
ssh
连接。 - Paŭlo Ebermannls -1
列出每个文件并将其放在新行上。否则,read
将一次读取多个文件。 - Paŭlo Ebermannls
在什么系统上会输出多列? - John Zwinckssh user@hostname 'find /path/to/dir -name "*.tar.gz" -exec tar xvf "{}" ";"'
单个ssh调用,无需编写bash脚本。
CarpeNoctem的启发让我更进一步,提供了一个一站式解决方案,只需要一个SSH连接,就可以完成所有流媒体相关工作。
经过测试的概念证明(一行代码格式化以提高可读性):
(echo '#!/bin/sh';
for a in /dir/file*.tgz
do
echo 'base64 -d <<"TARIMAGE" | tar xvzf -'
base64 "$a"
echo "TARIMAGE"
done) | ssh -C remote 'cd /targetdir && sh -'
#!/bin/bash
echo '#!/bin/sh';
for a in /dir/file*.tgz
do
echo 'base64 -d <<"TARIMAGE" | tar xvzf -'
base64 "$a"
echo "TARIMAGE"
done
调用
scp gen_script.sh user@hostname:
ssh -C user@hostname /home/user/gen_script.sh | (cd targetdir && sh -)
使用文件比使用命令更容易。因此,与其使用ssh
命令访问远程主机和tar
命令访问存档,不如使用SSHFS文件系统访问远程主机上的文件。
mkdir hostname-dir.tmp
sshfs user@hostname:/dir hostname-dir.tmp
for a in hostname-dir.tmp/*.tgz; do tar xvf "$a"; done
fusermount -u hostname-dir.tmp
你甚至可以更进一步,使用AVFS将存档文件作为目录¹访问。所有这些都由FUSE提供,它是一个通用的框架,可以将各种东西作为文件进行访问。
mountavfs
mkdir hostname-dir.tmp
sshfs user@hostname:/dir hostname-dir.tmp
for a in ~/.avfs$PWD/hostname-dir.tmp/*.tgz; do cp -Rp "$a#"/* .; done
fusermount -u hostname-dir.tmp
for
循环可以被glob qualifier替换。cp -Rp ~/.avfs$PWD/hostname-dir.tmp/*.tgz(e\''reply=($REPLY\#/*)'\') .
¹ AVFS也可以通过SSH访问远程文件,但我认为您不能以此方式访问远程存档:AVFS路径只有一个跳跃点。因此仍然需要SSHFS。
cat /dir/file*.tgz | tar xvzf -
)。 - Oliver Charlesworth