É possível salvar como sudo do nano depois que você se esqueceu de rodar como sudo?

44

Na maioria das vezes, edito um arquivo com o nano, tento salvar e recebo um erro de permissão porque esqueci de executá-lo como sudo. Existe alguma maneira rápida de me tornar sudo sem ter que reabrir e editar novamente o arquivo?

    
por Kit Sunde 23.04.2011 / 12:45

2 respostas

33

Não, você não pode conceder a um programa em execução permissões que ele não tem quando ele é iniciado. Essa seria a falha de segurança conhecida como "escalação de privilégios".

Duas coisas que você pode fazer:

  1. Salve em um arquivo temporário em / tmp ou em qualquer lugar, feche o editor e, em seguida, despeje o conteúdo do arquivo temporário no arquivo que estava editando. %código%. Observe que não é recomendado usar sudo cp $TMPFILE $FILE para isso por causa da alteração na propriedade e das permissões de arquivo que provavelmente causará, você apenas deseja substituir o conteúdo do arquivo e não o próprio espaço reservado para o arquivo.
  2. Conte ao editor com Ctrl + z , altere a propriedade ou as permissões do arquivo para poder escrever nele e use mv para voltar ao editor e Salve . Não esqueça de corrigir as permissões!

¹ Alguns editores podem fazer isso iniciando um novo processo com permissões diferentes e transferindo os dados para esse processo para salvar. Veja, por exemplo, esta questão relacionada para obter outras soluções em editores avançados que permitem escrever o buffer de arquivo para um pipe de processo. O Nano não tem a capacidade de iniciar um novo processo ou passar dados para outros processos, por isso é deixado de fora desta parte.

    
por 23.04.2011 / 12:50
7

Eu apenas tentei nano , e o que eu achei mais surpreendente é que ele nem sequer avisa que o arquivo é somente leitura quando você começa a tentar editar o arquivo. ( UPDATE: Aparentemente o nano 2.2 avisa; o 2.0 não. )

Aqui está um script (básico) que faz isso.

Ele verifica se você pode editar o arquivo e, se não puder, ele executa "nano" como root.

/ usr / local / bin / edit (ou ~ / bin / edit )

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"

E um comando que chamei de view para que você possa evitar o prompt se souber que não fará nenhuma alteração.

/ usr / local / bin / view (ou ~ / bin / view )

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Já existe um programa chamado view que faz parte do Vi / Vim, então sinta-se à vontade para sugerir um nome melhor.
(Mas eu acho que uma implementação completa deste programa tornaria o view do Vi redundante.)

Versões completas

por 26.04.2011 / 03:20