Puoi avere più di un file ~ / .ssh / config?


82

Abbiamo un server bastion che usiamo per connetterci a più host e il nostro .ssh / config è cresciuto fino a oltre mille linee (abbiamo centinaia di host a cui ci connettiamo). Questo sta iniziando a diventare un po 'ingombrante e mi piacerebbe sapere se esiste un modo per suddividere il file .ssh / config in più file. Idealmente, dovremmo specificare da qualche parte che altri file verrebbero trattati come file .ssh / config, possibilmente come:

~/.ssh/config
  ~/.ssh/config_1
  ~/.ssh/config_2
  ~/.ssh/config_3
  ...

Ho letto la documentazione su ssh / config e non vedo che ciò sia possibile. Ma forse qualcun altro ha avuto un problema simile e ha trovato una soluzione.


Chiedi a ciascun utente di accedere all'host del bastione con il proprio nome utente. Inoltre, cosa stai inserendo nel file di configurazione che richiede una voce per ciascun host? Non puoi impostare alcune impostazioni predefinite che sono comuni?
Jed Daniels,

1
Stessa domanda su superuser.com: superuser.com/questions/247564/…
guettli

1
Presto, in OpenSSH 7.3 ciò dovrebbe essere possibile. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

Risposte:


51

Il ~/.ssh/configfile non ha una direttiva per l'inclusione di altri file, probabilmente correlata al controllo di SSH per le autorizzazioni dei file.

Suggerimenti al riguardo possono includere uno script per raggruppare diverse modifiche insieme sul sistema o tramite hook di checkin in un repository. Si potrebbe anche esaminare strumenti come Puppet o Augeas.

Comunque ti avvicini, però, dovrai concatenare i singoli file per essere un singolo file dall'esterno del file.

$ cat ~/.ssh/config_* >> ~/.ssh/config

nota: sovrascrivi: > vs append:>>

Aggiornamento dicembre 2017:

Da 7.3p1 in poi, c'è l'opzione Includi. Ciò consente di includere file di configurazione.

Include
    Include the specified configuration file(s).  Mul‐
    tiple pathnames may be specified and each pathname
    may contain glob(3) wildcards and, for user config‐
    urations, shell-like “~” references to user home
    directories.  Files without absolute paths are
    assumed to be in ~/.ssh if included in a user con‐
    figuration file or /etc/ssh if included from the
    system configuration file.  Include directive may
    appear inside a Match or Host block to perform con‐
    ditional inclusion.

Grazie Jeff, questa è una buona idea. Non so molto su Puppet o Augeas, quindi per motivi di semplicità, la soluzione sembra la migliore. Potrei suddividere la configurazione in più configurazioni e creare un semplice script per ricreare il file .ssh / config ogni volta che uno dei file viene modificato. Non so quanto sia pulita questa soluzione, ma sembra fare il trucco e funziona per i miei scopi.
wrangler

52

È possibile specificare il file di configurazione corrente da utilizzare nell'opzione ssh in questo modo:

ssh -F /path/to/configfile

Sembra che sia l'unico modo.

Inoltre al giorno d'oggi è possibile includere una configurazione in un'altra.


Un'opzione piacevole da utilizzare quando si utilizza il modulo Net :: OpenSSH di Perl (ad es. Per più file di chiavi private.), In cui il modulo non offre tutte le possibilità.
Jimmy Koerting,

36

A partire da ssh 7.3 (rilasciato il 1 agosto 2016), Includeè disponibile una direttiva.

Includi : include i file di configurazione specificati. È possibile specificare più nomi di percorso e ciascun percorso può contenere caratteri jolly glob e riferimenti "~" a forma di shell alle home directory degli utenti. Si presume che siano presenti file senza percorsi assoluti ~/.ssh. Una Includedirettiva può apparire all'interno di un blocco Matcho Hostper eseguire l'inclusione condizionale.

(Ecco il link alla segnalazione di bug risolti, che include anche la patch: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )


2
È troppo bello. Non vedo l'ora. Dovrebbe finalmente risolvere questo problema nel modo giusto :)
wrangler

2
Basta aggiungere la direttiva Include nella parte superiore del configfile. Non riesco a capire perché non funzioni in fondo.
pylover,

17

Personalmente uso questi comandi per compilare la configurazione ssh:

alias compile-ssh-config='echo -n > ~/.ssh/config && cat ~/.ssh/*.config > ~/.ssh/config'
alias ssh='compile-ssh-config && ssh'
# (This will get used by other programs depending on the ~/.ssh/config)
# (If you need you can run the compile-ssh-config command via cron etc.)

o:

alias compile-ssh-config='echo -n > ~/.ssh/config-compilation && cat ~/.ssh/*.config > ~/.ssh/config-compilation'
alias ssh='compile-ssh-config && ssh -F ~/.ssh/config-compilation'
# (This is saver and won't over write an existing ~/.ssh/config file)

perché:

alias ssh='ssh -F <(cat .ssh/*.config)'

non funziona per me, restituendo:

ssh: Can't open user config file /dev/fd/63: Bad file descriptor

Spero che questo possa essere di aiuto.


ssh -F <(cat .ssh/*.config)sarebbe l'ideale. Ho pensato anche a questo, ma sto ottenendo lo stesso errore. Qualcuno sa qual è il problema qui?
sickill

2
ssh controlla i permessi dei file, penso che questo tipo di reindirizzamento non supporti quel controllo.
Camden Narzt,

2

Vorrei anche usare cat config_* > configper generare l'intera configurazione. Ma non userei marionette / cfengine ecc. Per questo, se non sono ancora in atto (A proposito: perché non usare un sistema di gestione della configurazione ???).

Genererei un pacchetto (deb, rpm) e lo metterei in un repository locale. E nello script postinst il gatto genera la tua configurazione. Forse includi anche una cartella locale ... Il vantaggio è che gli aggiornamenti ssh / config si attivano su base giornaliera mentre cron-apt & Co sono in esecuzione.


0

Puoi usare un Makefile in ~/.ssh:

    config: config.in config.app.in
        > $@
        (for f in $+; do cat $$f; echo; done) | sed '$$ d' >> $@

    config.app.in:
        (echo "# Generated with foobar.sh."; \
            foobar.sh) > $@
    .PHONY: config.app.in

Quindi spostare il esistente configa config.ined eseguire makeper generare config.


0

Ho giocato con il concetto di config.ddirectory per l'organizzazione della mia configurazione. Quindi per aggiungere alla pila di opzioni sopra, ecco cosa ha funzionato per me.

La struttura delle directory è qualcosa di simile

~/.ssh/config.d
├── system_1
├── system_2
├── system_3
├── personal_boxen
├── git_things
├── random
└── rubbish

La funzione che crea ~ / .ssh / config e vive nel run-config della mia shell è la seguente

sshMakeConfig() {
    echo '# AUTOGENERATED by sshMakeConfig()' > ~/.ssh/config
    for i in ~/.ssh/config.d/*
        do echo "#${i}" | tee -a ~/.ssh/config
        cat ${i} >> ~/.ssh/config
    done
}

Facoltativamente, aggiungi sshMakeConfigin fondo alla tua run-config se vuoi assicurare una nuova configurazione su ogni sessione della shell

Ogni volta che devo ricompilare il mio ~ / .ssh / config, lo faccio eseguendo sshMakeConfigin qualche forma (direttamente, approvando il mio run-config o avviando una nuova shell)

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.