我有两个Linux服务器,一个有几个RAR文件,另一个是空文件.我想提取存档并将内容移动到服务器2.
问题是:我没有足够的存储空间来提取服务器1上的文件.此外,我无法使用SSHFS,因为服务器1上无法加载FUSE模块.
我已经看到unrar有p选项,它将输出发送到STDOUT.是否有可能使用它来解决问题?
解决方法:
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'
—编辑—
我的POC:
#!/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
标签:rar,linux,scp,ssh 来源: https://codeday.me/bug/20190814/1657342.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。