linux - 획득 - 리눅스 su 명령어




vi 내부의 파일에 대한 루트 권한을 얻습니까? (7)

일반적인주의 사항

읽기 전용 파일 문제를 해결하는 가장 일반적인 방법은 sudo tee 구현을 사용하여 수퍼 유저로서 현재 파일에 대한 파이프를 여는 것입니다. 그러나 인터넷에서 찾은 가장 인기있는 모든 솔루션에는 몇 가지 잠재적 인 경고가 있습니다.

  • 파일뿐만 아니라 전체 파일이 터미널에 기록됩니다. 대용량 파일, 특히 네트워크 연결 속도가 느린 경우 속도가 느려질 수 있습니다.
  • 파일의 모드와 유사한 속성이 손실됩니다.
  • 특이한 문자 나 공백이있는 파일 경로는 올바르게 처리되지 않을 수 있습니다.

솔루션

이러한 모든 문제를 해결하려면 다음 명령을 사용하십시오.

" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'

이들은 정중하게 단축 될 수 있습니다.

:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'

설명

: 명령을 시작합니다. 명령 입력을 시작하려면이 모드에서 일반 문자를 입력해야합니다. 스크립트에서는 생략해야합니다.

sil[ent] 는 명령의 출력을 억제합니다. 이 경우 :! 실행 한 후 나타나는 Press any key to continue :! 명령.

exec[ute] 는 문자열을 명령으로 실행합니다. 필요한 함수 호출을 처리하지 않으므로 :write 실행할 수 없습니다.

! 를 나타냅니다 :! command : :write 허용하는 유일한 명령입니다. 일반적으로 :write:write 파일 경로를 허용합니다. :! 자체적으로 쉘에서 명령을 실행합니다 (예 : bash -c ). :write 사용하면 셸에서 명령을 실행 한 다음 전체 파일을 stdin 씁니다.

sudo 는 분명해야합니다. 왜냐하면 당신이 여기에 있기 때문입니다. 수퍼 유저 권한으로 명령을 실행하십시오. 인터넷에는 그 작동 방식에 대한 많은 정보가 있습니다.

주어진 파일에 tee 파이프 stdin . :writestdin 에 기록한 다음 수퍼 유저 tee 가 파일 내용을 수신하고 파일을 기록합니다. 내용을 덮어 쓰는 새 파일을 만들지 않으므로 파일 모드와 특성이 유지됩니다.

shellescape() 는 현재 쉘에 따라 주어진 파일 경로에서 특수 문자를 이스케이프합니다. 매개 변수가 하나만 있으면 일반적으로 경로를 따옴표로 묶습니다 (필요한 경우). 전체 쉘 명령 행으로 전송하기 때문에 쉘을 넘어갈 수있는 다른 특수 문자의 백 슬래시 이스케이프를 가능하게하기 위해 0이 아닌 값을 두 번째 인수로 전달하려고합니다.

@% 는 현재 버퍼의 파일 이름을 포함하는 % 레지스터의 내용을 읽습니다. 반드시 절대 경로 일 필요는 없으므로 현재 디렉토리를 변경하지 않았는지 확인하십시오. 일부 솔루션에서는 상업 기호가 생략 된 것을 볼 수 있습니다. 위치에 따라 % 는 유효한 표현식이며 % 레지스터를 읽는 것과 동일한 효과를 갖습니다. 그러나 다른 식 안에 중첩되어있는 경우 바로 가기는 일반적으로 허용되지 않습니다 (예 :이 경우).

>NUL>/dev/null 은 플랫폼의 널 디바이스로 stdout 을 경로 재 지정합니다. 비록 우리는 명령을 침묵 시켰지만, stdin 을 vim으로 다시 배관하는 것과 관련된 모든 오버 헤드를 원하지 않습니다. 가능한 빨리 덤프하는 것이 가장 좋습니다. NUL 은 DOS, MS-DOS 및 Windows에서 널 파일이며 유효한 파일이 아닙니다. Windows 8부터 NUL로 리디렉션하면 NUL이라는 파일이 작성되지 않습니다. 파일 확장자가 있거나없는 데스크탑에 NUL이라는 파일을 작성하십시오. 그렇게 할 수 없습니다. (Windows에는 알아야 할 다른 장치 이름이 몇 가지 있습니다.)

~ / .vimrc

플랫폼에 따라 다름

