我经常需要从特定群集ssh进入任意计算机(群集中的所有计算机都是相同的)。但是,集群中的可用计算机集经常更改,因此我有一个脚本,该脚本从集群中返回一个可用的主机名,该主机名符合我的要求(例如,联机并运行正确的操作系统)。
还要注意,我正在使用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使用netcat或将连接转发到主机名socat。但是,这并不转发Kerberos凭据。对此的帮助也将受到赞赏。
编辑:
您无法按照我的意愿使用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
服务器故障相关问题。
—
Michael-Clay Shirky在哪里,