Estou escrevendo um aplicativo que mantém um banco de dados criptografado contendo informações extremamente confidenciais, incluindo chaves criptográficas e senhas. O aplicativo é paranoico sobre o uso de memlock, bloqueio de ptrace, prevenção de coredumps, etc., mas possui um comando para permitir que o proprietário do banco de dados edite o conteúdo do banco de dados. Esse comando grava todo o banco de dados em um arquivo temporário em formato ASCII legível e permite que o usuário o edite. Especificamente, ele cria um novo arquivo em um diretório recém-criado /tmp/XXXXXXXX/
(onde / tmp é idealmente um sistema de arquivos de memória) e, em seguida, executa o editor preferencial do usuário no arquivo. Quando o editor sai, o aplicativo analisa o conteúdo do arquivo e fragmenta o arquivo e qualquer outra coisa em /tmp/XXXXXXXX/
antes de finalmente excluir o diretório.
Infelizmente, essa estratégia não funciona muito bem com nenhuma das variantes do vi, porque o editor acaba gravando cópias do arquivo para /var/tmp/vi.recover, onde elas provavelmente persistirão no disco mesmo depois do vi apaga-os. (Os dados contêm chaves privadas de alto valor, para as quais seria fácil procurar uma partição bruta inteira.) Estou procurando uma maneira genérica de suprimir esses arquivos de recuperação ou, no mínimo, movê-los para /tmp/XXXXXXXX/
.
Minha solução ideal funcionaria para a maioria das variantes do vi, mas também fico feliz em analisar a variável de ambiente EDITOR
e fazer algo diferente para cada editor. Portanto, se você tem uma solução que funcione para o vim, mas não para os outros, isso é pelo menos um bom começo. (Eu já tenho vim de caso especial para reabrir o editor para o número exato da coluna de um erro de análise, enquanto outras variantes do vi só podem ser abertas para a linha apropriada.)
Como este é um aplicativo a ser distribuído para outras pessoas, a única coisa que não posso fazer é resolver o problema editando os arquivos .exrc ou .vimrc das pessoas. Em um aperto absoluto, suponho que eu poderia alterar a variável de ambiente HOME antes de executar o editor e criar um .vimrc temporário que mescla o real do usuário com alguns comandos de supressão de recuperação. No entanto, eu preferiria muito mais uma solução de linha de comando ou comentário.
O mais próximo que eu posso chegar de um exemplo mínimo de trabalho é compartilhar o que eu faço para o emacs, que é anexar o seguinte comentário no final do arquivo:
# Local Variables:
# make-backup-files: nil
# auto-save-default: nil
# End:
Embora o mais fácil seja uma opção de linha de comando, se algum comentário equivalente puder funcionar para o vim ou qualquer outra das variantes vi, isso também seria ótimo.
update:
Depois de alguma experimentação com strace, parece que o seguinte comando pode fazer o que eu quero para o vim:
vim -n -c 'set viminfo=' /tmp/XXX/secret.ini
No entanto, não funciona com --cmd
, que foi a opção sugerida, mas apenas com -c
. Além disso, eu realmente não entendo o que o -n
faz, mas apenas notei que a página do manual dizia que iria quebrar a recuperação. Então eu ainda adoraria ouvir uma resposta de alguém com conhecimento sobre o vim, se é que isso funciona mesmo. E, claro, soluções para as outras variantes vi seriam bem-vindas.
atualização 2:
A variável de ambiente EXINIT pode funcionar para vi e nvi, se eu configurá-lo para EXINIT=set dir=/tmp/XXX|set recdir=
. O nvi dá um aviso sobre a falta de recuperação na inicialização, o que é animador, enquanto o vi solta arquivos no sistema de arquivos, mas pelo menos eles estão em / tmp, o que geralmente é um sistema de arquivos de memória.