ローカルファイルをリモートサーバーに抽出

ローカルファイルをリモートサーバーに抽出

2台のLinuxサーバーがあります。 1つは複数のRARファイルを持ち、もう1つは空です。アーカイブを抽出し、コンテンツをサーバー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

関連情報