Как сохранить файл в памяти во время редактирования? - PullRequest
6 голосов
/ 26 мая 2009

Короткая версия: эхо "тестирование" | Вим - | grep "хорошо"

Это не работает, так как vim не выводит в канал. Там написано: «Vim: Предупреждение: вывод не на терминал». Есть ли способ сделать это? Кросс-редакторская поддержка тоже подойдет.

Я пробовал именованные каналы, но vim не открывает их.

Длинная версия: echo $ passw | gpg -q -d --passphrase-fd 0 $ filename | Вим - | msgstr "каким-то образом gpg зашифровывает его с помощью $ passw и сохраняет его в $ filename".

Я пытаюсь отредактировать зашифрованный файл gpg, но не хочу, чтобы расшифрованный файл был на диске в любое время.

Полный сценарий здесь: https://github.com/ptarjan/viencrypt

Ответы [ 8 ]

7 голосов
/ 26 мая 2009

Имейте в виду, что по умолчанию Vim создает файл подкачки на диске. Запустите vim с помощью следующей команды, чтобы избежать этого:

vim "+set noswapfile"
5 голосов
/ 26 мая 2009

Вы можете просто сделать так, чтобы Vim зашифровал его для вас.

Прежде чем сохранить файл в vim, отфильтруйте содержимое через ваш gpg encrypter:

    :{range}![!]{filter} [!][arg]               *:range!*
          Filter {range} lines through the external program
          {filter}.  Vim replaces the optional bangs with the
          latest given command and appends the optional [arg].
          Vim saves the output of the filter command in a
          temporary file and then reads the file into the
          buffer.  Vim uses the 'shellredir' option to redirect
          the filter output to the temporary file.
          However, if the 'shelltemp' option is off then pipes
          are used when possible (on Unix).
          When the 'R' flag is included in 'cpoptions' marks in
          the filtered lines are deleted, unless the
          |:keepmarks| command is used.  Example: >
            :keepmarks '<,'>!sort
    <            
          When the number of lines after filtering is less than
          before, marks in the missing lines are deleted anyway.
        w 

Итак, если вы хотите отфильтровать его через gpg (я думаю, здесь есть флаги):

:%!gpg -q -d -p $password
:w $filename

Вам нужно будет экспортировать переменные окружения $password и $filename, чтобы vim имеет к ним доступ, если вы хотите использовать их в vim.

3 голосов
/ 26 мая 2009

Вы можете где-нибудь смонтировать файловую систему tmpfs (которая хранит данные в памяти) и выполнять свою работу там.

РЕДАКТИРОВАТЬ (!): Извините, сделайте это ramfs. Разница в том, что tmpfs может быть выгружен для замены пространства, которое вам не нужно. Кроме того, вы можете отключить все устройства подкачки (с помощью swapoff) и использовать tmpfs.

1 голос
/ 31 мая 2012

Другой вариант - использовать плагин gnupg для Vim вместо того, чтобы заново изобретать колесо. :) Конечно, я немного предвзят, так как я в настоящее время поддерживаю плагин.

1 голос
/ 27 мая 2009

Решение исходной проблемы (насколько я вижу):

secret.txt содержит зашифрованный текст.

./encode.sh - скрипт симметричного кодировщика.

Следующая команда прочитает текст из secret.txt, расшифрует, сделает его можно редактировать в Vim, кодировать и записывать обратно в secret.txt:

$ cp secret.txt | \
  ./encode.sh | \
  vim - -n -u NONE \
      -c ':autocmd VimLeave * :exec "%!./encode.sh" | write! tmp'; \
  mv tmp secret.txt

Примечания:

  • :autocmd VimLeave * <command>: выполнить <command> перед тем, как покинуть Vim для любого файла
  • :exec "%!./encode.sh" | write! secret.txt: пробег ./encode.sh в целом содержимое буфера в качестве фильтра, затем записать буфер в secret.txt
  • «Как фильтр» означает, что содержимое буфера будет передано в ./encode.sh. Содержимое буфера будет заменено стандартным вывод ./encode.sh после его завершения.

Но я должен сказать, что это уродливое решение. Я бы порекомендовал так же, как и rampion : взгляните на упомянутые автокоманды (:help autocommand) и попробуйте выполнить весь процесс редактирования в Vim.

Наконец, примечание: у Vim есть своя собственная команда шифрования, которая выполняет в точности то, что вы описали на веб-странице проекта : «Он просто дешифрует файл в файл, доступный только для вас, вы редактируете его в ваш любимый редактор, а затем он расшифровывает это и сохраняет файл туда, откуда он пришел. "

