題 有一種方法可以讓一個SSH配置文件包含另一個嗎?


如果重要:

  • 操作系統:Ubuntu 10.04
  • SSH:OpenSSH_5.3p1 Debian-3ubuntu5

我想要一個SSH配置文件包含另一個。用例是在默認情況下定義我想要的任何內容 .ssh/config 文件,然後在一個單獨的文件中預先添加幾個額外的東西(例如 ~/.ssh/foo.config)。我希望第二個文件包含第一個文件,所以我不必復制第一個文件中的所有內容。那可行嗎?謝謝!


115
2018-02-18 17:45


起源


關於serverfault的同樣問題: serverfault.com/questions/375525/... - guettli


答案:


從7.3p1及以上,有 Include 關鍵詞, 它允許您包含配置文件。

Include

      包括指定的配置文件。   可以指定多個路徑名和每個路徑名   可能包含glob(3)通配符,   對於用戶配置,類似shell的“〜”引用用戶主頁   目錄。沒有絕對路徑的文件是   假設在 ~/.ssh 如果包含在用戶配置文件中   要么 /etc/ssh 如果包括在內   系統配置文件。 Include 指令可能   出現在一個 Match 要么 Host 塊   執行條件包含。
資源: ssh_config中(5)

例如,你可以擁有 ~/.ssh/config

Include config.d/home

Host github.com
    HostName github.com
    User git

並在 ~/.ssh/config.d/home

Host laptop
    HostName laptop.lan

從評論中,使用下面的內容包括所有文件 config.d 目錄:

Include config.d/* 

109
2017-11-05 20:12



使用$ ssh -V檢查版本 - Pieter
使用 Include config.d/* 包括所有條目 config.d。 - Simon Woodside
Ftr:這必須放在文件的頂部,不能只是附加到列表中 Host 條目。 - dtk
試過Ubuntu 16.04。雖然,它有效,但是 自動完成功能已損壞 這使它沒那麼有用。如果要在ubuntu上升級ssh,請選中此鏈接 gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677 - cwhsu


不,據我所知,這是不可能的。

以下是相應的開放功能請求/錯誤票證的鏈接:

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

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


29
2018-02-18 17:54



還有Debian上的這個bug: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189 - Lluís
我的天啊。這是hapening。從2016-04-15 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3 - oschrenk


如果你想啟動一個ssh客戶端,你可以在bash中執行此操作:

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

然後你正常使用ssh,它將按順序讀取兩個文件。

對於服務器守護程序 sshd 你也可以這樣做,只需使用 -f 代替 -F 並將其寫入您直接啟動守護程序的位置。你不需要別名。

根據手冊頁的第二種可能性是將系統範圍的配置放入 /etc/ssh/ssh_config 和用戶一個 ~/.ssh/config

更新 顯然,某些bash版本存在一些問題以及如何創建設備。 (看到 http://bugs.alpinelinux.org/issues/1465

這是一種解決方法(雖然在我看來很難看):

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

所以如果你願意,你可以用它(或腳本)創建一個函數:

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"
}

24
2018-04-19 10:51



遺憾的是,這不適用於OSX的ssh:無法打開用戶配置文件/ dev / fd / 63:錯誤的文件描述符 - Ash Berlin-Taylor
它對我來說也不起作用(Ubuntu 11.10)Linux給出與上面發布的@AshBerlin相同的錯誤。 - Szymon Jeż
@AshBerlin你也可以嘗試一下,這也適用於OSX,直到修復bug - estani
給出ssh檢查三個位置,1。命令行,2。 ~/.ssh/config,3。 /etc/ssh/ssh_config,你不應該通過 ~/.ssh/config 在命令行上也是如此。只是 alias ssh='ssh -F ~/.ssh/foo.config' 和 ~/.ssh/config 應該在那之後被接走。只要你不介意 foo.config 首先加載應該比上面的解決方法更乾淨。 - jim
@jim沒有它不那樣的工作。發現的第一個被使用。你試過嗎?從手冊頁“-F configfile:指定一個 替代 每用戶配置文件。如果在命令行上給出配置文件,則將忽略系統範圍的配置文件(/ etc / ssh / ssh_config)。“ - estani


從ssh 7.3開始(2016年8月1日發布),a Include 指令可用。

包括:包括指定的配置文件。多路徑   可以指定名稱,每個路徑名可以包含glob   通配符和類似shell的“〜”引用用戶主目錄。   假設沒有絕對路徑的文件在 ~/.ssh。一個    Include 指令可能出現在一個 Match 要么 Host 阻止   執行條件包含。

(這是已解決的錯誤報告的鏈接,其中還包括補丁: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24


16
2017-07-11 15:22





與其他'醜陋'相似,這裡是我的單行:

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

14
2018-02-21 09:02



注意 sftp 命令不會觸發配置重新計算。 - VasyaNovikov
(我仍然喜歡這個答案,因為它使用“config.d /”並且非常簡單。) - VasyaNovikov
簡單,優雅,但hacky - code_monk


好吧,我有點欺騙這樣做。在我的bash .profile-ish文件中,我有一個塊在登錄時替換了我的主目錄的各個部分,所以我每次只生成一個新的。例:

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

這也讓我可以做一些事情,例如,只有當我在主機A或B上,而不是在我的家庭系統上時,才將配置塊添加到ssh配置文件中。

現在我知道,有人會抱怨說,如果你登錄很多,這可能導致過度減速,但實際上我從來沒有真正注意到它。而且我相信你可以把它放在一個腳本中並通過cron解僱它。


6
2017-11-20 19:26





我個人使用這些命令來編譯ssh配置:

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

要么:

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)

因為:

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

對我不起作用,回歸:

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

希望這會有任何幫助。


3
2017-11-27 15:14



您可以更進一步將其與fswatch結合使用,以便在文件更改時進行自動編譯 - cavalcade


另一種基於FUSE的解決方案(未經我自己測試):

https://github.com/markhellewell/sshconfigfs

“而不是必須繼續管理一個大文件,而是從許多較小的邏輯塊動態地構建配置”文件。“

我還通過FIFO發現了一篇文章: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/


3
2018-06-10 17:54



這在我看來是這樣的 只是一個到外部網站的鏈接 因此可能會被刪除。 (因為鏈接可能“死亡”,至少有助於總結來自其他地方的內容,因此人們沒有義務訪問其他網站以獲取任何細節。) - pnuts
我發現評論內容足夠描述 - 它說“FUSE”(也許擴大首字母縮略詞會更好);該鏈接僅適用於實施。 - aviv
保險絲。 @aviv嗯,答案還沒有被刪除,所以希望沒有傷害! - pnuts
沒有意識到簡答題,答案擴大了。看起來我將不得不在沒有電子郵件通知的情況下不時檢查網站以獲取我的答案:)學習使用favs,現在。感謝您的評論。 - amontero