Apakah ada cara untuk satu file konfigurasi SSH untuk memasukkan yang lain?

131

Dalam hal itu penting:

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

Saya ingin satu file konfigurasi SSH untuk memasukkan yang lain. Kasus penggunaannya adalah untuk menentukan apa pun yang saya inginkan dalam .ssh/configfile default saya dan kemudian menunggu beberapa hal tambahan dalam file terpisah (misalnya ~/.ssh/foo.config). Saya ingin file kedua untuk menggabungkan yang pertama, jadi saya tidak perlu menduplikasi semuanya di yang pertama. Apakah itu bisa dilakukan? Terima kasih!

Joe Casadonte
sumber
2
Pertanyaan yang sama pada serverfault: serverfault.com/questions/375525/…
guettli

Jawaban:

140

Dari 7.3p1 ke atas, ada Includekata kunci, yang memungkinkan Anda untuk memasukkan file konfigurasi.

Include

    Sertakan file konfigurasi yang ditentukan. Beberapa nama path dapat ditentukan dan setiap pathname dapat berisi glob (3) wildcard dan, untuk konfigurasi pengguna, referensi “~” mirip shell ke direktori home user. File tanpa path absolut diasumsikan ada ~/.sshjika dimasukkan dalam file konfigurasi pengguna atau /etc/sshjika disertakan dari file konfigurasi sistem.  Includearahan dapat muncul di dalam Matchatau Hostmemblokir untuk melakukan inklusi bersyarat
Sumber: ssh_config (5) .

Misalnya Anda dapat memiliki di ~/.ssh/config:

Include config.d/home

Host github.com
    HostName github.com
    User git

dan di ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

Dari komentar, gunakan di bawah ini untuk memasukkan semua file dalam config.ddirektori:

Include config.d/* 
Osaka
sumber
13
periksa versi dengan $ ssh -V
Pieter
7
Gunakan Include config.d/*untuk memasukkan semua entri dalam config.d.
Simon Woodside
17
Ftr: ini harus masuk di bagian atas file dan tidak bisa hanya ditambahkan ke daftar Hostentri.
dtk
2
mencoba di Ubuntu 16.04. Meskipun berfungsi, namun pelengkapan otomatis rusak yang membuatnya kurang berguna. Jika Anda ingin memutakhirkan ssh di ubuntu, periksa tautan ini gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu
@ Dtk terima kasih untuk itu. Itulah yang mengejutkan saya
Adam Keenan
28

Tidak, setahu saya ini tidak mungkin.

Berikut ini tautan ke permintaan fitur terbuka / tiket bug:

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

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

rem
sumber
2
Juga bug ini di Debian: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189
Lluís
8
YA TUHAN. Ini sedang terjadi. Dari 2016-04-15 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3
oschrenk
Jawaban ini benar pada saat itu, tetapi sudah usang sekarang.
Mark Stosberg
25

Jika Anda ingin memulai klien ssh, Anda bisa melakukan ini di bash:

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

maka Anda menggunakan ssh secara normal dan kedua file akan dibaca dalam urutan itu.

Untuk daemon server sshdAnda dapat melakukan hal yang sama, gunakan saja -falih-alih -Fdan tulis ini di mana Anda memulai daemon secara langsung. Anda tidak perlu alias.

Kemungkinan kedua menurut halaman manual adalah untuk menempatkan konfigurasi sistem yang lebar /etc/ssh/ssh_configdan yang di pengguna ~/.ssh/config.

Pembaruan Rupanya ada beberapa masalah dengan beberapa versi bash dan bagaimana perangkat dibuat. (lihat http://bugs.alpinelinux.org/issues/1465 )

Ini adalah solusi (meskipun menurut saya jelek):

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

jadi jika Anda mau, Anda dapat membuat fungsi darinya (atau skrip):

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"
}
estani
sumber
1
Sayangnya ini tidak berfungsi pada OSX's ssh: Tidak dapat membuka file konfigurasi pengguna / dev / fd / 63: deskriptor file buruk
Ash Berlin-Taylor
Ini tidak berfungsi untuk saya juga di (Ubuntu 11.10) Linux memberikan kesalahan yang sama seperti @AshBerlin diposting di atas.
Szymon Jeż
@ AshBerlin Anda dapat mencobanya juga, ini harus bekerja juga untuk OSX, sampai bug diperbaiki
estani
Diberikan ssh memeriksa tiga tempat, 1. baris perintah, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, Anda tidak perlu meneruskan ~/.ssh/configbaris perintah juga. Adil alias ssh='ssh -F ~/.ssh/foo.config'dan ~/.ssh/configharus dijemput setelah itu. Selama Anda tidak keberatan foo.configdimuat pertama yang harus lebih bersih daripada solusi di atas.
jim
1
@jim tidak, itu tidak berfungsi seperti itu. Yang pertama ditemukan digunakan. Sudahkah Anda mencobanya? dari halaman manual "-F configfile: Menentukan file konfigurasi per-pengguna alternatif . Jika file konfigurasi diberikan pada baris perintah, file konfigurasi sistem (/ etc / ssh / ssh_config) akan diabaikan."
estani
17

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 mencakup tambalan: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )

Christian Hudon
sumber
14

Demikian pula dengan yang lain 'jelek' di sini milikku satu-liner:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
Aleksandr Makov
sumber
Perhatikan bahwa sftpperintah tidak akan memicu perhitungan ulang konfigurasi.
VasyaNovikov
2
(Saya masih suka jawabannya karena menggunakan "config.d /" dan sangat sederhana.)
VasyaNovikov
2
sederhana, anggun, namun
gagah
6

Yah, saya agak curang untuk melakukan ini. Dalam file .profile-ish bash saya, saya memiliki blok yang menggantikan berbagai bagian dari direktori home saya saat login, jadi saya hanya membuat yang baru setiap kali. Contoh:

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

Ini juga memungkinkan saya melakukan hal-hal seperti menambahkan blok konfigurasi ke file konfigurasi ssh hanya jika saya menggunakan host A atau B, tetapi tidak pada sistem rumah saya.

Sekarang saya tahu, seseorang akan mengeluh bahwa jika Anda login banyak ini dapat menyebabkan perlambatan yang berlebihan, tetapi dalam praktiknya saya tidak pernah benar-benar menyadarinya. Dan saya yakin Anda bisa memasukkan ini ke dalam skrip dan menjalankannya melalui cron juga.

Dave
sumber
3

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
Anda bisa melangkah lebih jauh dan menggabungkan ini dengan fswatch, untuk kompilasi otomatis pada perubahan file
cavalcade
3

Solusi lain berbasis FUSE (tidak menguji sendiri):

https://github.com/markhellewell/sshconfigfs

"Daripada harus terus mengelola satu file besar, [...] bukannya membangun" file "konfigurasi secara dinamis dari banyak potongan logis yang lebih kecil."

Saya juga menemukan artikel yang melakukan ini melalui FIFOs: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/

amontero
sumber
1
Saya menemukan konten komentar cukup deskriptif - ia mengatakan "FUSE" (Mungkin memperluas akronim akan lebih baik); Tautan ini hanya untuk implementasi.
aviv
1
Tidak mengetahui masalah jawaban singkat, jawaban diperluas. Sepertinya saya harus memeriksa kembali situs untuk jawaban saya dari waktu ke waktu, tanpa adanya pemberitahuan email :) Belajar menggunakan favs, sekarang. Terima kasih atas komentarnya.
amontero
2

Tidak ada solusi alias ini yang berfungsi untuk gitatau program lain selain ssh.

Saya telah menampar bersama yang cepat dan kotor, tetapi Anda mungkin ingin memperbaikinya.

Tambahkan ini ke ~/.bashrc

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

Setiap kali Anda memulai sesi, itu akan menggabungkan semua file ~/.ssh/config.d. (baris 3)

Kelemahan dari versi ini adalah bahwa jika Anda mengubah ~/.ssh/configsesi berikutnya Anda membuka perubahan Anda akan hilang, jadi untuk mencegah saya memindahkan file yang ada ke file .bak. (baris 2) Masalahnya adalah Anda akan memiliki banyak file .bak setelah beberapa saat.

Dean Sebaliknya
sumber
Sangat baik dengan menambahkan beberapa is_anything_changedkondisi
vp_arth
1

Anda dapat dengan mudah memutakhirkan versi SSH di Ubuntu ke v7.3 (diuji pada Ubuntu Xenial 16.04) dengan menginstal paket dari 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

Periksa versi SSH

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

Konfigurasikan SSH untuk digunakan termasuk dari direktori ~ / .ssh / config.d

mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config
panticz.de
sumber
0

Jawaban bodoh saya:

  • Mencoba memasang OpenSSH> 7.3 pada Xenial (16.04)
  • Tidak suka kekacauan yang dibuatnya

Jadi saya setuju untuk ini:

  • Simpan file konfigurasi OpenSSH terpisah Anda ~/.ssh/config.d/
  • Ketika Anda mengubahnya, lakukan cat ~/.ssh/config.d/* > ~/.ssh/config
  • Pada hari yang mulia Anda meningkatkan ke versi distro yang memiliki OpenSSH 7.3p1 atau lebih baru, Anda dapat membuat file yang berisi

Include config.d/*

Adrian
sumber
0

Saya tidak bisa memutakhirkan SSH di komputer saya juga.

Saya menggunakan GNU make untuk menghasilkan file konfigurasi ssh hanya bila diperlukan :

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

Kemudian ssh alias

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

Itu bekerja seperti pesona.

gmathio
sumber