vi, nvi 및 vim에서 중요한 파일을 편집할 때 복구 파일을 억제합니다.

vi, nvi 및 vim에서 중요한 파일을 편집할 때 복구 파일을 억제합니다.

저는 암호화 키와 비밀번호를 포함하여 매우 민감한 정보가 포함된 암호화된 데이터베이스를 유지 관리하는 애플리케이션을 작성하고 있습니다. 이 응용 프로그램은 memlock 사용, ptrace 차단, 코어 덤프 방지 등에 대해 편집증적이지만 데이터베이스 소유자가 데이터베이스 내용을 편집할 수 있도록 하는 명령이 있습니다. 이 명령은 전체 데이터베이스를 사람이 읽을 수 있는 ASCII 형식의 임시 파일에 쓰고 사용자가 편집할 수 있도록 합니다. 특히 새로 생성된 디렉터리 /tmp/XXXXXXXX/(여기서 /tmp는 이상적으로는 메모리 파일 시스템)에 새 파일을 생성한 다음 해당 파일에 대해 사용자가 선호하는 편집기를 실행합니다. 편집기가 종료되면 응용 프로그램은 파일 내용을 구문 분석하고 /tmp/XXXXXXXX/최종적으로 디렉터리를 삭제하기 전에 파일과 그 밖의 모든 항목을 파쇄합니다 .

불행하게도 이 전략은 어떤 ​​vi 변형에서도 잘 작동하지 않습니다. 왜냐하면 편집기는 결국 파일의 복사본을 /var/tmp/vi.recover에 기록하게 되고 vi가 파일을 삭제한 후에도 디스크에 남아 있을 가능성이 높기 때문입니다. (데이터에는 전체 원시 파티션을 쉽게 검색할 수 있는 높은 가치의 개인 키가 포함되어 있습니다.) 이러한 복구 파일을 억제하거나 최소한 /tmp/XXXXXXXX/.

EDITOR나의 이상적인 솔루션은 대부분의 vi 변형에서 작동하지만 환경 변수를 구문 분석하고 각 편집기마다 다른 작업을 수행하는 것도 기쁩니다 . 따라서 vim에는 작동하지만 다른 솔루션에는 작동하지 않는 솔루션이 있다면 적어도 좋은 시작입니다. (나는 이미 구문 분석 오류의 정확한 열 번호로 편집기를 다시 열 수 있도록 특수한 경우 vim을 사용했지만 다른 vi 변형은 해당 행에서만 열 수 있습니다.)

이것은 다른 사람들에게 배포하기 위한 애플리케이션이기 때문에 내가 할 수 없는 한 가지 일은 사람들의 .exrc 또는 .vimrc 파일을 편집하여 문제를 해결하는 것입니다. 절박한 상황에서는 편집기를 실행하기 전에 HOME 환경 변수를 변경하고 사용자의 실제 변수를 일부 복구 억제 명령과 병합하는 임시 .vimrc를 만들 수 있다고 가정합니다. 그러나 나는 명령줄이나 주석 솔루션을 훨씬 선호합니다.

최소한의 작업 예제에 가장 가까운 것은 내가 emacs에서 수행하는 작업을 공유하는 것입니다. 즉, 파일 끝에 다음 설명을 추가합니다.

# Local Variables:
# make-backup-files: nil
# auto-save-default: nil
# End:

가장 쉬운 방법은 명령줄 옵션이지만, vim이나 다른 vi 변형에 대해 동등한 주석이 작동할 수 있다면 그것도 좋을 것입니다.

업데이트:

strace로 몇 가지 실험을 한 후 다음 명령이 나온 것 같습니다.~할 것 같다vim을 위해 내가 원하는 것을 하세요:

vim -n -c 'set viminfo=' /tmp/XXX/secret.ini

--cmd그러나 제안된 옵션인 에서는 작동하지 않고 에서만 작동합니다 -c. 더욱이, 나는 실제로 무엇을 하는지 이해하지 못하지만 -n매뉴얼 페이지에서 복구가 중단될 것이라고 말한 것을 발견했습니다. 그래서 나는 vim에 대해 잘 아는 누군가로부터 답변을 듣고 싶습니다. 실제로 이것이 효과가 있다면요. 물론 다른 vi 변형에 대한 솔루션도 환영받을 것입니다.

업데이트 2:

EXINIT 환경 변수~할 것 같다로 설정하면 vi 및 nvi에서 작동합니다 EXINIT=set dir=/tmp/XXX|set recdir=. nvi는 시작 시 복구 부족에 대한 경고를 제공하는데 이는 고무적인 반면 vi는 파일을 파일 시스템에 삭제하지만 적어도 해당 파일은 종종 메모리 파일 시스템인 /tmp에 있습니다.

답변1

vim다음을 사용하여 복구 파일의 위치를 ​​이동할 수 있습니다 .directory옵션.

set directory=/tmp/XXXXXXXX

