SSH를 사용할 때 .vimrc를 가져 오는 방법은 무엇입니까?


34

내 작업은 SSH를 사용하여 다양한 시스템에 연결 한 다음 vim을 사용하여 해당 시스템의 파일을 편집하는 경향이 있습니다. 문제는 .vimrc 파일을 지속적으로 복사해야한다는 것입니다. vim을 열고 설정을하지 않는 것은 매우 성가신 일입니다. 어디서나 수동으로 복사하지 않고 vim 설정을 기계에서 기계로 옮기는 것이 가능합니까?


@ duffbeer703 : 예, set background=dark또는 리눅스 배포판에 닿지 않고 사용자에게 전혀 방해 가 되지 않는set background=light 무언가 . </ sarcasm>
휴 버트 카리오

아직 답변을 읽지 않은 상태에서 ssh-agent 및 x-term을 전송할 수 있기 때문에 이론적으로 가능하다고 생각하지만 다른 한편으로는 ssh가 특별히 처리하고 미친 가장자리 케이스를 처리하는 여러 가지 해결 방법이 있다고 가정합니다. .
trysis

답변:


24

네 아픔이 느껴져. 버전 제어 (Subversion)에서 ~ /.* rc 파일을 모두 가지고 있으며 CVS를 사용하여 1998 년 시작한 이래로 훌륭하게 작동했습니다. 이를 수행하는 한 가지 방법은 홈 디렉토리에 서있을 때 이와 같은 모든 rc 파일을 체크 아웃하는 것입니다.

svn co svn+ssh://user@host/path/to/repo/trunk/home/user .
A    .signature
A    .vimrc
A    .bashrc
A    .screenrc
A    .psqlrc
[...]
Checked out revision 7645.

이렇게하면 svn update를 실행할 때 구성 파일이 다양한 컴퓨터에서 동기화 및 업데이트됩니다.


3
나는 이것이 얻을만큼 좋은 것 같아요. 비결은 다른 모든 컴퓨터에서 액세스 할 수있는 컴퓨터에 리포지토리를 설정해야한다는 것입니다. 안전한 네트워크 토폴로지를 사용하면 항상 쉬운 것은 아닙니다.
Apreche 2016 년

나는 최근에 이것을 시작했다, 그것은 훌륭하다. 나는 그것없이 어떻게 살아남 았는지 모른다.
richo

5
아마도 git 또는 다른 분산 버전 제어 시스템을 사용하십시오. 이 경우 구성 파일이 체크 아웃 된 시스템에 액세스하기에 충분합니다.
ptman

44

작업해야하는 각 서버에 .vimrc를 가져 오는 대신 로컬 vim에서 원격 파일을 편집 해보십시오.

vim / gvim에서 다음을 실행하십시오.

:e scp://remoteuser@server.tld//path/to/document

또는 다음과 같이 vim을 시작하십시오.

vim scp://remoteuser@server.tld//path/to/document

그러면 파일이 이음새없이 제자리에 열리고 (실제로는 로컬로 파일이 복사 됨) 저장하면 편집 된 파일이 서버로 다시 전송됩니다.

ssh 비밀번호를 요청하지만 ssh 키를 통해 간소화 할 수 있습니다.

다른 사람들이 언급 했듯이이 방법의 유일한 단점은 컴퓨터에서 직접 작업 할 때와 같이 경로 / 파일 구성을 얻지 못한다는 것입니다.

자세한 내용 은 다음 자습서를 확인하십시오 .


scp : // 힌트의 경우 +1이지만 파일을 편집 할 때마다 경로를 복사해야하는 경우이 솔루션이 약간 번거로울 수 있습니다.
chmeee 2016 년

1
네, 너무 성가 시네요. 원하는 파일을 찾기 위해 원격 컴퓨터를 많이 파고 들어야하며 종종 sudo 권한으로 편집해야합니다.
Apreche 2016 년

+1 이것은 정말 효과적입니다. 고마워 :)
Darragh Enright

