두 대의 Linux 서버가 있습니다. 하나는 여러 개의 RAR 파일이 있고 다른 하나는 비어 있습니다. 아카이브를 추출하고 내용을 서버 2로 이동하고 싶습니다.
문제는 서버 1에서 파일을 추출할 저장 공간이 충분하지 않다는 것입니다. 그리고 FUSE 모듈을 서버 1에 로드할 수 없기 때문에 SSHFS를 사용할 수 없습니다.
출력을 STDOUT으로 보내는 unrar
옵션 이 있다는 것을 확인했습니다 . p
문제를 해결하는 데 사용할 수 있습니까?
답변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