SSH構成ファイルの実行可能スクリプトからHostNameを取得する方法は?


10

特定のクラスターから任意のコンピューターに頻繁にsshする必要があります(クラスター内のすべてのマシンは同一です)。ただし、クラスター内の使用可能なマシンのセットは頻繁に変更されるため、使用可能なクラスターから任意のホスト名を返すスクリプトがあり、要件に一致します(オンライン、正しいOSの実行など)。

また、認証にKerberos(GSSAPIAuthentication)資格情報転送を使用していることに注意してください。

今、私はを使用してsshしssh `get_host`ます。代わりに実行したいと思いssh clusterます。既知のホスト名を使用すると、次のように簡単になります/ssh/config

Host cluster
    HostName static_host.cluster.domain.tld
    GSSAPIAuthentication yes
    GSSAPIDelegateCredentials yes

HostNameスクリプトを使用して動的に選択するにはどうすればよいですか?(または、SSHには目的の機能をサポートする別の方法がありますか?)次のようなことをしたいのですが、うまくいきません。

Host cluster
    HostName `get_host`   # This does not work
    ...

Grawityは、またはを使用してProxyCommandホスト名を取得し、ssh接続を転送するスクリプトを作成できることを示しました。ただし、これはKerberos資格情報を転送しません。これに関するヘルプも歓迎します。netcatsocat

編集:

Kerberosを使用してこれを行うことはできません(受け入れられた回答のコメントを参照)。そのため、コマンドライン引数を動的に書き換えるエイリアスssh-wrapperとして、このスクリプトを使用sshしていsshます。堅牢ではありませんが、私にとってはうまくいきます。

#!/bin/bash

# Mapping between host aliases and dynamically-generated hostname
declare -A MAP
MAP[cluster]=`gethost`

# Find and replace on all positional args
args=$*
for key in ${!MAP[@]}; do
    replace=${MAP[$key]}
    args=`echo ${args} | sed "s/\(^\|[[:space:]]\)${key}\(\$\|[[:space:]]\)/${replace}/"`
done

# Execute using called-name if not this script
if [ "ssh-wrapper" != "`basename $0`" ]; then
    exec $0 ${args}
# Otherwise, assume ssh and execute
else
    exec ssh ${args}
fi

サーバー障害に関する関連質問。
マイケル

回答:


6

~/.ssh/config

Host cluster
    ProxyCommand ~/bin/cluster-connect

~/bin/cluster-connect

#!/bin/bash
socat stdio tcp:$(get_host):22

ありがとう。これは(またはnetcat $(get_host) 22)接続に最適です。しかし、私のkerberosクレデンシャルを渡していないようです。私が持っているGSSAPIAuthentication yesGSSAPIDelegateCredentials yes下のHost cluster私の中で.ssh/configのProxyCommand通じIルートはない場合、ファイル、およびホスト名が明示的に指定された場合、彼らは動作しますが、。考え?質問も修正します。
デビッドB.

私はあなたがそれを達成できるとは思わない- ssh正しいチケットを取得するためにターゲットホスト名を知っている必要があり、それを動的に提供する方法ssh $(get_host) "$@"はありません)。それはあり、クラスタ内のすべてのサーバーが同じKerberosプリンシパルを持っている場合は動作しますが、私は誰もが今までそれをしないと思います。
-grawity

残念ながら、センスがあります。動的な検索/置換を行うクイックラッパーを作成しました(質問に追加)。いくつかのシナリオで壊れますが、私にとってはうまくいきます。
デビッドB.

動的な検索/置換?
...-粗さ

スクリプトに保存されているホストアライズからホスト生成スクリプトへのマッピングから、sshへのコマンドライン引数のsed置換だけです。
デビッドB.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.