SSH 구성 파일의 실행 스크립트에서 HostName을 얻는 방법은 무엇입니까?


10

특정 클러스터에서 임의의 컴퓨터로 자주 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

답변:


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 yes있고 GSSAPIDelegateCredentials yes아래 Host cluster.ssh/config있으며 HostName이 명시 적으로 주어지면 작동하지만 ProxyCommand를 통해 라우팅하면 작동하지 않습니다. 생각? 질문도 수정하겠습니다.
David B.

나는 당신이 그것을 달성 할 수 있다고 생각하지 않습니다 ssh. 올바른 티켓을 얻으려면 대상 호스트 이름을 알아야하며, 동적으로 제공 할 수있는 방법이 없습니다 (간단히 실행되는 래퍼를 사용하는 ssh $(get_host) "$@"것이 부족합니다. ). 그것은 수 있습니다 클러스터의 모든 서버가 동일한 Kerberos 주체가있는 경우 작동,하지만 난 누구도 그렇게하지 생각하지 않습니다.
user1686

불행하지만, 감각을 만듭니다. 동적 찾기 / 바꾸기 (질문에 추가)를 수행하는 빠른 래퍼를 작성했습니다. 일부 시나리오에서는 깨지지 만 나에게 효과적입니다.
David B.

동적 찾기 / 바꾸기?
1686

스크립트에 저장된 호스트 얼 라이즈에서 호스트 생성 스크립트 매핑에 이르기까지 ssh에 대한 명령 줄 인수에 대한 sed 대체 만 있습니다.
David B.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.