Como edito remotamente arquivos via ssh?

83

Eu tenho que editar alguns arquivos colocados em algum servidor que eu poderia acessar via ssh.

Eu preferiria editar esses arquivos personalizados vimna minha estação de trabalho (não tenho direitos para alterar as vimconfigurações no servidor remoto). Às vezes eu gostaria de editar um arquivo com sublime textou outro editor de GUI.

É claro que posso baixar esses arquivos, editá-los localmente e enviá-los de volta ao servidor. Existe uma solução mais elegante?

Tear
fonte

Respostas:

66

Você pode fazer isso montando a pasta remota como um sistema de arquivos usando sshfs. Para fazer isso, primeiro alguns pré-requisitos:

# issue all these cmds on local machine
sudo apt-get install sshfs 
sudo adduser <username> fuse

Agora, faça o processo de montagem:

mkdir ~/remoteserv    
sshfs -o idmap=user <username>@<ipaddress>:/remotepath ~/remoteserv

Depois disso, basta ir para a pasta montada e usar seu próprio vim personalizado local.

shivams
fonte
4
Sem surpresa, a etapa de instalação falhará nas distribuições que não são debbaseadas e, portanto, não possuem apt-get. (Nesse caso, yumou zypperpodem estar presentes.) Eles também exigem raiz na máquina local, que pode ou não estar disponível. (Isso não quer dizer que é uma má solução, mas ele vem com um grande pré-requisito.)
Ulrich Schwarz
5
OK. Descobri isso. Tudo isso é feito na máquina local. No caso do OS X, é necessário instalar osxfusee sshfs. Eles podem ser instalados com o homebrew ( brew install sshfse brew cask install osxfuse, ou a partir de pacotes obtidos no osxfuse.github.io
inspirednz,
95

Você pode fazer isso scpassim:

vim scp://user@myserver[:port]//path/to/file.txt

Observe as duas barras //entre o servidor e o caminho, necessárias para resolver corretamente o caminho absoluto. (A primeira barra é sintática, enquanto a segunda barra especifica o diretório raiz do usuário remoto, como de costume. Para iniciar no diretório inicial, é necessário [:port]/~/path/to/file.txt.) [:port]É opcional.

Isso é tratado pelo plug-in padrão netrw.vim do vim . Vários outros protocolos são suportados.

FloHimself
fonte
6
Sim, o arquivo é recuperado para um arquivo temporário, carregado no servidor ao salvar.
FloHimself
1
Obrigado. No entanto, ocorreu um erro ao tentar salvar o arquivo:E382: Cannot write, 'buftype' option is set
Loom
2
Você pode tentar :set buftype=""​no vim.
FloHimself
2
Além disso, o vim lerá ~/.ssh/confige resolverá hosts remotos com vim scp://[host]/path.
Jangari 03/04
2
@stillanoob::e scp://...
FloHimself
6

Dependendo do que você quer dizer quando diz que não tem os direitos para editar as configurações do Vim, pode haver uma maneira de usar o Vim no servidor da maneira que desejar. Se você não pode alterar seu usuário .vimrc(porque está efetuando login como um usuário compartilhado, por exemplo), mas ainda pode criar arquivos, crie-o como um arquivo chamado, digamos, Loom.vimrce ligue para o Vim usando a -uopção:

vim -u ~/Loom.vimrc file_to_edit

Você ainda pode usar um alias: alias vim='vim -u ~/Loom.vimrc'permitirá que você use o Vim da maneira usual e ainda carregará seu .vimrcarquivo personalizado . Esse alias não persistirá após o logout, portanto você não precisa se preocupar com mais ninguém usando acidentalmente seu Vim personalizado.

Tom Potts
fonte
2

Dependendo de quantos arquivos e que tipo de arquivo você espera editar, talvez não seja exatamente isso que você deseja fazer aqui, mas acho que vale a pena mencionar. Se você precisar editar arquivos em um servidor remoto, mas quiser usar tudo o que possui em sua própria estação de trabalho, comece a pensar em usar algum tipo de sistema de Controle de Revisão em suas máquinas. Dessa forma, você pode modificar suas cópias locais em sua própria máquina usando o software de sua escolha, confirmar as alterações e apenas atualizar as cópias locais na máquina de destino. Além de editar os arquivos com qualquer software que você se sinta confortável, você tem o valor agregado de ter um histórico de alterações relacionadas a cada arquivo, o que é sempre bom.

Aqui está uma lista de software de controle de revisão , apenas por precaução.

jimm-cl
fonte
Você está sugerindo o uso de algo como confirmar as alterações git, enviá-las para algo como githube puxar as alterações githubpara a sua máquina local, para fazer alterações lá?
Alpha_989 30/05
Isso é viável para alterações de código complexos .. mas para simples código muda talvez .. o que @FloHimself ou shivams mencionado é mais fácil de implementar ..
alpha_989
1

Para expandir a resposta do Sr. Potts: Você também pode fazer o acima, depois colocar algo como isto em .bash_profile (ou o que seu shell usar):

if [[ "$(who mom loves | awk ' { print $1 }' )" == "Loom" ]]; then 
         alias vim="vim -u ~/.Loom_vimrc"  
         fi  

onde Loom é o seu ID de usuário original no qual você faz login.

Se você está entrando como uma conta compartilhada (e não como uma conta individual, então sudo -, Von Neuman pode ter piedade de sua alma por estar perdido.

Eu teria colocado isso em um comentário, mas não consegui obter o código formatado.

Petro
fonte
0

Se você tiver uma sessão do vim em execução, use

:silent e scp://user@myserver[:port]//path/to/file.txt

A :silentfrente suprimirá a Press Enter to Continuemensagem

e

e scp://user@myserver[:port]//path/to/file.txté o Excomando mode para editar o arquivo remnote.

Testado com a BitVise SSHDexecução no Windows 10 e o uso do VIM no Ubuntu 16.04

alpha_989
fonte
Apenas uma nota que este suprime o Press Enter to Continuepara o carregamento inicial, mas não para qualquer posterior:w
Sparhawk