web-dev-qa-db-ja.com

SSHを実行するときに.vimrcを使用するにはどうすればよいですか?

私の仕事では、SSHを使用してさまざまなマシンに接続し、vimを使用してそれらのマシン上のファイルを編集する傾向があります。問題は、.vimrcファイルを常にコピーする必要があることです。 vimを開いて設定がないのは非常に面倒です。手動でどこにもコピーせずに、vim設定をマシン間で持ち運ぶことはできますか?

35
Apreche

あなたの痛みが分かります。私はすべての〜/.* rcファイルをバージョン管理(Subversion)で管理しています。1998年にCVSを使用して開始して以来、うまく機能しています。これを行う1つの方法は、ホームディレクトリに立っているときに、次のようにすべての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を実行すると、構成ファイルもさまざまなコンピューター間で同期および更新されます。

25
sunny256

作業する必要のある各サーバーに.vimrcを導入する代わりに、ローカルvimからリモートファイルを編集してみませんか。

Vim/gvimで、次を実行:

:e scp://[email protected]//path/to/document

または、次のようにvimを起動します。

vim scp://[email protected]//path/to/document

これにより、ファイルが所定の位置に継ぎ目なく開かれ(実際にはファイルがローカルにコピーされます)、保存すると、編集されたファイルがサーバーに送信されます。

Sshパスワードを要求しますが、これはsshキーを使用して効率化できます。

他の人がこの方法の唯一の欠点を述べたように、マシンで直接作業する場合のようにパス/ファイルの競合が発生しないことです。

詳細については、 次のチュートリアルを確認してください

46
Tom Feiner

次のように、ログインするたびに自動的にコピーするbashスクリプトを作成できます。

#!/usr/bin/env bash

scp ~/.vimrc $1:
ssh $1

たとえば、ssh_vimと呼ぶことができます。これは理想的なソリューションではありませんが、問題を解決します。

既にそこにあるかどうかを最初にチェックするように改善できます。同じマシンから常にsshを実行しているわけではない場合は、スクリプトを変更して、scpから別のマシンからファイルを取得できます。

EDIT1

関連する注意点として、リモートマシンのファイルシステムをsshfsでマウントすることもできます。そうすれば、環境とツール(.vimrcだけでなく)のメリットが得られ、(scp://を使用しなくても)シェルを完了できます。

編集2

次のように、scp://を使用して.vimrcファイルを入手できることがわかりました。

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

これはvimコマンドラインから機能しますが、現時点では自動化する方法がわかりません。 '-u'スイッチ、.vimrc、$ VIMINITでは機能しないようです。

EDIT

見つけた!これを行うと、参照ホストから取得した.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'"
18
chmeee

公開鍵認証を使用している場合は、これを~/.ssh/config

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

sshコマンドの呼び出しを台無しにしないため、上記のスクリプトトリックよりも気に入っています(追加のパラメーターを指定する場合など)。

12
omribahumi

Sunny256とまったく同じ答えですが、Subversionの代わりにgitを使用します。

すべてのコンピューターに共通のファイルを含む1つのメインブランチを保持し、新しいコンピューターごとに1つのブランチを用意します。

これにより、ほとんどのコンピューターでほぼ同じファイルを使用でき、混乱することはありません。

4
Johan

いくつかの解決策:

1)ホームフォルダーのNFS共有を作成し、複数の場所にマッピングします。

2)小さなスクリプトを作成して、ID /鍵ファイルで接続しているサーバーに.vimrcをプッシュします。次のようになります(疑似コード):

connectString = arg0  #username@ipaddress

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

私はこれが古いスレッドであることを知っていますが、それを行う1つの方法は、Fuseを介してファイルシステムをマウントするsshfsを使用することです。ローカルvimがすべての編集を行うため、.vimrcをコピーする理由はありません。

これには、リモートサーバーで実行する必要のあるコマンドのために別のターミナルを開く必要があるという欠点がありますが、編集にはこの方法が最適です。

また、システムのクリップボードを使用できるという利点もあります。

3
exussum

私は https://github.com/andsens/homeshick を使用してドットファイルを管理し、githubに保存しています。

Homeshickは100%bashで書かれており、/ home /ディレクトリを含む単なるgitリポジトリである「城」を管理するのに役立ちます。既存のドットファイルをリポジトリに移動し、シンボリックリンクに置き換えるコマンドがあります。そして、リポジトリ内のすべてのファイルを新しいマシンのホームディレクトリにシンボリックリンクします。

