〜/ .ssh / configにSSHホストエントリを動的に生成する


9

sshでホストの山全体を管理する必要があります。ただし、特定のゲートウェイsshサーバーを介してのみアクセスできます。

私は私の中に以下を持っています~/.ssh/config

Host mygateway-www
Hostname www
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

しかし、私はこれらのマシンの多くに接続する必要があります。に何十ものエントリを置く代わりに、~/.ssh/configとにかく私はこのようなものを持つことができます:

Host mygateway-*
Hostname ???WHAT GOES HERE????
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

私はあなたが使用することができます知っている%h中でHostname、引数が、それは、ホスト名になります。私が本当に必要なのは、bashのようなある種の文字列置換${VAR%thingie}です。これは可能ですか?

回答:


24

これは、次のSSH構成ファイルで実行できます。

Host *
  ServerAliveInterval 120

Host gateway.somewhere.com
  User jdoe

Host gateway+*
  User jdoe
  ProxyCommand ssh -T -a $(echo %h |cut -d+ -f1).somewhere.com nc $(echo %h |cut -d+ -f2) %p 2>/dev/null
  ControlMaster auto
  ControlPath ~/.ssh/ssh-control_%r@%h:%p

次に、内部ホストに次のようにアクセスします。

ssh gateway+internalhost01.somewhere.com
ssh gateway+internalhost02.somewhere.com

右半分に選択する名前は、ジャンプホストによって解決できる必要があります。

異なるクラスのホストの異なるユーザーに手動でマッピングする必要がある場合に備えて、Userパラメーターを指定します。ControlMasterとControlPathは、SSH接続の再利用を許可するように指定されています。


6

HostNameはコマンドラインから取得されるため、手動で指定する必要はありません。

単に試してください:

Host *.domain  
  IdentityFile ~/.ssh/id_rsa  
  ProxyCommand ssh mygateway /usr/bin/nc %h 22

そのアプローチの問題は、ホスト名が非常に一般的である(たとえば、db1、www、mail2)ことですが、「db2」と呼ばれる別のマシンにSSHで接続する必要がある場合があるため、プロジェクトの接頭辞も必要です。したがって、ホストの接頭辞
Rory

2
したがって、実際にはDNSを再構成する必要があります。最も簡単な(しかし最も厄介な解決策)は、hostsファイルを変更することです。一方、ローカルDNSサーバーを常に.invalidドメインを使用してワークステーションに追加し、希望するホスト名を使用することもできます。
マーティンM.

前の+1。プロジェクトごとにサブドメインを作成します。DNSはあなたの人生を楽にするためのものです;)
Dan Carley


1

同様の問題があり、すべてのボイラープレートを生成するスクリプトを作成してしまいました。〜/ ssh / configを変更せず、〜/ ssh / config.inを変更してスクリプトを再実行します。


1
スクリプトを共有しますか?私はこれを行うことを考えましたが、堅牢で汎用的なソリューションは、正しく機能するために多くの作業を必要とするようです。あなたの解決策がまだそれでなくても、あなたがそれが正しいと思うこと、そしてそれをやり直した場合にあなたが違うことをすることを知ることは役に立つでしょう。
iconoclast、2015

私の考えは.ssh/config.d、各テンプレートが1つまたは複数のエントリを最終的に生成する各テンプレートのファイルを使用すること~/.ssh/configでした。ユニバーサル変数を含むファイルもありますが、各テンプレートには、上部にリストされているグローバル変数よりも優先される独自の変数を含めることができます。~/.ssh/configファイルは問題-限り、あなたは、あなたが保存したいと、それへの直接編集を作ったことがないようではないでしょうオンデマンドまたはスケジュール、それに生成することができます。
iconoclast

私のスクリプトは完全に文書化されていないので、作成する時間がない文書や例がなければ理解できないと思います。
Michael Hoffman

分かります。私が概説したアプローチに関するフィードバックは、特に私がいくつかの重要な必要性やユースケース、あるいはいくつかの大きな(または小さな)障害を見落としている場合は、感謝されます。
iconoclast

1
それはすばらしいアプローチだと思います。おそらく、私が使用したアプローチよりも少しわかりやすくなっています。いくつかのホスト宣言をメモリに読み込んでから、いくつかの非ホスト宣言を読み込みます。非ホスト宣言は、別のホストが存在するまで、現在のグループの各ホストに適用されます。また、グロビングの使用を含め、ホストをファイルで複数回宣言することもできます。最後に、これまでに作成してきたことをすべて書き出します。
Michael Hoffman

1

ホスト名のオーバーライドをHostname宣言で直接指定することを無視し、代わりに実行時に決定します。これをの一部として評価し、コマンドで参照するためProxyCommandに使用%hしてこれを行います(%pポートを22としてハードコーディングする代わりに使用します)。

Host mygateway-*
   #Hostname ???WHAT GOES HERE????
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc $(echo %h|sed 's/^mygateway-//') %p

より一般的なスタンザを使用することもできます。これにより、aなしで任意のホストをそのまま-、または一致する別のスタンザとして-指定できますが、anyを指定する一般的な方法があります<gateway>-<target>

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh $(echo %h|cut -d - -f1) nc $(echo %h|cut -d - -f2-) %p

さらに、SSHクライアントの新しいバージョンでは、(netcat)[-W host:port]と同じ機能を直接実行するオプションがサポートされていますnc。そのため、変更したものを使用できます。

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh -W $(echo %h|cut -d - -f2-):%p $(echo %h|cut -d - -f1)

もちろん、ホストの有限リストがある場合は、いつでも実行できます。

Host host1 host2 host3 hostN
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc %h %p

お役に立てれば!


0

同じセットアップのクライアントがあり、DSSHを使用して問題を解決しました。
特にDSSHを使用すると、ゲートウェイホストを介してリモートホストに透過的にログインできます。

ユースケース

  • 「ena」ログインが必要なCiscoルーターから構成パラメーターを収集する
  • 終了ステータスを維持しながら、PermitRootLoginを直接rootとして(su-とパスワードを自動的に入力して)無効にしたサーバーにログインします。
  • 高度なロギングなどのカスタムロジックを追加する
  • ターゲットサーバーに到達するためにいくつかの接続をトンネルします

5
〜/ .ssh / configでできることのために、Javaを使用するランダムなサードパーティのsshクライアントを使い始めたくありません。
ロリー・

リンクが死んでいる
iconoclast

ソフトウェアソースはGithubにあります:github.com/digmia/dssh
Guest
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.