Abra o arquivo via SSH e Sudo com Emacs

114

Eu quero abrir um arquivo dentro do Emacs que está localizado em um servidor remoto, com sudo no servidor. Posso abrir arquivos locais com sudo via Tramp assim:

C-x C-f /sudo::/home/user/file

Mas eu quero usar sudo no servidor:

C-x C-f /sudo::user@server/home/user/file

Mas isso me dá poderes sudo na minha máquina local, ele pede minha senha sudo na máquina local. Existe uma maneira de usar o sudo no servidor?

BTW: Emacs não está instalado no servidor

Fernando briano
fonte
você não pode comandar como root diretamente no servidor?
Chmouel Boudjnah
2
Tenho um usuário com privilégios de sudo, mas não a senha de root.
Fernando Briano

Respostas:

185

A partir do Emacs 24.3, um análogo do antigo multi: sintaxe foi colocado em camadas sobre a tramp-default-proxies-alistabordagem moderna , o que significa que você pode mais uma vez realizar vários saltos sem qualquer configuração anterior. Para obter detalhes, consulte:

C-hig (tramp) Ad-hoc multi-hops RET

Com a nova sintaxe, cada 'salto' é separado por |. O exemplo no manual é:

C-xC-f /ssh:bird@bastion|ssh:you@remotehost:/path RET

Que conecta primeiro como bird@bastion, e de lá parayou@remotehost:/path

/ su: ou / sudo: em hosts remotos

Você também pode usar esta sintaxe para sudo / su para fazer root (ou, claro, qualquer outro usuário) em um host remoto:

C-xC-f /ssh:you@remotehost|sudo:remotehost:/path/to/file RET

Importante : certifique-se de especificar o nome do host explicitamente: em sudo:remotehost:vez de sudo::(veja abaixo).

Como ele ainda usa o mecanismo de proxy por baixo, tramp-default-proxies-alistagora deve incluir o valor("remotehost" "root" "/ssh:you@remotehost:")

O que significa que o proxy /ssh:you@remotehost: será usado sempre que você solicitar um arquivo como root@remotehost.

root é o usuário padrão para esses métodos, mas é claro que você também pode mudar para um usuário não root com:

C-xC-f /ssh:you@remotehost|sudo:them@remotehost:/path/to/file RET

Sempre especifique o nome do host remoto explicitamente

Você provavelmente está acostumado a usar sudo::ou su::e omitir o nome do host. Se você estiver hospedado no host local, tudo bem, mas se estiver pulando para um servidor remoto, você deve especificar o nome do host para cada salto - mesmo que seja o mesmo do salto anterior. Sempre use sudo:hostname:ou su:hostname:com hosts remotos.

A armadilha aqui é que sudo:: se realmente aparecer para o trabalho - no entanto , quando você faz que o host para a entrada de proxy dinâmico será o nome do host que você se originou a partir de em vez do anfitrião você conectado. Isso não só parecerá confuso (já que o host errado será exibido nos caminhos do arquivo), mas também significará que qualquer tentativa subsequente de usarsudo:: em seu host local será transferida por proxy para o servidor remoto! (e o proxy provavelmente também seria destruído se você fizesse a mesma coisa em um segundo servidor, causando mais problemas).

Resumindo, não use ::quando você multi-hop!

phils
fonte
4
e agora adicionado ao wikemacs também wikemacs.org/index.php/TRAMP . Obrigado phils, funciona muito bem.
Ehvince
1
Acabei de encontrar esta resposta e funciona muito bem ... exceto que tenho uma abreviação de nome de host definida em um arquivo .ssh / config. Quando digito /sudo:hostname:/etc/hosts, recebo o que você esperava, mas quando digito /sudo:abbrev:/etc/hosts, recebo a mensagem "O abrev do host parece um host remoto, o sudo só pode usar o host local". Isso pode ser corrigido?
rogerl
2
rogerl: Eu também tenho .ssh/configentradas e não tenho problemas /ssh:abbrev|sudo:abbrev:/etc/hostspara usar as abreviações do meu nome de host. Parece que você não está pulando primeiro para o host.
phils
@phils Talvez eu deva postar isso como uma nova pergunta. No entanto: meu arquivo de configuração se parece com Host r User rlipsett Hostname odlinux IdentityFile ~ / .ssh / id-rsa.pub e my tramp-default-proxies-alistparece estar correto. No entanto, o comportamento que descrevi acima persiste. Meu arquivo de configuração está errado de alguma forma?
rogerl
Ainda não está claro para mim se você está realmente tentando usar /sudo:abbrev:/etc/hostso que fez no comentário anterior (que está errado, conforme mencionado) ou se está usando o correto /ssh:abbrev|sudo:abbrev:/etc/hosts. Seu arquivo de configuração ssh provavelmente está bom, já que você pode evidentemente usá-lo de outra forma.
phils
21