したがって、一般的な考え方は、バージョン管理システムにドットファイルを保持し、実際のパスからそれらにシンボリックリンクを張ることです。このように、リポジトリはホームディレクトリから開始する必要がなく、追加したくない大量のファイルを含める必要がありません。

2
Aaron McMillin

sshrc この問題を解決します。 .vimrcを〜/ .sshrc.d /に置き、次にexport VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"を `/.sshrcに追加します。

1

私は、SSHdの組み込み構成オプションを非標準的な方法で使用することにより、sshのたびに.vimrcファイルをネイティブに転送できるようにするための簡単なツールを作成しました。

追加なしsvnscpcopy/pasteなどが必要です。

これはシンプルで軽量で、これまでにテストしたすべてのサーバー構成でデフォルトで機能します。

https://github.com/gWOLF3/viSSHous

1
Glenn W

私がログオンするすべてのサーバーのリストが含まれているmakefileを使用し、ローカルマシンで変更を行うと、すべてのサーバーを変更またはプラグインで更新するmakefileを使用して「make」が自動的に実行されます。

1
Lloyd Moore

私のようで、さまざまな理由で多くの開発マシン(仮想マシンも)を持っている場合は、sshキー、スマートbash_profile、および任意のRCSを組み合わせることができます。

次にnfs/samaba/sshfsを使用します。 1つの欠点は、常にネットワークにアクセスできないと、必要なもの(飛行、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を使用します。 gitによる認証はsshを介して行われるため、sshキーもここで役立ちます。この時点で、nfsのようなものを使用できたことに注意してください。以下に述べる理由により、私はまだRCSのファンです。

ユースケースは

  1. 初回ログイン、キーの設定
  2. rCSが設定されていない場合は、個人用スクリプトを確認してください(必要に応じて更新/マージしてください。必要に応じて、.bash_profileの一部にすることもできます)。
  3. vimrc、特別なスクリプトなどを編集してコミットする
  4. 他のマシンにログインすると、更新/マージ/チェックアウトを実行します。これにより、すべてが同期されます。つまり、たまに踏みにじったり、したくなかったファイルをコピーする必要はもうありません。
  5. 副次的な利点として、RCSの機能を利用できます。スクリプトまたは構成に好ましくない変更を加えることがあり、ロールバックなどを行う必要があります。

次に試したいのは、最初のログイン/セットアップを、新しいマシンにコピーするメイクファイルにラップすることです。その後、makefileは、キー、RCSなどを設定するジョブを実行できます。明らかに、ここにはいくつかのオーバーヘッドがありますが、多くのマシンを設定することになると、次のようになります。

  1. 時間節約
  2. 開発マシンの構成と個人用スクリプトの同期を維持するのが簡単
  3. スクリプトと設定への変更の管理。
1
rev

特定のキーストロークを押したときにパスと環境(EXRC変数など)を設定できるEXPECTスクリプトを検討する場合があります。誰かが同様のスクリプトを投稿する前に、長すぎてはいけません。

サーバーファームの数が数十(数千と考えてください)を超える場合、「新しい」ボックスで環境を簡単にセットアップすることは、実際の命の恩人です

多くの場合、ボックスにログインすると、初めてホームディレクトリが作成されます。

0
ericslaw

変数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
Apoc

私も同じ状況ですが、「.vimrc "。私も

  • bashの構成、プロンプト、機能
  • ssh設定および認証ファイル、
  • 便利なシェルスクリプト。
  • もちろん私のvimrcだけでなく、いくつかのvim関数と構文強調表示ファイルも。

私の解決策(もともと「dist」で30年前に開始されました!)は、夜間cronをセットアップして、作業中のすべてのマシンに最小限のホーム構成をrsyncして、毎晩更新されるようにすることです。

そうすれば、私が使用している他のすべてのマシンが最新の状態に保たれます。新しいマシンを「アカウント」リストに追加するだけで、1台のマシンを配布して起動できます。

それほど大きくする必要はありません。小さなものから始めて、それをより複雑にすることができます。 30年後に想像できるように、私のディストリビューションはかなり複雑になっているので、ここでは説明しません。言うまでもなく、一部のネットワークで一部の構成を他のネットワークにスワップアウトしたり、ホームクリーンアップ(ゴミ箱、キャッシュファイルなど)を行ったり、ホームの権限がすべて正しいことを確認したりするなどの処理も​​行います。

注1つの「ホーム」マシンから残りのすべてのマシンへのパスワードなしのsshログインのみを許可します。二度と戻ることはできません!クロスsshはすべてパスワードで保護されています。

0
anthony