Bir SSH config dosyasının bir tane daha eklemesinin bir yolu var mı?


131

Önemli olması durumunda:

  • İşletim Sistemi: Ubuntu 10.04
  • SSH: OpenSSH_5.3p1 Debian-3ubuntu5

Bir SSH yapılandırma dosyasının bir tane daha eklemesini istiyorum. Kullanım örneği, varsayılan .ssh/configdosyamda ne istediğimi tanımlamak ve sonra da ayrı bir dosyada birkaç tane daha fazla şey beklemektir (örn. ~/.ssh/foo.config). İkinci dosyanın ilkini eklemesini istiyorum, bu yüzden ilkinde her şeyi çoğaltmam gerekmiyor. Bu yapılabilir mi? Teşekkürler!


Yanıtlar:


140

7.3p1 ve üstü sürümlerde Include, yapılandırma dosyalarını eklemenizi sağlayan bir anahtar kelime vardır .

Include

    Belirtilen yapılandırma dosyalarını ekleyin. Birden fazla yol belirtilebilir ve her yol adı glob (3) joker karakterlerini içerebilir ve kullanıcı yapılandırmaları için kullanıcı ana dizinlerine kabuk benzeri "~" referanslar içerebilir. Mutlak yolu olmayan dosyaların ~/.ssh, bir kullanıcı konfigürasyon dosyasına /etc/sshdahil edilmişse veya sistem konfigürasyon dosyasından alınmışsa olduğu varsayılır .  Includedirektif, koşullu dahil etme yapmak için a Matchveya Hostblok içinde görünebilir .
Kaynak: ssh_config (5) .

Örneğin, içinde olabilir ~/.ssh/config:

Include config.d/home

Host github.com
    HostName github.com
    User git

ve içinde ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

Yorumlardan, config.ddizine tüm dosyaları eklemek için aşağıdakileri kullanın :

