Unrar локальные файлы к удаленному серверу

Это, кажется, не возможно с /etc/environment. Это предназначено как общее местоположение для переменных, это - независимая оболочка. Учитывая это не похоже, что это поддерживает строки со знаками "диез" (#) в них и, кажется, нет способа выйти из них.

Я нашел этот SF Вопросами и ответами названный: Как каждый правильно выходит из продвижения “#\” символ в Linux и т.д./среда?. Ни один из этих методов не работал:

  • управляйте = "привет"
  • test0 = "#hello"
  • test1 = "h\#ello"
  • test2 = "h#ello"
  • test3 = "h//#ello"
  • test4 = "h/#ello"
  • test5=h#ello
  • test6=h\#ello
  • test7=h#ello
  • test8=h//#ello
  • test9=h/#ello
  • test10 ='h#ello'
  • test11 ='h\#ello'
  • test12 ='h#ello'
  • test13 ='h//#ello'
  • test14 ='h/#ello'

Принятый ответ на тот вопрос и что также было бы моим советом:

Хорошо это - хитрый материал, который Вы хотите сделать /etc/environment не синтаксис оболочки, он похож один, но это не, который делает расстраивает людей. Идея позади /etc/environment было замечательно. Независимый от оболочки способ настроить переменные! Yay! Но практические ограничения делают это бесполезным.

Вы не можете передать переменные туда. Попытка, например, помещается MAIL=$HOME/Maildir/ в него и видят то, что происходит. Лучше всего только прекратить пытаться использовать его для любой цели вообще, увы. Таким образом, Вы не можете сделать вещей с ним, что Вы ожидали бы мочь сделать, если бы это было обработано оболочкой.

Использовать /etc/profile или /etc/bashrc.

И все же другой Вопросы и ответы дал это рациональное относительно почему дело обстоит так:

Нет никакого пути в /etc/environment для выхода из # (поскольку это рассматривало как комментарий), поскольку это анализируется им модуль PAM "pam_env" и это рассматривает его как простой список пар KEY=VAL и настраивает среду соответственно. Это не удар/оболочка, синтаксический анализатор не имеет никакого языка для того, чтобы сделать переменное расширение или выход символов.

Ссылки

3
23.04.2014, 19:40
1 ответ

unrar p -inul архив. 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'

--- редактируйте ---

My 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
3
27.01.2020, 21:23

Теги

Похожие вопросы