특정 클러스터에서 임의의 컴퓨터로 자주 ssh해야합니다 (클러스터의 모든 컴퓨터가 동일 함). 그러나 클러스터에서 사용 가능한 시스템 집합이 자주 변경되므로 사용 가능한 클러스터에서 임의의 호스트 이름을 반환하고 내 요구 사항 (예 : 온라인 및 올바른 OS 실행)과 일치하는 스크립트가 있습니다.
또한 인증을 위해 Kerberos (GSSAPIAuthentication) 자격 증명 전달을 사용하고 있습니다.
지금은을 사용하고 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
, int로서 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