Include config.d/* 

13
$ ssh -V ile sürümünü kontrol et
Pieter

7
Include config.d/*İçindeki tüm girişleri dahil etmek için kullanın config.d.
Simon Woodside

17
Ftr: Bu dosyanın en üstüne gitmeli ve sadece Hostgiriş listesine eklenemez.
dtk

2
Ubuntu 16.04'ü denedi. Olsa da, çalışır, ancak otomatik tamamlama bozuldu, bu da onu daha az kullanışlı yapar. Eğer ubuntu üzerinde ssh yükseltmek istiyorsanız, bu bağlantıyı kontrol gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu

@dtk bunun için teşekkürler. Beni güdükleyen de buydu
Adam Keenan

28

Hayır, bildiğim kadarıyla bu mümkün değil.

Karşılık gelen açık özellik isteklerinin / böcek biletlerinin bağlantıları:

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

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


2
Ayrıca Debian'daki şu hatayı da: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189
Lluís

8
AMAN TANRIM. Hapening oluyor. 2016-04-15 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3
oschrenk

Bu cevap o zamanlar doğruydu, fakat şimdi modası geçmiş.
Mark Stosberg

25

Bir ssh istemcisi başlatmak istiyorsanız, bunu bash olarak yapabilirsiniz:

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

o zaman ssh'yi normal kullanırsınız ve her iki dosyayı da bu sırada okur.

Sunucu arka plan programı sshdiçin de aynısını yapabilirsiniz, sadece -fyerine kullanın -Fve bunu doğrudan arka plan programı başlattığınız yere yazın. takma isme ihtiyacın yok.

Kılavuz sayfasına göre ikinci bir olasılık, sistemin geniş bir konfigürasyonunu /etc/ssh/ssh_configve kullanıcıyı bir tane koymasıdır ~/.ssh/config.

Güncelleme Görünüşe göre bazı bash sürümlerinde ve cihazların nasıl oluşturulduğuna dair bir sorun var. (bkz. http://bugs.alpinelinux.org/issues/1465 )

Bu bir geçici çözümdür (bence çirkin olsa da):

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

Dolayısıyla, isterseniz, bunun dışında bir işlev (veya bir komut dosyası) oluşturabilirsiniz:

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
Ne yazık ki bu OSX en ssh çalışmıyor: açılamıyor kullanıcı yapılandırma dosyası / dev / fd / 63: Hatalı dosya tanımlayıcısı
Kül Berlin-Taylor

Ayrıca benim için de çalışmıyor (Ubuntu 11.10) Linux yukarıda belirtilen @AshBerlin ile aynı hatayı veriyor.
Szymon Jeż

@AshBerlin siz de deneyebilirsiniz, bu hata
giderilinceye

Verilen ssh üç yeri kontrol eder, 1. komut satırı, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, ~/.ssh/configkomut satırından da geçmek zorunda değilsiniz . Sadece alias ssh='ssh -F ~/.ssh/foo.config've ~/.ssh/configondan sonra yakalanmalıyız. foo.configÖncelikle yüklenirken sakıncası yoksa , yukarıdaki geçici çözümden daha temiz olmalıdır.
jim

1
@jim hayır, o şekilde çalışmaz. İlk bulunan kullanılır. Bunu denediniz mi? man-sayfasından "-F configfile: Kullanıcı başına alternatif bir konfigürasyon dosyası belirtir . Komut satırında bir konfigürasyon dosyası verilirse, sistem genelindeki konfigürasyon dosyası (/ etc / ssh / ssh_config) dikkate alınmaz."
estani,

17

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 ayrıca düzeltilmiş hata raporunun bağlantısıdır, bu ayrıca tha yamasını içerir: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )


14

Diğer 'çirkin' e benzer şekilde işte birincisi:

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

sftpKomutun yeniden yapılandırma işlemini tetiklemeyeceğini unutmayın .
VasyaNovikov

2
(Cevabı hala seviyorum çünkü "config.d /" kullanıyor ve çok basit.)
VasyaNovikov 13:15

2
basit, zarif, henüz hack
code_monk

6

Bunu yapmak için hile yapıyorum. Benim bash .profile-ish dosyalarımda giriş yaptığım andaki dizimin çeşitli parçalarını değiştiren bir bloğum var, bu yüzden her seferinde yeni bir tane üretiyorum. Örnek:

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

Bu aynı zamanda ssh config dosyasına config blok ekleme gibi şeyler yapmama izin veriyor, sadece A veya B ana bilgisayarındaysam, ancak ev sistemlerimde değil.

Şimdi biliyorum, birileri çok fazla giriş yaparsanız bunun aşırı yavaşlamaya neden olabileceğini, ancak pratikte bunu asla farketmediğimi anlayacaktır. Eminim bunu bir senaryoya koyabilir ve cron ile de kovabilirsin.


3

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


Bir adım daha ileri gidebilir ve bunu fswatch ile birleştirebilirsiniz, dosya değişikliğinde otomatik derleme için
cavalcade

3

Başka, FUSE tabanlı bir çözüm (kendim denemedim):

https://github.com/markhellewell/sshconfigfs

“Büyük bir dosyayı yönetmeye devam etmek yerine [...] bunun yerine dinamik olarak daha küçük mantıksal parçalardan bir config“ dosyası ”oluşturun.”

Bunu FIFO'lar aracılığıyla yapan bir makale de buldum: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/


1
Yorum içeriğini yeterince açıklayıcı buluyorum - "SİGORTA" yazıyor (Belki kısaltmayı genişletmek daha iyi olurdu); Bağlantı sadece bir uygulamaya yöneliktir.
aviv

1
Kısa cevaplar sorununun farkında değildi, cevap genişledi. Görünüşe göre, e-posta bildirimleri olmadan zaman zaman sitemi cevaplarım için tekrar kontrol etmek zorunda kalacağım :) Şimdilik favorileri kullanmayı öğrendim. Yorumlarınız için teşekkürler.
amontero

2

Bu takma ad çözümlerinin hiçbiri için işe yaramadı git veya başka bir programssh .

Hızlı ve kirli bir araya tokatladım, ancak bunu geliştirmek isteyebilirsiniz.

Bunu ekle ~/.bashrc

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

Bir oturuma her başladığınızda, içindeki tüm dosyaları birleştirir. ~/.ssh/config.d . (satır 3)

Bu sürümün dezavantajı, bir ~/.ssh/configsonraki oturumu değiştirirseniz , değişikliklerinizi kaybedersiniz, böylece mevcut dosyayı bir .bak dosyasına taşımamı engellerim. (satır 2) Buradaki problem, bir süre sonra çok fazla .bak dosyanız olacak.


Bazı is_anything_changedkoşullar ekleyerek mükemmel
vp_arth

1

Yakkety'den paket yükleyerek Ubuntu'daki SSH sürümünü v7.3'e (Ubuntu Xenial 16.04'te test edilmiştir) kolayca yükseltebilirsiniz:

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

SSH sürümünü kontrol et

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

SSH'yi ~ / .ssh / config.d dizininden içerecek şekilde kullanmak için yapılandırın

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

0

Aptal cevabım:

  • Xenial'e OpenSSH> 7.3 yüklemeye çalıştı (16.04)
  • Yaptığı karışıklığı sevmedim

Böylece bunun için yerleşmiş:

  • Ayrı OpenSSH config dosyalarınızı içinde tutun ~/.ssh/config.d/
  • Birini değiştirdiğinde, yap cat ~/.ssh/config.d/* > ~/.ssh/config
  • Görkemli bir günde, OpenSSH 7.3p1 veya daha yenisine sahip bir dağıtım sürümüne yükseltirseniz, bunun yerine içeren bir dosya oluşturabilirsiniz.

Include config.d/*


0

Makinemde SSH'yi de yükseltemiyorum.

Sadece gerektiğinde ssh config dosyasını üretmek için GNU make'i kullandım :

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

Sonra ssh diğer adı ile

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

Mucizevi şekilde çalışır.

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.