당신이 로그인에서 로컬 서버에 다음 메인 서버 (login.example.com)에 로그인해야하는 경우 (top.secret.example.com)가 있습니다
PUK

원격 파일 구조를 로컬 디렉토리에 마운트하면 (예 : fusermount) 제대로 작동합니다.
relet

18

다음과 같이 로그인 할 때마다 bash 스크립트를 자동으로 복사하도록 만들 수 있습니다.

#!/usr/bin/env bash

scp ~/.vimrc $1:
ssh $1

예를 들어 ssh_vim이라고 부를 수 있습니다. 이상적인 솔루션은 아니지만 문제를 해결할 것입니다.

이미 있는지 먼저 확인하도록 개선 할 수 있습니다. 동일한 시스템에서 ssh를 항상 실행하지 않는 경우 다른 시스템의 scp에서 파일을 가져 오도록 스크립트를 변경할 수 있습니다.

편집 1

관련 참고 사항에서 sshfs를 사용하여 원격 시스템의 파일 시스템을 마운트 할 수도 있습니다. 그렇게하면 환경과 도구 (.vimrc뿐만 아니라)의 이점을 얻고 쉘 완료 (scp : //를 사용하지 않는)가 있습니다.

편집 2

방금 scp : //를 사용하여 .vimrc 파일을 소스로 사용할 수 있음을 알았습니다.

:source scp://you@your_computer//yourpath/.vimrc

이것은 vim 명령 줄에서 작동하지만 현재 자동화 방법을 모르겠습니다. '-u'스위치 나 .vimrc 또는 $ VIMINIT에서는 작동하지 않는 것 같습니다.

편집 3

찾았어요! 이 작업을 수행하여 참조 호스트에서 가져온 .vimrc로 vim을 시작할 수 있습니다.

vim -c ':source scp://you@your_computer//yourpath/.vimrc'

옵션 '-c'는 vim을 시작한 직후 명령을 실행합니다.

입력을 피하기 위해 선택한 쉘에 별명을 작성할 수 있습니다. bash에서는 다음과 같습니다.

alias vim="vim -c ':source scp://you@your_computer//yourpath/.vimrc'"

2
당신이 ssh'ing하는 컴퓨터 경우에만 작동 으로는 다시는 ssh'ing하는 컴퓨터에 연결할 수 에서 . 컴퓨터가 NAT 뒤에있는 경우와 같이 항상 그런 것은 아닙니다.
trysis

10

공개 키 인증을 사용하는 경우 다음에서 사용할 수 있습니다 ~/.ssh/config.

Host *
   PermitLocalCommand yes
   LocalCommand bash -c 'scp -P %p %d/.vimrc %u@%n: &>/dev/null &'

ssh명령 의 호출을 엉망으로 만들지 않기 때문에 위에서 제안한 스크립트 트릭보다 낫습니다 (추가 매개 변수 등을 지정할 때 등).


이게 최선이다. 나를 위해 ssh 사용자 이름이 내 노트북의 사용자 이름과 다르기 때문에 로 변경 %u@%n:해야했습니다%r@%n:
Moshe

4

몇 가지 솔루션 :

1) 홈 폴더의 NFS 공유를 생성하고 여러 위치에 매핑합니다.

2) 작은 스크립트를 작성하여 .vimrc를 ID / 키 파일로 연결중인 서버로 푸시하십시오. 다음과 같이 보일 수 있습니다 (의사 코드).

connectString = arg0  #username@ipaddress

scp -i ~/.ssh/indentity connectString:~/ ~/.vimrc
ssh -i ~/.ssh/indentity connectString

1
ssh 키는 일반 텍스트 비밀번호 문제를 해결합니다.
LiraNuna

NFS 공유를 생성하기 위해 어떤 도구를 사용 하시겠습니까?
Wadih M.

@LiraNuna-내 'duh'순간이 있기 전에 나를 붙잡아 내 게시물을 편집 한 것 같습니다. @Wadih-NFSD는 일반적으로 기본적으로 'nix 시스템에 설치됩니다. 기본적으로 NFS 공유를 마운트 할 수도 있습니다 (보통).
moshen 2016 년

