Come ottenere HostName dallo script eseguibile nel file di configurazione SSH?


10

Ho spesso bisogno di accedere a un computer arbitrario da un determinato cluster (tutte le macchine nel cluster sono identiche). Tuttavia, il set di macchine disponibili nel cluster cambia frequentemente, quindi ho uno script che restituisce un nome host arbitrario dal cluster che è disponibile e soddisfa i miei requisiti (ad esempio, online e con il sistema operativo corretto).

Si noti inoltre che sto utilizzando l'inoltro delle credenziali Kerberos (GSSAPIAuthentication) per l'autenticazione.

In questo momento, ho usato SSH ssh `get_host`. Vorrei invece eseguire ssh cluster. Con un nome host noto, questo è facile con quanto segue in /ssh/config:

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

Come posso selezionare HostNamedinamicamente, usando il mio script? (O SSH ha un metodo diverso per supportare la mia funzione desiderata?) Vorrei fare qualcosa di simile al seguente, ma non funziona:

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

Grawity ha mostrato che ProxyCommandpuò essere uno script che ottiene il nome host e inoltra la sshconnessione ad esso usando netcato socat. Tuttavia, questo non sta inoltrando le credenziali Kerberos. Anche l'aiuto con questo è apprezzato.

MODIFICARE:

Non puoi farlo con Kerberos come vorrei (vedi commenti nella risposta accettata). Quindi, sto usando questo script, ssh-wrappercome sshalias per fare riscrittura dinamica sshsull'argomento della riga di comando. Non è robusto, ma funziona per me.

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

Risposte:


6

~/.ssh/config:

Host cluster
    ProxyCommand ~/bin/cluster-connect

~/bin/cluster-connect:

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

Grazie. Questo (o netcat $(get_host) 22) funziona alla grande per la connessione. Ma non sembra passare le mie credenziali di Kerberos. Ho GSSAPIAuthentication yese GSSAPIDelegateCredentials yesmeno Host clusternel mio .ssh/configfile, e funzionano se HostName è esplicitamente dato, ma non se instrado attraverso il ProxyCommand. Pensieri? Modificherò anche la domanda.
David B.

Non credo che tu possa raggiungerlo - sshdevi conoscere il nome host di destinazione per ottenere il ticket corretto, e non c'è proprio modo di fornirlo in modo dinamico (a meno di usare un wrapper che gira semplicemente ssh $(get_host) "$@", che come ho capito non vuoi ). Esso può funzionare se tutti i server del cluster hanno lo stesso principio Kerberos, ma io non credo che nessuno mai lo fa.
user1686

Sfortunato, ma ha senso. Ho scritto un wrapper rapido per eseguire una ricerca / sostituzione dinamica (aggiunta alla domanda). Si romperà in alcuni scenari, ma funziona per me.
David B.


Solo una sostituzione di sed sugli argomenti della riga di comando su ssh, da un host-alise alla mappatura di script di generazione host memorizzata nello script.
David B.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.