Atualização : Embora esta resposta tenha resolvido o problema original, ela foi escrita para emacs 20 ou 21. Para emacs 24, eu recomendo que você use a resposta de phils porque ela oferece mais explicações e está atualizada.


Acho que nomes de arquivos multi-hop no tramp é o que você está procurando.

O primeiro salto seria ssh e o segundo seria sudo.


Atualização: as versões recentes do emacs oferecem suporte a vários saltos usando proxies:

(add-to-list 'tramp-default-proxies-alist ("my-sudo-alias" nil "/ssh:user@ssh-host"))

Em seguida, invoque abrindo:

/sudo:my-sudo-alias:file-on-ssh-host
Dave Bacher
fonte
Esta parece ser a solução, mas eu obtenho: "o método multi não é mais suportado" Você pode me indicar um manual atualizado?
Fernando Briano
Mx info, Cs tramp :) Você pode precisar definir um host falso como o destino do seu sudo e adicioná-lo a tramp-default-proxy-alist.
Dave Bacher
2
Não consegui executá-lo em minha configuração (erro 255?), Mas a seguinte linha em .emacs funciona: (set-default 'tramp-default-proxies-alist (quote (("my-sudo-alias" nil " / ssh: user @ ssh-host: "))))
mês de
A resposta atualizada não define "recente", tem elisp inválido e não funciona mesmo quando você a corrige. Estou em uma versão estável do emacs lançada mais de um ano após a atualização da resposta.
Michael Wolf
1
A verdadeira resposta a partir de 2014 / 24.3 é a seguinte resposta, usando "multi-hops ad-hoc"
TomRoche de
7

Tive alguns problemas com a resposta selecionada. No entanto, funcionou quando adicionei esta linha ao .emacs:

(add-to-list 'tramp-default-proxies-alist '(".*" "\\`root\\'" "/ssh:%h:"))

E então executei o seguinte:

/sudo:ssh-host:file-on-ssh-host

Foi um pouco confuso porque em um ponto fui solicitada a senha "root", mas inserir minha senha de usuário me concedeu acesso. Também funciona universalmente em todos os hosts da rede. Além disso, ainda posso fazer isso para não ser root:

/ssh:ssh-host:file-on-ssh-host

Usuário1
fonte
3
Isso não estava funcionando para mim. Parece que no Ubuntu, pelo menos com a versão 23.2.1 do Emacs e a versão 2.1.18-23.2 do tramp isso não funciona. Isso funciona, no entanto: info.solomonson.com/content/…
gaizka
(set-default 'tramp-default-proxies-alist (quote ((". *" "\` root \\' "" / ssh:% h: "))))
gaizka
1
Não consigo fazer com que nenhuma das soluções acima funcione (adicionar à lista ou definir padrão). O primeiro faz com que o Emacs bloqueie na inicialização e o segundo me dá "Host abc.xyz.com' looks like a remote host, sudo 'só pode usar o host local" assim que eu insiro os segundos dois pontos em "/sudo:abc.xyz.com:". Ideias? Emacs 23.1.1 no Ubuntu 10.04 LTS.
SabreWolfy
3

Da página da web de configuração de multi-saltos tramp

 (add-to-list 'tramp-default-proxies-alist
                   '(nil "\\`root\\'" "/ssh:%h:"))
      (add-to-list 'tramp-default-proxies-alist
                   '((regexp-quote (system-name)) nil nil))

Então qualquer

C-x C-f /sudo:remote-host:/file

irá abrir o arquivo usando sudo após logado com o mesmo nome de usuário do usuário executando o emacs, mas na máquina remota.

vampolo
fonte
-12

Você tem que entrar no servidor primeiro, então você tem que rodar o emacs localmente.

Ou você pode usar NFS com no_root_squash, ou pode tentar com servidor / cliente emacs, embora eu não tenha ideia do que pode acontecer (não uso emacs eu mesmo)

Dan Andreatta
fonte
Tentei, mas não consigo acessar os arquivos como root com sshfs, ao montá-lo como usuário regular. Acho que é um problema de configuração.
Dan Andreatta
Como Hassan observou, no_root_squash deve ser usado com cuidado.
Dan Andreatta
6
-1 por não responder à pergunta. -1 por sugerir NFS em vez de SSH. -1 por sugerir no_root_squash. -1 por sugerir o cliente Emacs, que normalmente usa soquetes de domínio Unix, para um problema de comunicação remota. -1 para blethering sobre o Emacs sem usá-lo.
ceving 02 de