Abra um arquivo com su / sudo dentro do Emacs


174

Suponha que eu queira abrir um arquivo em uma sessão existente do Emacs usando suor sudo, sem cair para um shell e executando sudoeditor sudo emacs. Uma maneira de fazer isso é

C-x C-f /sudo::/path/to/file

mas isso requer uma ida e volta cara através do SSH . Existe uma maneira mais direta?

[EDIT] @JBB está certo. Eu quero poder invocar su/ sudosalvar e abrir. Seria bom (mas não o ideal) autorizar novamente ao salvar. O que estou procurando são variações find-filee save-bufferque podem ser "canalizadas" através de su/ sudo.


5
Eu só queria observar que o tramp vem instalado por padrão desde o emacs22, para que a maioria das pessoas possa fazer o Cc Cf / sudo :: / path-to / file sem problemas.
— labyrinth

1
Obrigado pela sudoeditmenção. Muito útil.
— tshepang 23/07

6
Cc Cf deve ser Cx Cf?
— James.Xu

Respostas:


64

O bom do Tramp é que você só paga pela viagem de ida e volta ao SSH quando abre o primeiro arquivo. O Sudo armazena em cache suas credenciais e o Emacs salva um identificador, para que os arquivos subsequentes abertos pelo sudo levem muito menos tempo.

Também não encontrei o tempo extra necessário para economizar carga. É rápido o suficiente, IMO.


3
Espere um segundo ... Com que frequência o cache expira?
— 22420 Chris Conway

20
O Tramp não ida e volta via SSH, ele usa um subshell .
— Teddy

Meu argumento foi que você paga o custo do primeiro arquivo aberto e não de nenhum dos outros.
— EfForEffort


18

Se você usar helm, helm-find-filessuporta a abertura de um arquivo como root C-c r.


Isso funciona, mas parece persistente em uma sessão, todos os arquivos são abertos e salvos como raiz posteriormente. Não há nada na documentação M-x helm-find-files C-c ?que diga como retornar ao modo normal de abertura como usuário. Fazer C-c rnovamente não o impede.
— Liam

@ Liam Ainda consigo abrir o arquivo como um usuário normal quando uso esse recurso.
— Qudit

É muito estranho - alguns arquivos são bons, outros tentam abrir como root. Eu matei a senha root com comandos emacs sudo -ke, em seguida, solicita a senha. Eu reiniciei o Emacs e isso não eliminou o problema. Eu procurei .emacs.de encontrei algumas referências ao vagabundo, então as apaguei. Agora parece melhor, mas não tenho certeza se estou livre disso.
— Liam

15

Não é realmente uma resposta para a pergunta original, mas aqui está uma função auxiliar para facilitar um pouco a rota tramp / sudo:

(defun sudo-find-file (nome do arquivo)
  "Como encontrar o arquivo, mas abre o arquivo como raiz."
  (interativo "FSudo Find File:")
  (let ((tramp-file-name (concat "/ sudo ::" (nome do arquivo de expansão-nome do arquivo)))))
    (localizar-arquivo nome-arquivo-tramp)))

Eu acho que o Emacs Starter Kit tem algo parecido esk-sudo-edit.
— mrmagooey


4

Seu exemplo não inicia o ssh, pelo menos não com a minha versão do TRAMP ("2.1.13-pre"). O arquivo find e o save-buffer funcionam muito bem.


Você pode ter suas credenciais em cache. Quando o TRAMP inicia, ele passa por 10 a 15 segundos de material SSH. (Eu tenho 2.1.13-pre também.)
— Chris Conway

Você tem certeza? Quero dizer, ele deveria estar iniciando um subshell, mas não uma sessão SSH para o host local. Demora cerca de 5 segundos para executar toda a detecção automática do TRAMP pela primeira vez.
— Jfm3 19/09/08

Bem, não, não tenho certeza. Devo dizer que há 10-15 segundos de material TRAMP (talvez SSH). Não estou preocupado com o SSH em si, mas com o atraso na inicialização. Quanto tempo esse material de inicialização persiste?
— 21430 Chris Conway

Deve levar apenas mais de um segundo na primeira vez em que você faz isso. Ou seja, mesmo se você salvar / sudo :: file, excluir o buffer e abrir / sudo :: file2, o arquivo2 deverá abrir rapidamente. e Mantém o shell aberto e armazena em cache os resultados de todos os seus sniffing.
— Jfm3 20/09/08

Mas as credenciais estão armazenadas em cache: (1) para esse processo do Emacs ou (2) para todos os processos do Emacs? E eles expiram: (a) quando o Emacs fecha, (b) após algum período de tempo fixo (horas? Dias? Semanas?) Ou (c) após a reinicialização do sistema?
— Chris Conway

3

Eu recomendo que você use comandos de aconselhamento. Coloque esta função no seu ~ / .emacs

(defadvice ido-find-file (after find-file-sudo activate)
  "Find file as root if necessary."
  (unless (and buffer-file-name
               (file-writable-p buffer-file-name))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

Apenas para apontar o óbvio, isso requer que você esteja usando ido-find-filepara encontrar arquivos.
— tripleee

1

(funciona apenas localmente. Precisa ser atualizado para funcionar corretamente via tramp)

Um pouco estendida a resposta de Burton:

(defun sudo-find-file (file-name)
"Like find file, but opens the file as root."
(interactive "FSudo Find File: ")
(let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name))))
(find-file tramp-file-name)))


(add-hook 'dired-mode-hook
    (lambda ()
      ;; open current file as sudo 
      (local-set-key (kbd "C-x <M-S-return>") (lambda()
        (interactive)
        (message "!!! SUDO opening %s" (dired-file-name-at-point))
        (sudo-find-file (dired-file-name-at-point))
      ))
    )
)

0

Ugh. Talvez você possa abrir um shell no Emacs e no exec sudo emacs.

O problema é que você provavelmente não quer apenas abrir o arquivo. Você deseja poder salvá-lo mais tarde. Portanto, você precisa que seus privs raiz persistam, e não apenas exista para abrir o arquivo.

Parece que você quer que o Emacs se torne seu gerenciador de janelas. É inchado o suficiente sem isso. :)


11
Ha ha você disse inchaço. Emacs costumava parecer enorme. Agora, em comparação com as pegadas em tempo de execução de Java, Ruby e provavelmente uma pilha de outras coisas, parece bastante enxuto. Independentemente disso, acho que a pergunta de Chris chega a um uso perfeitamente legítimo do Emacs.
— jfm3

1
Você chegou antes de mim. Eu uso esse modelo de forma consistente. No login, inicio uma sessão do Emacs para itens gerais, uma para acesso ao SU (como root) e uma ou mais para desenvolvimento de software (geralmente por projeto, mas nem sempre). Faz isso há anos. Apenas funciona.
— precisa saber é o seguinte

você pode esclarecer como fazer isso: "abrir um shell no Emacs e emacs sudo exec"
— johnbakers

1
@OpenLearner Sério, você realmente não quer fazer isso.
— Tripleee
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.