물론, 당신은 여전히 ​​그것들을 암기하고 매번 입력하기를 원하지 않습니다. 적절한 명령을보다 간단한 사용자 명령에 매핑하는 것이 훨씬 쉽습니다. POSIX에서이 작업을 수행하려면 ~/.vimrc 파일에 다음 줄을 추가하여 아직없는 경우 만들 수 있습니다.

command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

이렇게하면 : W (대소 문자 구분) 명령을 입력하여 수퍼 유저 권한으로 현재 파일을 훨씬 쉽게 작성할 수 있습니다.

플랫폼 독립적

여러 컴퓨터에서 동기화되는 플랫폼 독립적 인 ~/.vimrc 파일을 사용하므로 다중 플랫폼 기능을 추가했습니다. 관련 설정 만있는 ~/.vimrc 는 다음과 같습니다.

#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
"   ts:     Actual tab character stops.
"   sw:     Indentation commands shift by this much.
"   sr:     Round existing indentation when using shift commands.
"   sts:    Virtual tab stops while using tab key.
"   fdm:    Folds are manually defined in file syntax.
"   ff:     Line endings should always be <NL> (line feed #09).
"   fenc:   Should always be UTF-8; #! must be first bytes, so no BOM.


" General Commands: User Ex commands. {{{1
    command W call WriteAsSuperUser(@%)         " Write file as super-user.


" Helper Functions: Used by user Ex commands. {{{1
    function GetNullDevice() " Gets the path to the null device. {{{2
        if filewritable('/dev/null')
            return '/dev/null'
        else
            return 'NUL'
        endif
    endfunction

    function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
        exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
    endfunction


" }}}1
" EOF

구성 파일을 편집하는 동안 종종 vi로 파일을 열고 저장하려고 할 때 입력하지 않았다는 것을 알게됩니다.

sudo vi filename

vi sudo 권한을 부여하여 파일을 저장할 수있는 방법이 있습니까? 한참 전에 vi에 대한 내용을 찾는 동안 이것에 대해 뭔가를 본 것이 기억 나지만 지금은 그것을 찾을 수 없습니다.


Ryan의 조언은 일반적으로 좋지만 3 단계 이후에 임시 파일을 이동하지 마십시오. 소유권과 권한이 잘못되었습니다. 대신 올바른 파일을 sudoedit 하고 임시 파일의 내용 ( :r 사용하여)을 읽으십시오.

2 단계를 수행하는 경우 :w! 파일을 강제로 작성합니다.


나는 ~ / .bashrc에 이것을 가지고있다 :

alias svim='sudo vim'

이제 구성 파일을 편집해야 할 때마다 svim으로 엽니 다.


다음은이 질문에 대한 답변으로 SudoRead 및 SudoWrite 기능을 제공하는 SudoEdit이라는 플러그인입니다. 기본적으로 sudo를 먼저 사용하고 실패하면 su를 사용하려고합니다. http://www.vim.org/scripts/script.php?script_id=2709


일반적으로 vi 프로세스의 유효 사용자 ID를 변경할 수 없지만 다음을 수행 할 수 있습니다.

:w !sudo tee myfile

파일에서 삽입 모드로 들어가면 편집하기 위해 sudo 액세스 권한이 필요합니다.

-- INSERT -- W10: Warning: Changing a readonly file

내가 그리워하면 일반적으로

:w ~/edited_blah.tmp
:q

..그때..

sudo "cat edited_blah.tmp > /etc/blah"

..또는..

sudo mv edited_blah.tmp /etc/blah

아마 덜 원형 교차로 방법이 있지만 작동합니다.


% 는 현재 파일 이름으로 바뀌므로 다음을 사용할 수 있습니다.

:w !sudo tee %

( vim 은 파일이 변경되었음을 감지하고 다시로드할지 여부를 묻습니다. 확인 대신 [L] 을 선택하여 예라고 말하십시오.)

바로 가기로 자신의 명령을 정의 할 수 있습니다. .vimrc 다음을 입력하십시오.

command W w !sudo tee % >/dev/null

위와 같이 :W<Enter>:W<Enter> 하여 파일을 저장할 수 있습니다. 내가 이것을 썼기 때문에, 나는 이것을 할 수있는 더 좋은 방법을 찾았다.

cmap w!! w !sudo tee >/dev/null %

이 방법으로 다음을 입력 할 수 있습니다 :w!! 커서가 끝에있는 상태로 전체 명령 행으로 확장되므로 원하는 경우 % 를 사용자 고유의 파일 이름으로 바꿀 수 있습니다.





vi