Birden fazla ~ / .ssh / config dosyanız olabilir mi?


82

Birden fazla ana bilgisayara bağlanmak için kullandığımız bir bastion sunucumuz var. Bu biraz hantallaşmaya başladı ve .ssh / config dosyasını birden fazla dosyaya bölmenin bir yolu olup olmadığını bilmek istiyorum. İdeal olarak, bir yerde diğer dosyaların muhtemelen şöyle bir .ssh / config dosyası olarak değerlendirileceğini belirtmiştik:

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

Ben ssh / config belgelerini okudum ve bunun mümkün olduğunu görmüyorum. Ama belki başka birinin de benzer bir sorunu var ve bir çözüm buldu.


Her kullanıcının, bastion ana bilgisayarına kendi kullanıcı adıyla giriş yapmasını sağlayın. Ayrıca, her ana bilgisayar için giriş gerektiren config dosyasına ne koyuyorsunuz? Sık kullanılan bazı varsayılan ayarları yapamaz mısınız?
Jed Daniels,

1
Superuser.com'da aynı soru: superuser.com/questions/247564/…
guettli

1
Yakında, OpenSSH 7.3'de bu mümkün olmalıdır. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

Yanıtlar:


51

~/.ssh/configDosya muhtemelen dosya izinleri için SSH çeki ile ilgili diğer dosyaları da dahil olmak üzere bir talimat yok.

Bunun etrafındaki öneriler, sistemde ya da bir havuzdaki check-up kancaları aracılığıyla bir çok değişikliği bir araya getirmek için bir senaryo içerebilir. Biri Kukla veya Augeas gibi araçlara da bakabilir.

Bununla birlikte, yaklaşıyor olsanız da, ayrı ayrı dosyaları tek bir dosya olacak şekilde dosyanın dışından birleştirmeniz gerekir.

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

not: üzerine yaz: > vs ekle:>>

Aralık 2017 Güncellemesi:

7.3p1 ve üstü sürümlerde Dahil Et seçeneği vardır. Yapılandırma dosyalarını eklemenize izin verir.

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.

Sağol Jeff, bu iyi bir fikir. Kukla ya da Augeas hakkında fazla bir şey bilmiyorum, bu yüzden işleri mümkün olduğunca basit tutmak adına, çözümünüz en iyi şekilde görünüyor. Config komutunu birden fazla konfigürasyona bölebilir ve dosyalardan biri değiştirildiğinde .ssh / config dosyasını yeniden oluşturmak için basit bir komut dosyası oluşturabilirim. Bunun bir çözümden ne kadar temiz olduğunu bilmiyorum, ama hile yapıyor gibi görünüyor ve amaçlarım için çalışıyor.
wrangler

52

Şunun gibi ssh seçeneğinde kullanmak için geçerli config dosyasını belirleyebilirsiniz:

ssh -F /path/to/configfile

Tek yol bu gibi görünüyor.

Ayrıca, bir config'i başka birine dahil etmek artık mümkün değil.


Perl'in Net :: OpenSSH Modülünü kullanırken (örneğin birden fazla özel anahtar dosyası için), modülün tüm olanakları sağlamadığı bir seçenek olması güzel.
Jimmy Koerting

36

Ssh 7.3'ten başlayarak (1 Ağustos 2016'da yayımlandı), bir Includeyönerge mevcuttur.

Dahil et : Belirtilen yapılandırma dosyalarını dahil et. Birden çok yol adı belirtilebilir ve her yol adı glob joker karakterlerini ve kullanıcının ana dizinlerine kabuk benzeri "~" referanslar içerebilir. Mutlak yolu olmayan dosyaların içinde olduğu kabul edilir ~/.ssh. Bir Includeyönergesi içine görünebilir Matchveya Hostkoşullu dahil edilmesini gerçekleştirmek için bloke eder.

(İşte, şu düzeltme ekini de içeren, çözülen hata raporunun bağlantısı: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )


2
Bu çok havalı. Bunun için sabırsızlanıyoruz. Sonunda bu sorunu doğru şekilde
çözmeli

2
configDosyanın en üstüne Include direktifini eklemeniz yeterli . Neden altta çalışmadığını çözemiyorum.
pylover

17

Şahsen bu komutları ssh config'i derlemek için kullanıyorum:

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

veya:

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)

Çünkü:

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

dönen, benim için çalışmıyor:

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

Umarım bu herhangi bir yardımı olacaktır.


ssh -F <(cat .ssh/*.config)ideal olurdu. Ben de bununla geldim ama aynı hatayı alıyorum. Sorunun ne olduğunu bilen var mı?
sickill

2
ssh dosya izinlerini kontrol ediyor, sanırım bu tür yönlendirmeler bu çekleri desteklemiyor.
Camden Narzt 25:16

2

Ayrıca cat config_* > configbütün config oluşturmak için kullanırdım . Ancak eğer henüz yerlerinde olmasaydı bunun için kukla / cfengine vs kullanmazdım (BTW: neden bir config yönetim sistemi kullanmıyorsun ???).

Bir paket hazırlarım (deb, rpm) ve yerel bir depoya koyardım. Ve postinst betiğinde kedi sizin config'unuzu oluşturur. Belki yerel bir klasör de eklersiniz ... Avantaj, ssh / config güncellemelerinin günlük bazda cron-apt & Co çalıştırması sırasında aktif hale gelmesidir.


0

Bir Makefile kullanabilirsiniz ~/.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

Ardından var olanınızı hareket ettirin ve üretmek configiçin config.inçalıştırın .makeconfig


0

config.dYapılandırma organizasyonum için bir dizin kavramı ile oynuyorum . Yani yukarıdaki seçenek yığınına eklemek için, işte benim için çalışıyor.

Dizin yapısı gibi bir şey

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

~ / .Ssh / config'i oluşturan ve kabuğumun run-config dosyasında yaşayan işlev aşağıdaki gibidir

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
}

sshMakeConfigHer bir kabuk oturumunda yeni bir yapılandırma sağlamak istiyorsanız, isteğe bağlı olarak run-config'inizin altına ekleyin

~ / .Ssh / config'imi yeniden derlemek istediğim zaman, bunu bir şekilde çalıştırarak sshMakeConfig(doğrudan run-config kaynak kodunu kullanarak veya yeni bir kabuk başlatarak) yapıyorum.

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.