Справка Vim (:help :X) говорит об алгоритме:

  • Используемый алгоритм является хрупким. Ключ из 4 символов примерно за час, символьная клавиша за один день (на ПК Pentium 133). Это требует, чтобы вы знали некоторый текст, который должен появиться в файле. Эксперт может сломать его для любого ключа. Когда текст расшифрован, это также означает, что ключ может быть раскрыты, и другие файлы, зашифрованные с тем же ключом, могут быть расшифрованы.
  • Pkzip использует то же шифрование, и правительство США не возражает против его экспорта. Публичный файл Pkzip APPNOTE.TXT подробно описывает этот алгоритм.
1 голос
/ 26 мая 2009

Вы можете использовать команду %p для печати редактируемого файла на стандартный вывод.

В этом примере Vim читает свой стандартный ввод и отправляет его на стандартный вывод:

$ (echo one; echo two; echo three; echo four) | \
  vim - -nes -u NONE  -c ':%p' -c ':q!' | \
  tail -n +2 | \
  grep t
two
three

Примечания:

  • vim -: чтение со стандартного ввода
  • -n: не создавать файл подкачки, использовать только память
  • -e: запуск в режиме ex *
  • -s: бесшумный или пакетный режим
  • -u NONE: не читать .vimrc (Если вы хотите, чтобы ваш .vimrc читался, пропустите этот параметр. Но разные люди имеют разные .vimrc -ы, поэтому, если вы не пишете -u NONE, ваш код может не работать для другого лица или даже для вас, если вы измените свой .vimrc.)
  • -c <something>: запустить что-нибудь как команду
  • -c ':%p': вывести содержимое буфера на стандартный вывод
  • -c 'q!': выйти без сохранения
  • tail -n +2: убрать первую строку вывода Vim (это строка 'Vim: Reading from stdin...')

В следующем примере Vim действительно делает что-то полезное: он удаляет первый столбец стандартного ввода.

$ (echo one; echo two; echo three; echo four) | \
  vim - -nes -u NONE  -c ':exec "normal G\<c-v>ggx"' -c ':%p' -c ':q!' | \
  tail -n +2
ne
wo
hree
our

Примечания:

  • :exec: выполнить следующую команду (команда командной строки, а не команда нормального режима)
  • normal: команда командной строки, которая выполняет заданные команды нормального режима
  • G: перейти к последней строке файла
  • \<c-v>: выбор стартового блока
  • gg: перейти к первой строке
  • x: удалить выбранные символы

EDIT:

Могу ли я сказать vim выдать ":% p" сразу после I ": wq" из интерактивного сеанса?

Вы можете сказать Vim такие вещи, как «запустить команду X перед выходом», например, используя Автокоманда VimLeave (см. :help autocommand, :help VimLeave):

$ (echo "line 1"; echo "line 2") | \
  vim - -nes -u NONE -c ':autocmd VimLeave * :%p'
Vim: Reading from stdin...
:q!        # you type :q!
line 1
line 2

Проблема с командой ":% p". Если вы используете аргумент "-e", вы не будете получить визуальный редактор. Если вы не используете "-e", Vim не будет печатать результат ":% p" к стандартному выводу, но к терминалу.

Я сделаю другое предложение в другом посте.

1 голос
/ 26 мая 2009

Это правильно: Vim не выводит на канал. Vim не принимает входные данные и не выводит их в канал, а выводит их в окно редактора, где вы можете их редактировать. Вы не можете продолжить последовательность каналов после vim. Так что попробуйте:

echo $ passw | gpg -q -d --passphrase-fd 0 $ filename | vim -

Или вообще не используйте vim.

Если вы хотите отредактировать файл перед тем, как вернуться к gpg, вам придется сделать это в два этапа.

0 голосов
/ 26 мая 2009

Вы не можете ничего скрыть от пользователя root, даже в памяти (у них есть доступ к / dev / mem). Этого факта нельзя избежать.

Так что я бы просто использовал временные файлы в вашем домашнем каталоге, которые должны быть защищены от всех, кроме root. В одной строке введите:

echo "testing" >~/proc$$ ; vim ~/proc$$ ;
    grep "good" ~/proc$$ ; rm -f ~/proc$$

Если вам нужна реальная безопасность, переместите файл в ящик, где вы являетесь единственным пользователем root, и сделайте это там. Затем переместите зашифрованный файл обратно.

...