Bisakah Anda memiliki lebih dari satu file ~ / .ssh / config?

82

Kami memiliki server benteng yang kami gunakan untuk terhubung ke beberapa host, dan .ssh / config kami telah berkembang menjadi lebih dari seribu baris (kami memiliki ratusan host yang kami sambungkan). Ini mulai menjadi sedikit sulit dan saya ingin tahu apakah ada cara untuk memecah file .ssh / config menjadi beberapa file. Idealnya, kami akan menentukan di suatu tempat bahwa file lain akan diperlakukan sebagai file .ssh / config, mungkin seperti:

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

Saya telah membaca dokumentasi di ssh / config, dan saya tidak melihat ini mungkin. Tetapi mungkin orang lain memiliki masalah yang sama dan telah menemukan solusi.

penengkar
sumber
Mintalah setiap pengguna masuk ke host bastion dengan nama pengguna mereka sendiri. Juga, apa yang Anda masukkan ke file konfigurasi yang memerlukan entri untuk setiap host? Tidak bisakah Anda menetapkan beberapa standar yang umum?
Jed Daniels
1
Pertanyaan yang sama di superuser.com: superuser.com/questions/247564/…
guettli
1
Segera, di OpenSSH 7.3 itu seharusnya mungkin. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

Jawaban:

51

The ~/.ssh/configFile tidak memiliki arahan untuk termasuk file lainnya, mungkin terkait dengan cek SSH untuk hak akses file.

Saran seputar hal ini dapat mencakup skrip untuk membuat beberapa perubahan bersama-sama baik pada sistem atau melalui checkin hooks pada repositori. Orang mungkin juga melihat ke alat-alat seperti Wayang atau Augeas.

Bagaimanapun Anda mendekatinya, Anda harus menggabungkan file individual menjadi satu file dari luar file.

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

catatan: timpa: > vs tambahkan:>>

Pembaruan Desember 2017:

Dari 7.3p1 ke atas, ada opsi Sertakan. Yang memungkinkan Anda untuk memasukkan file konfigurasi.

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.
Jeff Ferland
sumber
Terima kasih Jeff, ini ide yang bagus. Saya tidak tahu terlalu banyak tentang Wayang atau Augeas, jadi demi menjaga hal-hal sesederhana mungkin, solusi Anda tampaknya yang terbaik. Saya dapat memecah konfigurasi menjadi beberapa konfigurasi, dan membuat skrip sederhana untuk membuat ulang file .ssh / config setiap kali salah satu file dimodifikasi. Saya tidak tahu seberapa bersih solusinya, tetapi tampaknya melakukan trik dan bekerja untuk tujuan saya.
wrangler
52

Anda dapat menentukan file konfigurasi saat ini untuk digunakan dalam opsi ssh seperti ini:

ssh -F /path/to/configfile

Sepertinya itu satu-satunya cara.

Juga tidak ada lagi untuk memasukkan satu konfigurasi ke yang lain.

buru-buru
sumber
Opsi yang bagus untuk digunakan saat menggunakan Perl's Net :: OpenSSH Module (mis. Untuk beberapa file kunci privat.), Di mana modul tidak memberikan semua kemungkinan.
Jimmy Koerting
36

Dimulai dengan ssh 7.3 (dirilis pada 1 Agustus 2016), Includearahan tersedia.

Sertakan : Sertakan file konfigurasi yang ditentukan. Beberapa nama path dapat ditentukan dan setiap pathname dapat berisi glob wildcard dan referensi "~" mirip shell ke direktori home user. File tanpa path absolut diasumsikan dalam ~/.ssh. Sebuah Includedirektif mungkin muncul di dalam Matchatau Hostmemblokir untuk melakukan inklusi bersyarat.

(Berikut ini tautan ke laporan bug yang diselesaikan, yang juga termasuk tambalan: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )

Christian Hudon
sumber
2
Itu terlalu keren. Nantikan ini. Akhirnya harus menyelesaikan masalah ini dengan cara yang benar :)
wrangler
2
Cukup tambahkan arahan Sertakan di bagian atas configfile. Saya tidak tahu mengapa itu tidak berhasil di bagian bawah.
pylover
17

Saya pribadi menggunakan perintah-perintah itu untuk mengkompilasi ssh config:

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

atau:

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)

karena:

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

tidak bekerja untuk saya, kembali:

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

Semoga ini bisa membantu.

Szymon Jeż
sumber
ssh -F <(cat .ssh/*.config)akan ideal. Saya datang dengan ini juga, tapi saya mendapatkan kesalahan yang sama. Adakah yang tahu apa masalahnya di sini?
sickill
2
ssh memeriksa izin file, saya pikir pengalihan semacam ini tidak mendukung pemeriksaan itu.
Camden Narzt
2

Saya juga akan menggunakan cat config_* > configuntuk menghasilkan seluruh konfigurasi. Tapi saya tidak akan menggunakan wayang / cfengine dll untuk ini, jika mereka belum di tempat (BTW: mengapa tidak menggunakan sistem manajemen konfigurasi ???).

Saya akan menghasilkan paket (deb, rpm) dan meletakkannya di repositori lokal. Dan dalam skrip postinst, kucing menghasilkan konfigurasi Anda. Mungkin Anda juga memasukkan folder lokal ... Keuntungannya adalah, pembaruan ssh / config diaktifkan setiap hari saat cron-apt & Co dijalankan.

ThorstenS
sumber
0

Anda bisa menggunakan Makefile di ~/.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

Kemudian pindahkan yang ada configke config.indan jalankan makeuntuk menghasilkan config.

kebiru-biruan
sumber
0

Saya telah bermain dengan konsep config.ddirektori untuk pengaturan konfigurasi saya. Jadi untuk menambah tumpukan opsi di atas, inilah yang telah bekerja untuk saya.

Struktur direktori adalah sesuatu seperti

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

Fungsi yang membangun ~ / .ssh / config dan hidup di run-config shell saya adalah sebagai berikut

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
}

Secara opsional tambahkan sshMakeConfigke bagian bawah run-config Anda jika Anda ingin memastikan konfigurasi baru pada setiap sesi shell

Setiap kali saya perlu mengkompilasi ulang ~ / .ssh / config saya, saya melakukannya dengan menjalankan sshMakeConfigbeberapa bentuk (secara langsung, mencari run-config saya, atau memulai shell baru)

knope
sumber