sudo로 nano를 시작하는 것을 잊었을 때 nano에서 루트로 저장할 수 있습니까?

sudo로 nano를 시작하는 것을 잊었을 때 nano에서 루트로 저장할 수 있습니까?

여러 번 파일을 편집하고 nano저장하려고 시도했지만 루트로 실행하는 것을 잊어버렸기 때문에 권한 오류가 발생했습니다. sudo파일을 다시 열고 다시 편집할 필요 없이 편집기 내에서 루트가 될 수 있는 빠른 방법이 있습니까 ?

답변1

아니요, 실행 중인 프로그램이 시작될 때 갖고 있지 않은 권한을 부여할 수 없습니다. 이는 "권한 에스컬레이션"이라는 보안 허점이 됩니다.

다음 두 가지 작업을 수행할 수 있습니다.

  1. /tmp 또는 다른 위치에 임시 파일을 저장하고 편집기를 닫은 다음 임시 파일의 내용을 편집 중인 파일에 덤프합니다. sudo cp $TMPFILE $FILE. 이 방법 mv은 파일 소유권 및 권한이 변경될 수 있으므로 권장되지 않습니다. 파일 자리 표시자 자체가 아닌 파일 내용만 바꾸면 됩니다.
  2. Ctrl+를 사용하여 편집기를 배경으로 z하고 파일 소유권이나 권한을 변경하여 쓸 수 있게 한 다음 을 사용하여 fg편집기로 돌아가서 저장하세요. 권한을 수정하는 것을 잊지 마세요!

일부 편집자는 실제로 다른 권한으로 새 프로세스를 시작하고 저장을 위해 해당 프로세스에 데이터를 전달하여 이를 수행할 수 있습니다. 예시 보기이 관련 질문파이프를 처리하기 위해 파일 버퍼 쓰기를 허용하는 고급 편집기의 다른 솔루션용입니다. Nano에는 새로운 프로세스를 시작하거나 데이터를 다른 프로세스로 전달하는 기능이 없으므로 제외됩니다.

답변2

방금 시도해 보았는데 nano가장 놀라운 점은 파일 편집을 시작할 때 파일이 읽기 전용이라는 경고조차 표시하지 않는다는 것입니다. (업데이트: nano 2.2에서는 경고가 발생하지 않는 것으로 보입니다.)

다음은 이를 수행하는 (기본) 스크립트입니다.

파일을 편집할 수 있는지 확인하고 그렇지 않은 경우 "nano"를 루트로 실행합니다.

/usr/local/bin/editroot(또는~/빈/편집루트)

sudo=                       # empty is false, non-empty is true
editor=nano                 # XXX check $EDITOR and $VISUAL

if test -e "$1" && test ! -w "$1"; then
    if test -t 0 && test -t 2; then
        printf "%s is not writable.  Edit with sudo? [y/n] " "$1" 1>&2
        read -n 1
        case $REPLY in
        y|Y)
            sudo=true
            ;;
        n|N)
            sudo=
            ;;
        *)
            printf "\nExpected y or n.  Exiting.\n" 1>&2
            exit 1
            ;;
        esac
    else
        printf "%s is not writable.  Fix the permissions or run \"view\" instead." "$1" 1>&2
        exit 1
    fi
fi

${sudo:+sudo} "$editor" "$1"

view변경 사항이 없다는 것을 알고 있는 경우 프롬프트를 피할 수 있도록 명령을 호출했습니다 .

/usr/local/bin/view(또는~/bin/views)

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Vi/Vim의 일부 라는 프로그램이 이미 있으므로 view더 나은 이름을 제안해 주시기 바랍니다.
(그러나 나는 이 프로그램을 완전히 구현하면 Vi가 view중복될 것이라고 생각합니다.)


완전한 버전

답변3

nano버전 2.9.8(2018)에는 외부 명령에서 텍스트를 필터링하는 기능이 추가되었습니다.

외부 명령을 통해 버퍼의 텍스트를 필터링하면 액세스 권한이 있는 경우 sudo tee some/path/file텍스트가 루트로 저장됩니다 .some/path/filesudo

