Как сохранить файл в памяти во время редактирования?

StackOverflow https://stackoverflow.com/questions/908457

  •  05-09-2019
  •  | 
  •  

Вопрос

Укороченная версия :Эхо "тестирование" | Vim - | Греп "Хорошо"

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

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

Длинная версия:Echo $ passw | gpg -q -d -passphrase -fd 0 $ имя файла | Vim - | «Каким -то образом GPG шифрует его, используя $ passw и сохраните его обратно в $ filename».

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

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

Это было полезно?

Решение

Вы могли бы просто заставить vim зашифровать его для вас.

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

    :{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.

Другие советы

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

vim "+set noswapfile"

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

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

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

Echo $ passw | gpg -q -d -passphrase -fd 0 $ имя файла | Vim -

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

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

Вы можете использовать %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-s, так что если ты не напишешь -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:удалить выбранные символы

РЕДАКТИРОВАТЬ:

Могу ли я сказать vim, чтобы он выдал ":%p" сразу после того, как я ":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» на стандартный выход, но на терминал.

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

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

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 после того, как оно завершило свое выполнение.

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

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

Помощь Vim (:help :X) говорит об алгоритме:

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top