É possível salvar como sudo no nano depois que você se esqueceu de executá-lo?

50

Muitas 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 precisar reabrir e reeditar o arquivo?

Kit Sunde
fonte
a fusão com esta pergunta foi sugerida. Basicamente, o mesmo problema, mas vim. Estou considerando a mesclagem ... embora também esteja considerando o fato de que instruções específicas do vim não funcionam nano.
Xenoterracide
11
@xenaterracide - Eu acho que a pergunta vim é um caso especial deste, uma vez que ele realmente tem uma solução e parece que o caso geral não tem nenhum. Também não tenho certeza, depende de você. :)
Kit Sunde 24/04
Você pode fazer um mapeamento no seu .vimrc para chamar facilmente a função sudo tee: <pre> <code> "Permite gravar arquivos com privilégios de root cmap w !! w! Sudo tee%> / dev / null </pre> < / code>
jasonwryan
@xenoterracide: A resposta de Caleb sobre Nano é útil, então acho que devemos manter essa apenas sobre Nano.
23411 Mikel
11
@mikel Decidi que a fusão é inválida. nanonão é vim... e nenhuma nanosolução semelhante à vimse apresentou.
Xenoterracide

Respostas:

39

Não, você não pode dar a um programa em execução permissões que ele não possui quando é iniciado, isso seria a falha de segurança conhecida como 'escalonamento de privilégios' '.

Duas coisas que você pode fazer:

  1. Salve em um arquivo temporário em / tmp ou em qualquer outro lugar, feche o editor e despeje o conteúdo do arquivo temporário no arquivo que você estava editando. sudo cp $TMPFILE $FILE. Observe que não é recomendável usá-lo mvpara isso, devido à alteração na propriedade e nas permissões do arquivo que provavelmente causará; você só deseja substituir o conteúdo do arquivo e não o próprio espaço reservado para o arquivo.
  2. Coloque o segundo plano no editor com Ctrl+ z, altere a propriedade ou as permissões do arquivo para que você possa gravá-lo e use-o fgpara voltar ao editor e salvar. Não se esqueça de corrigir as permissões!

¹ Alguns editores conseguem fazer isso iniciando um novo processo com permissões diferentes e passando os dados para esse processo para salvar. Veja, por exemplo, esta pergunta relacionada para outras soluções em editores avançados que permitem gravar o buffer de arquivo em um canal de processo. O Nano não tem a capacidade de iniciar um novo processo ou passar dados para outros processos, portanto, fica de fora desta parte.

Caleb
fonte
Excelente. Obrigado Caleb. Acabei de encontrar este problema há cerca de 30 minutos. :)
boehj
2
@Caleb Você pode usar o comando tee de dentro vim para fazer o que você descreve::w !sudo tee
@hellojesus Truque brilhante. Se você quiser escrever isso como resposta, posso removê-lo do meu. Eu acho que outras pessoas que não sejam nano-usuários entram nessa situação e podem se encontrar aqui.
Caleb
4
Esta questão deveria ser sobre nano. Se começarmos a incluir respostas sobre o Vim aqui, qual é o objetivo dessa pergunta? Já temos a raiz do Tornando-se de dentro do Vim para Vim.
25411 Mikel
2
Salvar em um arquivo temporário em / tmp - Como salvar em arquivo temporário enquanto estiver dentro do nano?
Anand Rockzz
7

Eu apenas tentei nano, e o que achei mais surpreendente é que ele nem avisa que o arquivo é somente leitura quando você começa a tentar editar o arquivo. ( ATUALIZAÇÃO: Aparentemente, o nano 2.2 avisa; 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, 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 viewpara que você possa evitar a solicitação 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 viewque faz parte do Vi / Vim, portanto, fique à vontade para sugerir um nome melhor.
(Mas acho que uma implementação completa desse programa tornaria viewredundante o Vi .)


Versões completas

Mikel
fonte
11
Na verdade, você avisa. A pergunta seria então qual versão você está usando. Além disso, em sistemas baseados no Debian, o sistema de alternativas é mais adequado ao que você está sugerindo.
0xC0000022L
2
Para sua referência: [ Read ... lines (Warning: No write permission) ]é o que aparece logo acima das duas linhas de ajuda para os atalhos (parte inferior da tela). A versão Nano é 2.2.4.
0xC0000022L
Ah, isso não avisa no nano 2.0, que é o que eu estava testando.
Mikel
legal resolvemos isso :)
0xC0000022L 6/11