SSH yapılandırma dosyasında çalıştırılabilir komut dosyasından HostName nasıl edinilir?


10

Sık sık belirli bir kümeden rasgele bir bilgisayara ssh gerekir (kümedeki tüm makineler aynıdır). Ancak, kümedeki kullanılabilir makineler kümesi sık sık değişir, bu nedenle, kullanılabilir kümemden isteğe bağlı bir ana bilgisayar adı döndüren ve gereksinimleriyle eşleşen (örneğin, çevrimiçi ve doğru işletim sistemini çalıştıran) bir komut dosyası var.

Ayrıca, kimlik doğrulaması için Kerberos (GSSAPIAuthentication) kimlik doğrulaması kullandığımı da unutmayın.

Şu anda, kullanıyorum ssh `get_host`. Bunun yerine idam etmek istiyorum ssh cluster. Bilinen bir ana makine adıyla, aşağıdakilerle bu kolaydır /ssh/config:

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

HostNameKodumu kullanarak dinamik olarak nasıl seçebilirim ? (Ya da SSH benim istenen işlevi desteklemek için farklı bir yöntem var mı?) Aşağıdaki gibi bir şey yapmak istiyorum, ama çalışmıyor:

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

GrawityProxyCommand , ana bilgisayarın adını alan ve sshbağlantısını kullanarak netcatveya bağlantısını kullanan bir komut dosyası olabileceğini gösterdi socat. Ancak, bu Kerberos kimlik bilgilerini iletmez. Bununla ilgili yardım da takdir edilmektedir.

DÜZENLE:

Bunu Kerberos ile istediğim gibi yapamazsın (kabul edilen cevaptaki yorumlara bakınız). Bu komut, komut satırı bağımsız değişkeninde dinamik yeniden yazma yapmak için ssh-wrapperbir sshdiğer ad olarak kullanıyorum ssh. Sağlam değil, ama benim için çalışıyor.

#!/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

Yanıtlar:


6

~/.ssh/config:

Host cluster
    ProxyCommand ~/bin/cluster-connect

~/bin/cluster-connect:

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

Teşekkürler. Bu (veya netcat $(get_host) 22) bağlantı için harika çalışıyor. Ancak, kerberos kimlik bilgilerimi geçmiyor gibi görünüyor. Ben var GSSAPIAuthentication yesve GSSAPIDelegateCredentials yesaltında Host clusterbenim .ssh/configdosya ve HostName açıklık verilirse çalışır, ancak ProxyCommand üzerinden yönlendirmek değil. Düşünceler? Soruyu da değiştireceğim.
David B.

Bunu başarabileceğinizi sanmıyorum - sshdoğru bileti almak için hedef ana bilgisayar adını bilmeniz gerekir ve bunu dinamik olarak sağlamanın bir yolu yoktur (basitçe çalışan bir sarıcı kullanmaktan kısa ssh $(get_host) "$@", ki istemediğinizi anladım ). Bu olabilir kümedeki tüm sunucuların aynı Kerberos müdürünü varsa çalışıyorum, ama hiç kimse bunu yapmaz sanmıyorum.
user1686

Talihsiz, ama mantıklı. Dinamik bir bul / değiştir (soruya eklenmiş) yapmak için hızlı bir paket yazdım. Bazı senaryolarda kırılacak, ama benim için çalışıyor.
David B.

Dinamik bulma / değiştirme? ...
user1686

Komut satırı argümanlarında ssh'a bir sed ikamesi, bir host-alise'den host-script-script eşlemesine kadar saklanır.
David B.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.