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.

Chris Conway
fonte
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.

EfForEffort
fonte
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.

Qudit
fonte
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)))
Burton Samograd
fonte
Eu acho que o Emacs Starter Kit tem algo parecido esk-sudo-edit.
mrmagooey
5

Pelo menos para salvar, um pacote sudo-save foi escrito exatamente para esse tipo de problema.

Francois G
fonte
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.

jfm3
fonte
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))))
anquegi
fonte
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))
      ))
    )
)
alex_1948511
fonte
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. :)

JBB
fonte
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