SSHで.vimrcを持ち込むにはどうすればよいですか?


34

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


@ duffbeer703:ええ、set background=darkまたはのset background=lightように Linuxディストリビューションには触れられ、ユーザーにとってまったく目立たないものです。</ sarcasm>
ヒューバートカリオ

まだ答えを読んでいないので、ssh-agentとx-termを転送できるので、これは理論的には可能だと思いますが、一方でsshによって具体的に処理され、クレイジーなエッジケースを処理するための複数の回避策があると思います。
トリシス

回答:


24

あなたの痛みが分かります。私はすべての〜/.* 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を実行すると、さまざまなコンピューター間で構成ファイルも同期および更新されます。


3
私はこれが得ると同じくらい良いと思います。秘Theは、他のすべてのマシンからアクセス可能なマシンにリポジトリをセットアップする必要があることです。安全なネットワークトポロジでは、必ずしも簡単ではありません。
アプレッシュ2009年

私は最近これを始めました、それは驚くべきことです。私はそれなしでどのように生き延びたのか分かりません。
リコ

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

1
ええ、これは面倒です。必要なファイルを見つけるために、リモートマシンを何度も探し回る必要があり、多くの場合、sudo特権で編集する必要があります。
アプレッシュ2009年

+1これは私にとって本当にうまくいきます。おかげで:)
ダラグEnright

あなたがそこログインからローカルサーバ(top.secret.example.com)にメインサーバ(login.example.com)にログインする必要がある場合があります
PUK

fusermountなどを使用して、リモートファイル構造をローカルディレクトリにマウントするとうまく機能します。
再送信

18

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

#!/usr/bin/env bash

scp ~/.vimrc $1:
ssh $1

たとえば、ssh_vimと呼ぶことができます。これは理想的な解決策ではありませんが、問題を解決します。

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

EDIT1

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

EDIT2

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

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

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

EDIT3

見つけた!これを行うと、参照ホストから取得した.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 ' ているコンピューターがssh' ているコンピューターに接続できる場合にのみ機能ます。これは、コンピュータがNATの背後にある場合など、常に当てはまるわけではありません。
トリシス

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キーはプレーンテキストのパスワードの問題を解決します。
リラナ

NFS共有を作成するにはどのツールを使用しますか?
ワディM.

@LiraNuna-私が「ダウ」の瞬間を持ち、私の投稿を編集する前にあなたが私を捕まえたようです。@Wadih-NFSDは通常、デフォルトで 'nixシステムにインストールされます。デフォルトでNFS共有をマウントすることもできます(通常)。
moshen 09年

1
NFS共有は良いアイデアですが、特にファイアウォールで保護された環境または
運用

あなたは正しいエリスローです。これらは単一のネットワーク内の複数のマシンであると仮定しました。
moshen 09年

4

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

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

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


+1小さな質問:Subversionの共通ファイルに外部定義を使用する方が良いのだろうか?あなたが一つの場所でそれらを持っており、任意の枝にフェッチすることができますこの方法
ユージンYarmash

3

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

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

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


2

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

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

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


リンクから情報を追加できますか?それは答えを改善し、リンクが壊れた場合に情報を提供します。
デイブM

1
操作と推論の一部を説明しました。ドキュメントをコピーしても価値がありませんでした。
アーロンマクミリン

1

あなたが私のような人で、さまざまな理由で多くの開発マシン(仮想マシンも)を持っている場合、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のパワーが得られます。スクリプトや設定に好ましくない変更を加えることがあり、ロールバックなどが必要です。

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

  1. 時間節約
  2. 開発マシンの構成と個人用スクリプトの同期を維持しやすい
  3. スクリプトと構成の変更の管理。

1

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


スクリプトを実行する派手な方法のようです。Makeは、あるファイルを別のファイルからビルドするときに優れていますが、すべてのルールが「.PHONY.」である状況では使用し
たくあり


1

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

追加のsvnscpcopy/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関数と構文強調表示ファイルもあります。

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

これにより、私が使用する他のすべてのマシンが最新の状態に保たれます!「アカウント」リストに新しいマシンを追加し、単一のマシン配布を行って開始することができます。

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

注1台の「ホーム」マシンから他のすべてのマシンへのパスワードなしのsshログインのみを許可します。クロスsshはすべてパスワードで保護されています。


-1

特定のキーストロークを押すと、パスと環境(EXRC変数など)を設定できるEXPECTスクリプトを検討できます。誰かが同様のスクリプトを投稿するまで、それほど長くはないはずです。

サーバーファームの数が数十(数千)を超える場合、「バージン」ボックスに環境を簡単に設定できることは、実際の命の恩人です。

多くの場合、ボックスにログインすると、初めてhomedirが作成されます!


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.