1
NFS 공유는 좋은 생각이지만 특히 방화벽이있는 환경이나 프로덕션 서버를 수정하지 않으려는 위치 (특히 NFS를 사용하는 위치)에서 이러한 기능을 배포하는 기능이 제한 될 수 있습니다.
ericslaw

당신은 올바른 ericslaw입니다. 단일 네트워크 내에서 여러 대의 컴퓨터라고 가정했습니다.
moshen 2016.

4

sunny256과 정확히 동일하지만 SubVersion 대신 git을 사용하십시오.

모든 컴퓨터에 공통 인 파일로 하나의 기본 분기를 유지하고 새 컴퓨터마다 하나의 분기를 갖습니다.

그렇게하면 대부분의 컴퓨터에서 거의 같은 파일을 가질 수 있지만 여전히 혼란스럽지 않습니다.


+1 작은 질문 : 서브 버전의 공통 파일에 외부 정의를 사용하는 것이 더 좋은지 궁금합니다. 이렇게하면 한곳에서 가져와 모든 지점으로 가져올 수 있습니다
Eugene Yarmash

3

나는 이것이 오래된 스레드라는 것을 알고 있지만 한 가지 방법은 파일 시스템을 퓨즈에 마운트하는 sshfs를 사용하는 것입니다. 로컬 vim은 모든 편집 작업을 수행하므로 .vimrc를 복사 할 이유가 없습니다.

이것은 원격 서버에서 실행 해야하는 모든 명령에 대해 다른 터미널을 열어야한다는 단점이 있지만 편집을 위해서는이 방법이 가장 좋습니다.

또한 시스템 클립 보드를 사용할 수 있다는 이점이 있습니다.


2

https://github.com/andsens/homeshick 을 사용하여 내 도트 파일을 관리하고 github에 저장하고 있습니다.

Homeshick은 100 % bash로 작성되었으며, / home / 디렉토리를 포함하는 git repos 인 "castles"를 관리하는 데 도움이됩니다. 기존 도트 파일을 리포지토리로 이동하고 심볼릭 링크로 바꾸라는 명령이 있습니다. 리포지토리의 모든 파일을 새 컴퓨터의 홈 디렉토리로 심볼릭 링크합니다.

따라서 일반적인 아이디어는 도트 파일을 버전 제어 시스템에 유지하고 실제 경로에서 심볼 파일과 심볼 링크합니다. 이렇게하면 리포지토리를 홈 디렉토리에서 시작할 필요가 없으며 추가하고 싶지 않은 많은 파일이 포함됩니다.


링크에서 정보를 추가 할 수 있습니까? 링크가 끊어지면 답변이 향상되고 정보가 제공됩니다.
Dave M

1
나는 몇 가지 조작과 추론을 설명했다. 설명서를 복사 할 때 가치가 없었습니다.
Aaron McMillin

1

나와 같은데 여러 가지 이유로 개발 머신 (가상 머신도 포함)이 많은 경우 ssh 키, 스마트 bash_profile 및 선택한 RCS를 결합 할 수 있습니다.

두 번째로 nfs / samaba / sshfs를 사용합니다. 한 가지 단점은 항상 네트워크에 액세스 할 수없는 경우 필요한 항목 (비행, Wi-Fi, 방화벽, 라우팅 문제 등)에 액세스 할 수 없다는 것입니다. 동기화 된 컴퓨터에 동시에 연결할 수있는 것은 아니지만 정보를 공유하고 싶습니다.

다음은 인터넷에서 많은 아이디어를 빌리는 방법에 관한 것입니다.

.bash_profile은 이와 같은 것을 가질 수 있습니다.

$HOME/bin/shell_ssh_agent

나는 두 곳에서 이것을 얻었지만 지금 그것에 대한 링크를 찾을 수 없습니다. shell_ssh_agent 파일 :

#!/bin/bash