다음과 같이 단일 인스턴스의 명령줄에 추가할 수 있습니다.

mkdir -m700 /tmp/xyz
vim --cmd "set directory=/tmp/xyz" /path/to/secure.file

답변2

편집증이 가능한 한 사용자에게 합리적인 편집기를 제공하기 위한 몇 가지 옵션을 생각해 볼 수 있습니다. 이 애플리케이션은 보안에 민감한 애플리케이션이므로 여기에 있는 모든 내용을 신중하게 고려하고 실수가 있으면 수정하시기 바랍니다.

나는 이러한 작업 중 하나를 기본값으로 수행할 것을 제안하고 싶지만 사람들이 명확하게 문서화된 옵션으로 자신의 옵션을 사용할 수 있도록 vim명확하게 문서화된 방식으로 제공하여 잠긴 vi.

또한 이러한 제안 중 일부(특히 를 사용한 제안 LD_PRELOAD)는 완전히 허용되지 않거나 비활성화되거나(가능한 한) 사용자 환경에서 제한될 수 있습니다.

특별한 순서 없이 잠재적으로 상호 배타적인 옵션은 다음과 같습니다.

  1. 마찬가지로, 권한이 없는 사용자로 편집기를 실행하십시오 sudoedit.
  2. 패치하거나 컴파일하고 싶지 않은 기능을 자신만의 편집기에 제공하세요.
  3. libc를 사용하여 문제가 있는 함수 에 대한 호출을 차단합니다 LD_PRELOAD.
  4. 사용자를 .vimrc완전히 건너뜁니다.

1) 권한이 없는 사용자로 편집기를 실행합니다.

추가 사용자를 만들 수 있거나 소프트웨어를 사용하는 사람들에게 권한 없는 전용 사용자를 만들도록 요구하는 경우 sudoedit임시 파일을 만들고 사용자가 권한 없는 사용자로 편집하도록 하는 동일한 방법을 사용할 수 있습니다. 임시 파일이 디스크에 닿지 않도록 보장하는 방법을 모르겠습니다.

이미 이와 비슷한 작업을 수행하고 있지만 권한이 없는 사용자는 없는 것 같습니다.

여기sudoedit작동 방식을 설명하는 수퍼유저 답변.

또한 sudoedit의 기능이 어떻게 sudo작동하는지 연구하는 것이 좋습니다.여기에 관련 코드가 있습니다.

2) 자신만의 번들을 만드세요 vi.

nvi작고 BSD 라이센스가 있는 경우 패치를 적용하여 스왑 파일을 만들지 않거나 스왑 파일 지원 없이 컴파일하지 않을 수도 있습니다. 지난 번 빌드를 시도했을 nvi때 고대 버전의 autotools를 사용하여 OS X를 감지하는 방법을 알 수 없었기 때문에 실제로는 모르겠습니다.

주요 제품 빌드의 일부로 nvi실행 파일의 해시를 가져와 빌드 시간 상수로 베이킹할 수 있습니다.

Emacs 사용자는 mg. 여기mg 포크에 연결. OpenBSD의 소스 트리에 실제로 존재하는 변종은 ISC 라이센스를 받았습니다. 때때로 문제가 발생하기 때문에 패치가 필요할 수도 있습니다(예: 와 상호작용하기 위해 cscope).

나노 사용자들은 운이 좋지 않은 것 같아요.

삼)LD_PRELOAD

, , &c 와 같은 함수 에 대한 호출을 가로채기 위해 shim을 로드하도록 LD_PRELOAD지시하는 데 사용합니다 (Linux에서).ld.solibcfwritefork

4) 에서 사용자 구성 옵션을 건너뛰고 vim대신 자체 최소 구성을 실행하세요.

이것은 제가 생각할 수 있는 가장 완벽한 명령줄이지 vim만 뭔가 놓쳤을 수도 있습니다. vim 매뉴얼 페이지를 읽고 내 .vimrc.

  • -u NONE-- 초기화 없음
  • -i NONE-- 아니요.viminfo
  • -U NONE-- 초기화 없음( gvim하지만 너무 조심하면 안 됩니다)
  • -Z -- 마치 당신 처럼 시작 argv[0]하세요 rvim.
  • set nocompatible-- 호환되지 않습니다 vi.
  • set backspace=indent,eol,start-- 백스페이스를 더욱 직관적으로 만듭니다.
  • set noexrc-- 중복될 수 있으므로 파일을 읽지 마세요 rc.
  • set secure-- no autocmd, no shell, no write, 표시 - - map명령.
  • set nobackup-- 백업 옵션 없음
  • set laststatus=2-- 편집 중인 파일을 표시합니다.

모든 것을 하나로 묶는 명령줄은 다음과 같습니다.

vim -n -u NONE -i NONE -U NONE -Z \
        --cmd "set nocompatible | set backspace=indent,eol,start | set noexrc | set secure | set nomodeline | set nobackup | set laststatus=2" \
         --

관련 정보