我有两台 Linux 服务器,一台有几个 RAR 文件,另一台是空的。我想提取存档并将内容移至服务器 2。
问题是:我没有足够的存储空间来提取服务器 1 上的文件。而且我无法使用 SSHFS,因为服务器 1 上无法加载 FUSE 模块。
我已经看到有unrar
将p
输出发送到 STDOUT 的选项。是否有可能用它来解决问题?
答案1
unrar p -inul archive.rar
将在屏幕上打印提取的存档的内容,但它将连接所有文件:
$ unrar p -inul archive.rar
content of first
file
and here is second fle
因此,如果您的存档中有一个文件,那么您可以执行以下操作:
$ unrar p -inul archive.rar | ssh serverb 'cat > file.from.archive'
如果您有很多文件,那么您可以使用:
size_of_first_file=$(unrar l archive.rar| head -9| tail -1 | awk '{print $2}')
size_of_second_file=$(unrar l archive.rar| head -10| tail -1 | awk '{print $2}')
或者将其放入循环中。并使用dd
而不是提取文件cat
:
$ unrar p -inul archive.rar | ssh serverb 'dd of=first_file.from.archive bs=1 count=$size_of_first_file'
- - 编辑 - -
我的概念验证:
#!/bin/bash
if [ $# -lt 3 ]
then
echo "Usage: $0 user@ssh_server rar_file remote_directory"
exit 1
fi
i=8
size=0
skip=0
ssh_server=$1
rar_file=$2
remote_directory=$3
until [ "${size}" == "---------" ]
do
let i=${i}+1
size=$(unrar l ${rar_file} | head -${i} | tail -1 | awk '{ print $2 }')
filename=$(unrar l ${rar_file} | head -${i} | tail -1 | cut -c 40- )
directory=$(echo ${filename} | sed -e 's,/[^/]\+,,')
if [ ${size} == "---------" ]
then
break
else
echo -e "[*] Extracting: ${filename} size: ${size} from: ${rar_file}"
unrar p -inul ${rar_file} | ssh ${ssh_server} "
cd ${remote_directory}
if [ ! -d ${directory} ]
then
mkdir -p ${directory}
fi
dd skip=${skip} bs=1 count=${size} of=${filename} 2> /dev/null"
let skip=${skip}+${size}
fi
done