SSH_ENV=$HOME/.ssh/environment

#echo "starting"

function start_agent {
    #echo "reaping agents"
    killall ssh-agent
    #echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
    #echo succeeded
    chmod 600 ${SSH_ENV}
    . ${SSH_ENV}
    /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
    . ${SSH_ENV}
    #echo "sourced ssh env"
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent > /dev/null || { start_agent; }
else
    start_agent;
fi

이제 처음 로그인하면 키를 설정합니다. 로그 아웃하고 로그인하면 인생이 더 쉬워졌습니다.

모든 스크립트를 RCS에 넣으면 개발 시스템을보다 쉽게 ​​동기화 할 수 있습니다. 나는 자식을 사용한다. git을 통한 인증은 ssh를 통해 이루어 지므로 ssh 키도 여기에서 도움이됩니다. 이 시점에서 nfs와 같은 것을 사용할 수 있습니다. 아래에 언급 한 이유로 여전히 RCS의 팬이 될 것입니다.

유스 케이스는

  1. 처음 로그인하면 키가 설정됩니다.
  2. RCS가 설정되지 않은 경우 개인 스크립트를 확인하십시오 (필요한 경우 업데이트 / 병합, 원한다면 .bash_profile의 일부 일 수도 있음).
  3. vimrc, 특수 스크립트 등을 편집하고 커밋
  4. 다른 컴퓨터에 로그인하면 업데이트 / 병합 / 체크 아웃을 수행하십시오. 이렇게하면 모든 것이 동기화됩니다. 즉, 때로는 넘어져서 원하지 않는 파일을 더 이상 복사하지 않습니다.
  5. 부작용으로 RCS의 힘을 얻을 수 있습니다. 때로는 스크립트 나 구성을 바람직하지 않게 변경하고 롤백 등을 수행해야합니다.

다음에 시도하고 싶은 것은 초기 로그인 / 설정을 새 컴퓨터에 복사 한 makefile에 래핑하는 것입니다. 그런 다음 makefile은 키, RCS 등을 설정하는 작업을 수행 할 수 있습니다. 여기에는 약간의 오버 헤드가 있지만 많은 기계를 설정하면 다음과 같습니다.

  1. 시간 절약
  2. 개발 시스템의 구성 및 개인 스크립트를보다 쉽게 ​​동기화
  3. 스크립트 및 구성 변경 관리

1

로그온 한 모든 서버 목록이있는 makefile을 사용하고 로컬 시스템을 변경할 때 makefile을 사용하여 'make'가 자동으로 실행되어 변경 사항이나 플러그인이있는 모든 서버를 업데이트합니다.


스크립트를 작성하는 멋진 방법 인 것 같습니다. Make는 하나의 파일을 다른 파일로 만들 때 훌륭하지만 모든 규칙이 " .PHONY."인 상황에서 사용하고 싶지 않습니다.
Anthony

1

sshrc 는이 문제를 해결합니다. .vimrc를 ~ / .sshrc.d /에 넣고 export VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"`/.sshrc에 추가 합니다.


1

SSHd 내장 구성 옵션을 비표준 방식으로 사용하여 ssh 때마다 .vimrc 파일기본적으로 전송할 수있는 간단한 도구를 작성했습니다 .

추가 svn, scp, copy/paste, 등이 필요하지 않습니다.

간단하고 가벼우 며 지금까지 테스트 한 모든 서버 구성에서 기본적으로 작동합니다.

https://github.com/gWOLF3/viSSHous


0

변수 VIMINIT 사용하기 :

export VIMINIT='set number'

그리고 그것을 원격 서버로 전달 :

ssh remoteuser@remoteserver -o SendEnv=LC_VIMINIT -t 'export VIMINIT=$LC_VIMINIT && bash'

.bash_profiles 또는 .bashrc를 사용하면 쉽습니다.

export VIMINIT='
set number
'

export LC_VIMINIT=$VIMINIT

sshh (){
ssh -o SendEnv=LC_VIMINIT $1 -t 'export VIMINIT=$LC_VIMINIT && bash'

이제 연결을 위해 sshh를 사용하여 원격 서버에서 vim을 실행하십시오.

sshh remoteuser@remoteserver

원하는 경우 플러그인을 원격 서버로 가져올 수도 있습니다.

export LC_VIMINIT="
set number
set nocompatible
filetype off
set rtp+=~/.[USER]_vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'


set shell=/bin/bash
call vundle#end()
filetype plugin indent on
"

export VIMINIT=$LC_VIMINIT

sshh (){
        if [[ $1 ]]; then
                ssh-copy-id $1 &>/dev/null &&
                rsync -lzr --partial --del ~/.[USER]_vim ${1}: &&
                ssh -o SendEnv=LC_VIMINIT $1 -t 'export VIMINIT=$LC_VIMINIT && bash';
        else
                echo "Provide remote user@host";
        fi
}

0

나는 같은 상황이지만 " .vimrc" 만이 아닙니다 . 나도 같은 것들을

  • bash 구성, 프롬프트 및 기능
  • ssh 구성 및 권한 파일
  • 쉘 스크립트는 내가 좋아하는 것입니다.
  • 물론 내 vimrc뿐만 아니라 일부 vim 함수와 구문 강조 파일도 있습니다.

내 솔루션 (원래 "dist"로 시작한 30 년 전)은 야간 크론을 설정하여 내가 작업하는 모든 컴퓨터에 최소 홈 구성을 재 동기화하여 야간 업데이트되도록합니다.

그렇게하면 내가 작업하는 다른 모든 컴퓨터가 최신 상태로 유지됩니다! '계정'목록에 새 컴퓨터를 추가하고 단일 컴퓨터 배포를 수행하여 시작할 수 있습니다.

많을 필요는 없으며 작게 시작하여 갈수록 복잡해집니다. 당신이 30 년 후에 상상할 수 있듯이 나의 배포는 이제 다소 복잡하므로 여기서는 다루지 않겠습니다. 말할 필요도없이 일부 네트워크의 다른 구성, 홈 정리 (예 : 휴지통, 캐시 파일), 홈 권한이 모두 올바른지 등을 위해 다른 구성을 교체하는 등의 작업을 수행 할 수 있습니다.

참고 하나의 '홈'컴퓨터에서 나머지 모든 컴퓨터로 암호가없는 ssh 로그인 만 허용하며 다시는 다시는 허용되지 않습니다! 모든 크로스 ssh는 비밀번호로 보호됩니다.


-1

특정 키를 누를 때 EXRC 변수와 같은 경로와 환경을 설정할 수있는 EXPECT 스크립트를 고려할 수 있습니다. 누군가 비슷한 스크립트를 게시하기 전에 너무 오래 걸리지 않아야합니다.

서버 팜이 수십 개 (수천 개 이상) 이상인 경우 '처녀'상자에 환경을 쉽게 설정하는 것은 진정한 생명의 은인입니다.

상자에 로그인하면 처음으로 홈 디렉토리가 생성됩니다!


기대는 무언가를하기에 매우 취약한 방법입니다. 다른 OS, 아키텍처 또는 업그레이드로 인해 중단 될 수 있습니다. 작지만 시간이 지남에 따라 확장 할 수없는 것이 좋습니다.
안토니

-1

다음과 같은 bash oneliner로 실현되었습니다. 프로세스 대체로 수행되므로 임시 파일이 작성되지 않습니다.

ssh -t user@host '
bash --rcfile <(
    echo -e ' $(cat <(echo "function lvim() { vim -u <(echo "$(cat ~/.vimrc|base64)"|base64 -d) \$@ ; }") \
                    ~/dotfiles/{.bashrc,sh_function,sh_alias,bash_prompt} \
                    <(echo -e alias vim=lvim) | \
                    base64 
               ) ' \
    |base64 -d)'

https://gist.github.com/blacknon/a47083f3bbbd0374998bdf7e3b3396cc

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.