C'è un modo per un file di configurazione SSH di includerne un altro?


131

Nel caso in cui sia importante:

  • Sistema operativo: Ubuntu 10.04
  • SSH: OpenSSH_5.3p1 Debian-3ubuntu5

Vorrei che un file di configurazione SSH ne includesse un altro. Il caso d'uso sarebbe definire ciò che voglio nel mio .ssh/configfile predefinito e quindi pre-sospendere un paio di cose extra in un file separato (ad es ~/.ssh/foo.config.). Voglio che il secondo file includa il primo, quindi non devo duplicare tutto nel primo. È fattibile? Grazie!


2
Stessa domanda su serverfault: serverfault.com/questions/375525/…
guettli

Risposte:


140

Da 7.3p1 in poi, c'è la Includeparola chiave, che consente di includere file di configurazione.

Include

    Includi i file di configurazione specificati. È possibile specificare più nomi di percorso e ciascun nome di percorso può contenere caratteri jolly glob (3) e, per le configurazioni utente, riferimenti "~" a forma di shell alle home directory degli utenti. Si presume che i file senza percorsi assoluti siano presenti ~/.sshse inclusi in un file di configurazione dell'utente o /etc/sshse inclusi nel file di configurazione del sistema.  Includela direttiva può apparire all'interno di un blocco Matcho Hostper eseguire l'inclusione condizionale.
Fonte: ssh_config (5) .

Ad esempio potresti avere in ~/.ssh/config:

Include config.d/home

Host github.com
    HostName github.com
    User git

e in ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

Dai commenti, utilizzare quanto segue per includere tutti i file nella config.ddirectory:

