Vraag Kun je meer dan een ~ / .ssh / config-bestand hebben?


We hebben een bastionserver die we gebruiken om verbinding te maken met meerdere hosts en onze .ssh / config is uitgegroeid tot meer dan duizend regels (we hebben honderden hosts waarmee we verbinding maken). Dit begint een beetje log te worden en ik zou graag willen weten of er een manier is om het .ssh / config-bestand in meerdere bestanden op te splitsen. Idealiter zouden we ergens specificeren dat andere bestanden zouden worden behandeld als een .ssh / config-bestand, mogelijk als:

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

Ik heb de documentatie over ssh / config gelezen en ik zie niet dat dit mogelijk is. Maar misschien heeft iemand anders een soortgelijk probleem gehad en een oplossing gevonden.


67
2018-03-31 17:47


oorsprong


Laat elke gebruiker inloggen op de bastionhost met hun eigen gebruikersnaam. En wat doe je in het configuratiebestand dat een ingang voor elke host vereist? Kun je sommige standaardwaarden niet instellen? - Jed Daniels
Dezelfde vraag op superuser.com: superuser.com/questions/247564/... - guettli
Binnenkort zou dat in OpenSSH 7.3 mogelijk moeten zijn. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25 - azmeuk


antwoorden:


De ~/.ssh/config bestand heeft geen richtlijn voor het opnemen van andere bestanden, mogelijk gerelateerd aan SSH's controle op bestandsrechten.

Suggesties hieromtrent kunnen een script bevatten om verschillende wijzigingen samen op te nemen, hetzij op het systeem of via check-in hooks op een repository. Men zou ook kunnen kijken naar hulpmiddelen zoals Puppet of Augeas.

Hoe je het ook benadert, je moet afzonderlijke bestanden aaneenschakelen als een enkel bestand van buiten het bestand.

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

Notitie:  overschrijven: >  v.s. toevoegen: >>

Update december 2017:

Vanaf 7.3p1 en hoger is er de optie Opnemen. Hiermee kunt u configuratiebestanden opnemen.

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.

41
2018-03-31 18:01



Bedankt Jeff, dit is een goed idee. Ik weet niet zoveel over Puppet of Augeas, dus om de zaken zo eenvoudig mogelijk te houden, lijkt je oplossing het beste. Ik zou de configuratie in meerdere configs kunnen splitsen en een eenvoudig script kunnen maken om het .ssh / config-bestand na te bootsen telkens wanneer een van de bestanden wordt gewijzigd. Ik weet niet hoe schoon een oplossing is, maar het lijkt de truc te doen en werkt voor mijn doeleinden. - wrangler


Je kunt op dit moment het huidige configuratiebestand specificeren om te gebruiken in de ssh-optie:

ssh -F /path/to/configfile

Het lijkt de enige manier.

Ook is er nu de mogelijkheid om de ene configuratie in de andere op te nemen.


40
2018-03-31 18:06



Een leuke optie als je de Net :: OpenSSH-module van Perl gebruikt (bijvoorbeeld voor meerdere privésleutelbestanden), waar de module niet alle mogelijkheden biedt. - Jimmy Koerting


Beginnend met ssh 7.3 (uitgebracht op 1 augustus 2016), een Include richtlijn is beschikbaar.

omvatten: Neem het / de gespecificeerde configuratiebestand (en) op. Meerdere pad   namen kunnen worden opgegeven en elke padnaam kan glob bevatten   wildcards en shell-achtige "~" verwijzingen naar home mappen van gebruikers.   Bestanden zonder absolute paden worden verondersteld te zijn in ~/.ssh. Een    Include richtlijn kan in een Match of Host blokkeren naar   conditionele inclusie uitvoeren.

(Hier is de link naar het opgeloste bugrapport, dat ook de patch bevat: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24)


30
2017-07-11 15:19



Dat is te cool. Kijk hier naar uit. Het zou dit probleem eindelijk op de juiste manier moeten oplossen :) - wrangler
Voeg de Include-instructie toe bovenaan de config het dossier. Ik kan niet achterhalen waarom het niet onderaan werkt. - pylover


Ik gebruik deze commando's persoonlijk om de ssh config te compileren:

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.)

of:

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)

omdat:

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

werkt niet voor mij, terugkerend:

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

Ik hoop dat dit van enige hulp zal zijn.


16
2017-11-27 15:07



ssh -F <(cat .ssh/*.config) zou ideaal zijn. Ik heb dit ook bedacht, maar ik krijg dezelfde foutmelding. Weet iemand wat hier het probleem is? - sickill
ssh controleert bestandspermissies, ik denk dat dit soort redirect die controle niet ondersteunt. - Camden Narzt


Ik zou ook gebruiken cat config_* > config om de hele config te genereren. Maar ik zou marionet / cfengine etc hiervoor niet gebruiken, als ze nog niet op hun plaats zijn (tussen haakjes: waarom geen configuratiebeheersysteem gebruiken ???).

Ik zou een pakket (deb, rpm) genereren en het in een lokale repository plaatsen. En in het postinst script genereert de kat je config. Misschien neem je ook een lokale map op ... Het voordeel is dat ssh / config-updates dagelijks worden geactiveerd terwijl cron-apt & Co wordt uitgevoerd.


2
2018-03-31 19:34





Je zou een Makefile in kunnen gebruiken ~/.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

Verplaats vervolgens uw bestaande config naar config.in en loop make genereren config.


0
2018-05-04 22:18





Ik heb gespeeld met het concept van a config.d map voor mijn configuratie organiseren. Dus om toe te voegen aan de bovenstaande stapel opties, hier is wat voor mij werkt.

De mappenstructuur is zoiets als

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

De functie die de ~ / .ssh / config bouwt en leeft in de run-config van mijn shell is als volgt

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
}

Voeg eventueel toe sshMakeConfig aan de onderkant van je run-config als je een frisse configuratie voor elke shell-sessie wilt verzekeren

Elke keer dat ik mijn ~ / .ssh / config opnieuw moet compileren, doe ik dat door te draaien sshMakeConfig in een of andere vorm (rechtstreeks, sourcing van mijn run-config of het starten van een nieuwe shell)


0
2018-03-16 12:59