特定のクラスターから任意のコンピューターに頻繁に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資格情報を転送しません。これに関するヘルプも歓迎します。netcat
socat
編集:
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
サーバー障害に関する関連質問。
—
マイケル