Include config.d/* 

13
controlla la versione con $ ssh -V
Pieter

7
Utilizzare Include config.d/*per includere tutte le voci in config.d.
Simon Woodside,

17
Ftr: questo deve andare nella parte superiore del file e non può essere semplicemente aggiunto all'elenco delle Hostvoci.
dtk

2
provato su Ubuntu 16.04. Tuttavia, funziona, ma il completamento automatico è rotto, il che lo rende meno utile. Se vuoi aggiornare ssh su ubuntu, controlla questo link gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu,

@dtk grazie per quello. Questo è quello che mi ha lasciato senza parole
Adam Keenan il

28

No, per quanto ne so, questo non è possibile.

Ecco i collegamenti alle corrispondenti richieste di funzionalità aperte / ticket bug:

https://bugzilla.mindrot.org/show_bug.cgi?id=1585

https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495



8
OH MIO DIO. Sta accadendo. Dal 15/04/2016 alle 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3
oschrenk,

Questa risposta era corretta al momento, ma ora è obsoleta.
Mark Stosberg,

25

Se vuoi avviare un client ssh, puoi farlo in bash:

#files are .ssh/config and ~/.ssh/foo.config
alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)'

allora usi ssh normalmente e avrà entrambi i file letti in quell'ordine.

Per il demone del server sshdpuoi fare lo stesso, basta usare -finvece -Fe scrivere questo dove si avvia direttamente il demone. non hai bisogno di un alias.

Una seconda possibilità, secondo la pagina man, è quella di inserire la configurazione a livello di sistema /etc/ssh/ssh_confige quella dell'utente ~/.ssh/config.

Aggiornamento Apparentemente c'è qualche problema con alcune versioni di bash e come vengono creati i dispositivi. (vedi http://bugs.alpinelinux.org/issues/1465 )

Questa è una soluzione alternativa (anche se a mio avviso brutta):

mkfifo /tmp/ssh_fifo
cat ~/.ssh/config ~/.ssh/foo.config >/tmp/ssh_fifo & 
ssh -F /tmp/ssh_fifo myserver
rm /tmp/ssh_fifo

quindi se vuoi, puoi creare una sua funzione (o uno script):

ssh() {
    tmp_fifo=$(mktemp -u --suffix=_ssh_fifo)
    mkfifo "$tmp_fifo" 
    cat ~/.ssh/config ~/.ssh/foo.config >"$tmp_fifo" 2>/dev/null & 
    /usr/bin/ssh -F "$tmp_fifo" "$@"
    rm "$tmp_fifo"
}

1
Purtroppo questo non funziona su ssh di OSX: impossibile aprire il file di configurazione dell'utente / dev / fd / 63: descrittore di file errato
Ash Berlin-Taylor,

Non funziona anche per me su (Ubuntu 11.10) Linux con lo stesso errore di @AshBerlin pubblicato sopra.
Szymon Jeż,

@AshBerlin puoi provarlo anche tu, questo dovrebbe funzionare anche per OSX, fino a quando il bug non verrà risolto
estani,

Dato che ssh controlla tre posizioni, 1. riga di comando, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, non dovresti passare anche ~/.ssh/configsulla riga di comando. Giusto alias ssh='ssh -F ~/.ssh/foo.config'e ~/.ssh/configdovrebbe essere raccolto dopo. Finché non ti dispiace foo.configessere caricato per primo, questo dovrebbe essere più pulito della soluzione precedente.
jim

1
@jim no, non funziona così. Viene utilizzato il primo trovato. L'hai provato? dalla pagina man "-F configfile: specifica un file di configurazione alternativo per utente. Se viene fornito un file di configurazione sulla riga di comando, il file di configurazione a livello di sistema (/ etc / ssh / ssh_config) verrà ignorato."
estani,

17

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 )


14

Analogamente all'altro "brutto", ecco il mio one-liner:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"

Si noti che il sftpcomando non attiverà il ricalcolo della configurazione.
VasyaNovikov,

2
(Mi piace ancora la risposta perché usa "config.d /" ed è molto semplice.)
VasyaNovikov

2
semplice, elegante, ma
aleatorio

6

Beh, ho un po 'ingannato per farlo. Nei miei file bash .profile-ish ho un blocco che sostituisce vari pezzi della mia directory home al momento del login, quindi ne generi uno nuovo ogni volta. Esempio:

rm ~/.ssh/config
cat ~/conf/myservers.sshconfig >> ~/.ssh/config

[ -f ~/conf/workservers.sshconfig ] && cat ~/conf/workservers.sshconfig >> ~/.ssh/config
(or something like this:)
for i in `ls ~/conf/sshconfigs` ; do
    cat $i >> ~/.ssh/config
done

chmod 600 ~/.ssh/config

Questo mi permette anche di fare cose come aggiungere blocchi di configurazione al file di configurazione ssh solo se sono sull'host A o B, ma non sui miei sistemi domestici.

Ora so che qualcuno noterà che se accedi molto, questo potrebbe causare un rallentamento eccessivo, ma in pratica non l'ho mai notato. E sono sicuro che potresti metterlo in uno script e sparare anche tramite cron.


3

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.


Potresti fare un ulteriore passo avanti e combinare questo con fswatch, per la compilazione automatica sulla modifica dei file
cavalcata,

3

Un'altra soluzione basata su FUSE (non testata me stesso):

https://github.com/markhellewell/sshconfigfs

"Invece di dover continuare a gestire un grosso file, [...] crea un" file "di configurazione dinamicamente da molti blocchi logici più piccoli."

Ho anche trovato un articolo facendo questo tramite FIFO: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/


1
Trovo che il contenuto del commento sia abbastanza descrittivo - dice "FUSE" (Forse espandere l'acronimo sarebbe meglio); Il collegamento è solo per un'implementazione.
aviv

1
Non ero a conoscenza del problema delle risposte brevi, risposta estesa. Sembra che dovrò controllare periodicamente il sito per le mie risposte, in assenza di notifiche e-mail :) Ormai ho imparato a usare i preferiti. Grazie per i commenti
amontero,

2

Nessuna di queste soluzioni alias funziona per gito altri programmi diversi da ssh.

Ho schiaffeggiato un veloce e sporco, ma potresti voler migliorare.

Aggiungi questo al tuo ~/.bashrc

mkdir -p ~/.ssh/config.d/
[ -e ~/.ssh/config ] && mv ~/.ssh/config ~/.ssh/config.bak.$(date -Ins)
cat ~/.ssh/config.d/* > ~/.ssh/config

Ogni volta che avvii una sessione, unirà tutti i file ~/.ssh/config.d. (linea 3)

Il rovescio della medaglia con questa versione è che se cambi la ~/.ssh/configprossima sessione che apri le tue modifiche andrebbero perse, quindi per evitare che io sposti il ​​file esistente in un file .bak. (riga 2) Il problema è che dopo un po 'avrai molti file .bak.


Eccellente con l'aggiunta di alcune is_anything_changedcondizioni
vp_arth

1

Puoi facilmente aggiornare la versione SSH su Ubuntu a v7.3 (testato su Ubuntu Xenial 16.04) installando pacchetti da Yakkety:

echo "deb http://archive.ubuntu.com/ubuntu yakkety main" > /etc/apt/sources.list.d/yakkety.list
apt-get update
apt-get install -y ssh
rm /etc/apt/sources.list.d/yakkety.list
apt-get update

Controlla la versione SSH

ssh -V
OpenSSH_7.3p1 Ubuntu-1, OpenSSL 1.0.2g 1 Mar 2016

Configurare SSH per l'uso include dalla directory ~ / .ssh / config.d

mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config

0

La mia stupida risposta:

  • Ho provato a installare OpenSSH> 7.3 su Xenial (16.04)
  • Non mi è piaciuto il casino che ha fatto

Quindi ho optato per questo:

  • Conserva i tuoi file di configurazione OpenSSH separati ~/.ssh/config.d/
  • Quando ne cambi uno, fallo cat ~/.ssh/config.d/* > ~/.ssh/config
  • Nel glorioso giorno in cui esegui l'upgrade a una versione distro con OpenSSH 7.3p1 o più recente, puoi invece creare un file che contiene

Include config.d/*


0

Non riesco nemmeno ad aggiornare SSH sul mio computer.

Ho usato GNU make per generare il file di configurazione ssh solo quando necessario :

# Concatenates all the .config files.
aInput  = *.config
aOutput = ~/.ssh/config

aCurrentMakefile = $(lastword $(MAKEFILE_LIST))

$(aOutput): $(shell ls $(aInput)) $(aCurrentMakefile)
    @echo "Generating $(aOutput)"
    @echo "# File generated by $(aCurrentMakefile) on $(shell date +'%F %T.%6N')" > $(aOutput)
    @cat $(aInput) >> $(aOutput)

Quindi ssh è aliasato

alias ssh='make -s -f ~/Tools/config.d/makefile -C ~/Tools/config.d && ssh'

Esso funziona magicamente.

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.