あるSSH構成ファイルに別のSSH構成ファイルを含める方法はありますか?


131

重要な場合:

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

あるSSH構成ファイルに別のものを含めたいのですが。ユースケースは、既定の.ssh/configファイルで必要なものを定義し、別のファイル(たとえば、~/.ssh/foo.config)にいくつかの余分なものを追加することです。ただし、2番目のファイルに最初のファイルを組み込みたいので、最初のファイルのすべてを複製する必要はありません。それはできますか?ありがとう!


2
serverfaultの上の同じ質問:serverfault.com/questions/375525/...
guettli

回答:


140

7.3p1以降には、Include設定ファイルを含めることができるキーワードがあります。

Include

    指定された構成ファイルを含めます。複数のパス名を指定でき、各パス名にはglob(3)ワイルドカードを含めることができ、ユーザー設定の場合は、ユーザーのホームディレクトリへのシェルのような「〜」参照を含めることができます。絶対パスのないファイル~/.sshは、ユーザー構成ファイルに/etc/ssh含まれている場合、またはシステム構成ファイルから含まれている場合にあると見なされます。  Includeディレクティブは、条件付き包含を実行するためにMatchor 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/* 

13
$ ssh -Vでバージョンを確認してください
Pieter

7
Include config.d/*すべてのエントリを含めるために使用しますconfig.d
サイモンウッドサイド

17
Ftr:これはファイルの先頭に移動する必要があり、Hostエントリのリストに単に追加することはできません。
dtk

2
Ubuntu 16.04で試しました。ただし、動作しますが、オートコンプリートが壊れているため、役に立たなくなります。Ubuntuでsshをアップグレードする場合は、このリンクを確認してくださいgist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu

@dtkありがとう。それが私を困惑させたものです
Adam Keenan

28

いいえ、私の知る限り、これは不可能です。

対応するオープン機能のリクエスト/バグチケットへのリンクは次のとおりです。

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

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


2
Debianの上でも、このバグ:bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189
リュイス

8
ああ、神様。それは幸福です。2016Slightly modified patch applied, this will be in openssh-7.3
4

この答えは当時は正しかったのですが、今では時代遅れです。
マークストースバーグ

25

sshクライアントを起動したい場合は、bashでこれを行うことができます。

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

その後、通常sshを使用すると、両方のファイルがこの順序で読み取られます。

サーバーデーモンについてもsshd同じことができます。-f代わりに使用して-F、デーモンを直接起動する場所に書き留めてください。エイリアスは必要ありません。

マニュアルページによると、2番目の可能性は、システム全体の設定を入力/etc/ssh/ssh_configし、ユーザー設定を設定すること~/.ssh/configです。

更新一部のbashバージョンとデバイスの作成方法に問題があるようです。(http://bugs.alpinelinux.org/issues/1465を参照)

これは回避策です(私の意見ではopinionいですが)。

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

1
悲しいことに、これはOSXのsshでは機能しません。ユーザー設定ファイルを開くことができません/ dev / fd / 63:不正なファイル記述子
Ash Berlin-Taylor

(Ubuntu 11.10)Linuxでも動作しません。上記の@AshBerlinと同じエラーが発生します。
のSzymonジェズ

@AshBerlinあなたも試してみてください、これはバグが修正されるまでOSXでも機能するはず
です-estani

sshが3つの場所、1。コマンドライン、2. ~/.ssh/config、3をチェック/etc/ssh/ssh_configする場合~/.ssh/config、コマンドラインを渡す必要もありません。ちょうどalias ssh='ssh -F ~/.ssh/foo.config'そして~/.ssh/configその後、ピックアップされるはずです。foo.config最初にロードされることを気にしない限り、上記の回避策よりもクリーンである必要があります。
ジム

1
@jimいいえ、それはそのように動作しません。最初に見つかったものが使用されます。試しましたか?manページから「-F configfile:代替のユーザーごとの構成ファイルを指定します。構成ファイルがコマンドラインで指定されている場合、システム全体の構成ファイル(/ etc / ssh / ssh_config)は無視されます。」
-estani

17

ssh 7.3(2016年8月1日リリース)以降、Includeディレクティブが使用可能になりました。

含める:指定した構成ファイルを含めます。複数のパス名を指定でき、各パス名にはグロブワイルドカードとユーザーホームディレクトリへのシェルのような「〜」参照を含めることができます。絶対パスのないファイルはにあると想定されます~/.sshIncludeディレクティブは、内部表示されることMatch、またはHost条件付き包含を実行するためにブロック。

(これは解決されたバグレポートへのリンクで、パッチも含まれていますhttps : //bugzilla.mindrot.org/show_bug.cgi?id= 1585#c24 )


14

他の「ugい」と同様に、ここに私のワンライナーがあります:

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

sftpコマンドは設定の再計算をトリガーしないことに注意してください。
VasyaNovikov

2
(「config.d /」を使用し、非常に単純であるため、私はまだ答えが好きです。)
VasyaNovikov

2
シンプルでエレガント、まだハック
code_monk

6

まあ、私はこれを行うためにちょっとカンニング。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経由でも起動できると確信しています。


3

私は個人的にこれらのコマンドを使用して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

これが助けになることを願っています。


さらに一歩進んで、これをfswatchと組み合わせて、ファイル変更時の自動コンパイルを行うことができます
-cavalcade

3

もう1つのFUSEベースのソリューション(自分でテストしていない):

https://github.com/markhellewell/sshconfigfs

「1つの大きなファイルを管理し続ける代わりに、[...]代わりに、多数の小さな論理チャンクから動的に構成「ファイル」を構築します。」

FIFOを介してこれを行う記事も見つけました:http : //www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/


1
コメントの内容は十分に説明的であることがわかりました-「FUSE」と書かれています(おそらく頭字語を広げる方が良いでしょう)。リンクは実装へのリンクです。
アビブ

1
短い回答の問題を認識していなかったため、回答を拡大しました。電子メール通知がない場合は、時々サイトの回答を確認する必要があるようです:)今までに、favsの使用方法を学びました。コメントをありがとう。
アモンテロ

2

これらのエイリアスソリューションはgitいずれも、または以外の他のプログラムでは機能しませんssh

私は一緒に素早く汚いを平手打ちしましたが、あなたはそれを改善したいかもしれません。

これを追加します ~/.bashrc

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

セッションを開始するたびに、のすべてのファイルがマージされ~/.ssh/config.dます。(3行目)

このバージョンの欠点は、~/.ssh/config次のセッションを変更すると、開いている変更が失われるため、既存のファイルを.bakファイルに移動できないようにすることです。(2行目)問題は、しばらくすると大量の.bakファイルが作成されることです。


いくつかのis_anything_changed条件を追加すると優れた
vp_arth

1

Yakketyからパッケージをインストールすることにより、UbuntuのSSHバージョンをv7.3(Ubuntu Xenial 16.04でテスト済み)に簡単にアップグレードできます。

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バージョンを確認する

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

〜/ .ssh / config.dディレクトリーからインクルードを使用するようにSSHを構成する

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

0

私の愚かな答え:

  • XenialにOpenSSH> 7.3をインストールしようとしました(16.04)
  • それが作った混乱が好きではなかった

だから私はこれに落ち着いた:

  • 個別のOpenSSH構成ファイルを ~/.ssh/config.d/
  • 変更するときは cat ~/.ssh/config.d/* > ~/.ssh/config
  • 輝かしい日に、OpenSSH 7.3p1以降を備えたディストリビューションバージョンにアップグレードすると、代わりに以下を含むファイルを作成できます。

Include config.d/*


0

マシンのSSHもアップグレードできません。

GNU makeを使用して、必要な場合にのみ ssh構成ファイルを生成しました。

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

次に、sshのエイリアスが作成されます

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

それは魅力のように機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.