web-dev-qa-db-ja.com

多くのマシン間でのbash設定の自動伝播?

SSHを介して多くのマシンにコンソール接続する必要があります。 Linux、Mac、モバイルデバイス、仮想マシンを含みます。 1日に10台以上のマシンにログインする必要がある場合があります。

プロンプト(PS1)、履歴制御、エイリアス、その他の便利な設定など、個人的な.bashrcまたは.bash_profile設定を楽しんでいます。しかし、これらの設定を多くのマシンで維持することは、苦痛に他なりません。

それで、誰かがこれを自動化する方法を知っているなら?私の「motherworld-PC」から設定を「運ぶ」のが最善でしょう。

8
exebook

https://serverfault.com/a/400782 で説明されているアプローチを使用できます。

これを行うには、PermitLocalCommandとLocalCommandを使用する必要があります。

解決策は大丈夫だと思いますが、リモートマシンの.bashrcがローカルの.bashrcをリモートの.bashrcにscpすることで置き換えられるため、気に入らなかった。また、思った通りに動かせませんでした。

別の解決策は、で説明されているように、gitを使用してすべてのドットファイルを管理することです。

http://blog.smalleycreative.com/tutorials/using-git-and-github-to-manage-your-dotfiles/

しかし、私にとっての大きな問題は、ドットファイルを使用して各サーバーをセットアップする必要があることです。ドットファイルを各サーバーに展開する時間(および忍耐)があったとしても、1つの問題があります。

複数のユーザーが同じログインを使用して同じサーバーにログインするコンテキストを想像すると、サーバーのデフォルトをmyのデフォルトに変更するのは不公平です。

次に...


それで、私はそのための独自のソリューションを開発しました。あなたがそれを気に入って、それが役立つことを願っています:

次のことを行う必要があります。

  • .bashrc の https://Gist.github.com/ で(プライベート)要点を作成します。
    • 要旨を作成するには、githubにログインする必要があります
    • .bashrc環境変数のパスワードなどの機密情報に注意してください。とにかく、その種の情報はそもそもそこにあるべきではありません。
    • Gistファイルに付けた名前は使用しないでください。これを[〜#〜] gistname [〜#〜]と呼びます。リモートディレクトリで見つからない可能性のある名前を選択してください。 「.bashrc」という名前を付けないでください。 =)適切な名前はmycustombashrc.shです。
    • 要旨を保存した後、<>ボタンをクリックしてGistの未加工バージョンのリンクを取得します。このリンク、raw Gistリンクまたは[〜#〜] rawgistlink [〜#〜]

次に、ローカルの.bashrcの最後に次のように入力します。

function customssh(){
  ssh $@ -t 'cd $HOME ; 
  wget --quiet -N "RAWGISTLINK" ;
  cp GISTNAME .'$USER'bashrc  ; 
  bash --rcfile $HOME/.'$USER'bashrc'

}

GISTNAMEとRAWGISTLINKを置き換えることを忘れないでください

今すぐ実行

source ~/.bashrc

そして、customsshを使用します(通常のsshは引き続き使用できます)

customssh mylogin@remoteserver

今すぐエイリアスの1つを試してください!

ノート

  • はい、これはおそらくすべてのログインでGistファイルをダウンロードしますが、私を信じてください、それは本当に速いです。心配しないでください。
  • 共有された.bashrc を更新するには
    • Gist URLに移動し、変更を加えます(または、ローカルの.bashrcをコピーします)。
    • 次に、カスタム関数を更新して、RAWGISTLINKをnewRAWGISTLINKに置き換えます(GistリンクとGISTNAMEは同じですが、ファイルに変更を加えると、生のGistリンクが変更されます)。
    • source ~/.bashrcを実行します。 それだけです!リモートサーバーで何も変更する必要はありません!
  • 私のソリューションは完全にUbuntuベースですが、他のディストリビューションで機能させるには、調整が必要になる場合があります。
  • おそらく、githubのGistの代わりにGistのような他のサービスを使用できます。 Pastebinはその一例ですが、他にもあります。それは完全に可能ですが、私はまだそれを試していません。
  • また、他の場所からcustombashrc.shをwgetすることもできます。たとえば、パブリックWebサーバー。
  • 別のオプションとして、ローカルマシンがsshを介してインターネットに表示されている場合は、ファイルをローカルサーバーから(パブリックアドレスを使用して)リモートサーバーにscpすることができます。ローカルマシンがルーターやファイアウォールの背後に隠れないことを想定するのは難しいため、このソリューションは使用しませんでした(私の場合、私はルーターの背後にいます)
  • たぶん、ubuntuのさまざまなバージョンで問題を見つけることができますが、私はまだそれらに遭遇することができませんでした。

このアプローチの最も良い点は、リモートサーバーでは何も変更されず、ローカルマシンではほとんど労力をかけずに、Gistを使用すると、任意のサーバーでローカル.bashrcのすべての楽しみを得ることができることです。

また、sshの代わりにcustomsshを使用すると、これを簡単に「無効」にすることができます。

7
Onilton Maciel

これに対する一般的なアプローチの1つは、ドットファイルをgithubまたは別のバージョン管理システムに配置することです。それらを簡単に更新できるだけでなく、何かを元に戻す必要があるときに行った変更の履歴を保持できます。

「githubのドットファイル」と「バージョン管理のドットファイル」をグーグルですばやく検索すると、便利に見えるページがいくつか見つかりました。

これを設定した後、各サーバーでcronjobを使用して更新を自動化するか、.bash_profileに「gitpull」を追加するだけで済みます。

3
Doug Harris

最近この質問に出くわし、.bashrcファイルを複数のホストにプッシュする方法についての回答を追加したいと思いました。

この架空の例では、.bashrcファイルを必要とする18台の「vcn」サーバーがあります。幸運にも標準化された命名規則がある場合は、bashの中括弧を利用し、ループを使用して、数値で追加されたサーバー名を繰り返すことができます。次に、ローカルの.bashrcファイルをそれらにscpします。

for vcn in r1-vcn{1..9} r2-vcn{1..9}; do scp ~/.bashrc $vcn:/home/user/; done;
1
jrsdav

次の手順を実行すると、bashrcをダウンロードしたり、使用しているサーバー上のものを変更したりすることなく、bashrcを使用できます。ファイルはソースにカールします。つまり、ファイルはメモリ内にのみ存在し、そのセッションに対してのみ存在します。

source <(curl -s -A '' https://somedomain.com/bashrc);
1
Xenobius Bishop

rsync のようなものはおそらくあなたのニーズに合うでしょう。それが不可能な場合は、Dropboxを使用して各デバイス間でファイルを同期し、ローカルで同期されたファイルとそれ以外の場合に必要な場所との間にシンボリックリンクを作成します。

1
int_541

このツールが便利な場合もありますが、これらがすべて自分のマシンであり、共有マシンではない場合は、おそらくgithubが最適です。

sshrcはsshと同じように機能しますが、リモートでログインした後に〜/ .sshrcをソースします。

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

これを使用して、環境変数の設定、関数の定義、およびログイン後のコマンドの実行を行うことができます。これは非常に単純で、サーバー上の他のユーザーに影響を与えることはありません。ユーザーがsshrcを使用している場合でも同様です。より高度な構成については、読み続けてください。 https://github.com/Russell91/sshrc

1
RussellStewart

あなたが直面している痛みは非常に一般的です。私は同じ問題を抱えており、問題を解決するためにBaseと呼ばれるこのフレームワークを思いつきました。このフレームワークは、Bash設定を複数のマシン間で同期させるという基本的な問題を解決するだけでなく、設定、スクリプト、およびライブラリをチームメンバー間、複数のチーム間、または企業レベルで共有するためのシンプルで強力な方法も含みます。あなたは1つのために働いています。

ここでそれをチェックしてください: https://github.com/codeforester/base

0
codeforester