편집기에서 이 작업을 수행하려면 ^R^X+를 누른 Ctrl+R다음 Ctrl+X다음을 입력하세요.

|sudo tee some/path/file

이는 some/path/file루트로 재정의됩니다.

현재 편집 세션을 중단하고 파일을 다시 여는 것이 더 안전할 수 있습니다. sudo nano some/path/file왜냐하면 전체 경로 이름을 올바르게 입력할 필요 없이 대신 셸의 파일 이름 자동 완성 기능을 사용할 수 있기 때문입니다.

답변4

짧은 답변(자세한 내용은 읽어 보세요):

  1. 편집기에서 파일 열기
  2. 별도의 터미널/bash 세션으로 이동
  3. 원본 파일 백업
  4. 달리기f=forgotsudo.oops; cd ~; [ -e $f ] || mkfifo $f; sudo sh -c "cat $f >> [filename]"; rm $f
  5. 편집기에서 파일을 에 저장하면 ~/forgotsudo.oops아래와 같이 원본 파일에 컨텍스트가 추가됩니다.sudo

이 과정은 복잡해 보이지만 거의 한 문장으로 처리할 수 있습니다.

이 작업을 자주 수행하는 경우 재사용성을 위해 스크립트를 작성할 수 있습니다.

자세한 내용은:

제가 새로운 솔루션이라고 생각하는 것을 처음 시도하는 것이기 때문에 경험이 더 많은 사람이 이를 확인할 수 있기를 바랍니다. 이전에 언급한 적이 없기 때문에 실제로 작동할 것이라고는 기대하지 않았습니다. 어떤 이유로 제가 생각하지 못했던 내용이 끔찍한 아이디어로 판명되면 삭제하겠습니다.

스크립트( )에 포함시켜서 좀 더 견고하게 만들 수 있을 것 같습니다 forgotsudo.

fifo 접근 방식의 장점은 편집기가 외부 명령을 통해 필터링할 수 있는지 여부에 관계없이 거의 모든 편집기에서 작동한다는 것입니다.

자세한 설명:

파일(예: /etc/abcdef.conf)을 저장하려고 시도했지만 파일을 저장하는 것을 잊었다는 것을 알게 된 후 sudoBash에서 다른 터미널(또는 tmux 창 등)을 엽니다.

sudo cp /etc/abcdef.conf /etc/abcdef.conf.bak # back up the original file
cd ~ # or somewhere with write permissions
mkfifo forgotsudo.oops
sudo cat forgotsudo.oops >> /etc/abcdef.conf ; rm forgotsudo.oops

비록 fifo는추가~/forgottosudo.oops실제 파일로 편집기로 전환하고 편집기의 일반적인 "저장" 기술을 사용하여 버퍼를 저장합니다. 예를 들어:

  • 빔에서는:w! ~/forgotsudo.oops
  • Nano에서 Ctrl+ O로 파일 이름을 변경하고 ~/forgotsudo.oopsY를 선택하여 다른 파일 이름으로 저장한 다음 다시 Y를 선택하여 "덮어쓰기"를 확인합니다.

이 경우 수정된 버퍼는 다음과 같습니다.추가의원본 파일에. 그런 다음 편집기를 종료하고 파일을 다시 편집한 sudo다음 '중복' 원본 파일을 삭제할 수 있습니다. 물론 이는 중복된 콘텐츠로 인해 "차단된" 일부 프로세스에서 파일을 사용하지 않는다고 가정합니다.

"잘못된 데이터"에 민감한 파일인 경우 물론 단일 파일을 사용하여 >기존 파일을 새 콘텐츠로 덮어쓸 수도 있습니다. 단 sudo cat ..., 일단 실행되면 원본 파일 내용은 파기되므로 주의하시기 바랍니다. 어떤 이유로든 편집기에서 버퍼가 손실되면 파일이 파괴되거나 비워집니다. 반드시 백업을 하세요.

참고 사항: 덮어쓰거나 추가하든 원본 파일 권한은 저장 후 변경되지 않습니다.

관련 정보