web-dev-qa-db-ja.com

sshconfigでの正規表現マッチング

Srv1.domain.com、srv2.domain.com、...、srv50.domain.comという名前のサーバーがたくさんあります。

ssh srv1でこれらのサーバーに接続できるようにしたい

.ssh/configに50個の構成エントリを入れたくない

Host srv1
HOSTNAME srv1.domain.com
USER amac
IdentityFile /home/amac/.ssh/id_rsa

私が好きなのは正規表現マッチングです。これにより、次のようなものを書くことができます。

HOSTNAME (srv[0-9]*).domain.com
Host \1
USER amac
IdentityFile /home/amac/.ssh/id_rsa

これは可能ですか?たぶん、「srv(。*)」のすべてのインスタンスをsrv\1.domain.comに変換するbashエイリアスを作成することによって、\ 1は正規表現と一致するparanthesisの部分文字列に対応しますか?

ありがとう。

2

これは、DNSによって最もよく解決される問題のように聞こえます。これを/etc/resolv.confに追加します:

search domain.com

DNSルックアップにドットが含まれていない場合1 または、NXDOMAIN応答を返すと、その検索値が追加された別のDNSルックアップが行われます。

例:

ssh srv1を実行すると、srv1.domain.comのDNSルックアップが行われます。

ssh srv1.dc1を実行すると、DNSルックアップはsrv1.dc1に対して行われ、NXDOMAINが返されます。自動フォローアップDNSルックアップはsrv1.dc1.domain.com用になります。

空白で区切られたその行に複数の検索ドメインを追加でき、そのうちの1つがAレコードを返すまで、リストされた順序で試行されます。2

1.)この値は構成可能であり、短い名前のドット数よりも少なくする必要があります。デフォルト値は1であり、ホストの形式がsrv1.dc1.domain.comであるサイトの場合は1より大きく設定する必要があります。これにより、dc1トップレベルドメインのルートサーバーへの無駄なリクエストが回避されます。

2.)またはAAAAレコード。

2
Ladadadada

これは、OpenSSH 5.5以降でうまくいくはずです。

Host *.*
  Hostname %h

Host *
  Hostname %h.domain.com
  IdentityFile /path/to/keyfile.pem

最初のルールは通常のドメイン名と一致し、ドメイン名を渡すだけです。 2番目のルールは、単一のWordホストを処理し、domain.comを最後に追加します。

これの副作用の1つは、anotherdomain.comへのssh呼び出しの場合でも、sshがdomain.comのIdentityFileを使用しようとすることです。しかし、それは重要ではないと思います。

5
Bryce Drennan

ProxyCommandを使用して、コマンドラインで指定されたホスト名でregexを使用できます。

Host srv*.domain.com
    User amac
    ProxyCommand nc $(sed -e "s/.domain.com//" <<< "%h") %p
    IdentityFile /home/amac/.ssh/id_rsa

これで、ssh srv23.domain.comsrv23に接続します。

HostNameを指定する必要はないことに注意してください。

2
rnbguy

opensshはパターンをサポートしますが( http://linux.die.net/man/5/ssh_config を参照)、一致への参照はサポートしません(AFAIK)。

質問で使用したのとほぼ同じように、ワイルドカードを指定できます。

Host srv*.domain.com
  User amac
  IdentityFile /home/amac/.ssh/id_rsa

完全なホスト名を指定する必要がない場合は、前述のdnsトリックを実行する(およびホスト行をsrv *に変更する)か、次のようにシェル関数を作成します。

ss() {
  if [ -z "$1" ]; then
    echo "specify a server #, eg ss 10"
  else
    echo "ssh'ing to srv$1.domain.com"
    ssh srv$1.domain.com
  fi
}

そしてそれを次のように使用します:

ss 10

DNSを変更するよりも簡単で、srv01.someotherdomain.comにアクセスしたいときに問題が発生することはありません。

1
jwilkins

指定するときに問題がありました

Host srv*
  Hostname %h.domain.com

完全なホスト名を使用して接続できなくなりました:

$ ssh srv677.domain.com
ssh: Could not resolve hostname srv677.domain.com.domain.com: Name or service not known

Domain.comを2倍にすることに注意してください。

短い形式と完全な形式の両方のホスト名を介して接続できるようにするために、次のトリックを実行しました。

Host srv* !srv*.domain.com
    Hostname %h.domain.com
    User amac
    IdentityFile /home/amac/.ssh/id_rsa

Host srv*.domain.com
    User amac
    IdentityFile /home/amac/.ssh/id_rsa

またはさらに良い解決策(この回答に触発された https://superuser.com/a/46947 ):

Host *.domain.com srv* vrs*
    User amac
    IdentityFile /home/amac/.ssh/id_rsa

Host !*.domain.com srv* vrs*
    Hostname %h.domain.com

すべてのオプションを2回コピーする必要がないため、より優れています。

0
Ashark