複数の〜/ .ssh / configファイルを使用できますか?


82

複数のホストに接続するために使用する要塞サーバーがあり、.ssh / configが1000行を超えました(何百ものホストが接続されています)。これは少し扱いに​​くいものになり始めており、.ssh / configファイルを複数のファイルに分割する方法があるかどうかを知りたいと思います。理想的には、他のファイルが.ssh / configファイルとして扱われる場所を指定します。

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

私はssh / configのドキュメントを読みましたが、これが可能であるとは思いません。しかし、他の誰かが同様の問題を抱えており、解決策を見つけた可能性があります。


各ユーザーに自分のユーザー名で要塞ホストにログインしてもらいます。また、各ホストのエントリを必要とする構成ファイルに何を入れていますか?一般的なデフォルトを設定できませんか?
ジェドダニエルズ

1
superuser.comに同じ質問:superuser.com/questions/247564/...
guettli

1
すぐに、OpenSSH 7.3で可能になるはずです。bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

回答:


51

この~/.ssh/configファイルには、他のファイルを含めるためのディレクティブがありません。これは、SSHのファイル許可のチェックに関連している可能性があります。

これに関する提案には、システム上で、またはリポジトリのチェックインフックを介して、いくつかの変更をまとめて管理するスクリプトを含めることができます。PuppetやAugeasなどのツールを検討することもできます。

ただし、どのようにアプローチしても、個々のファイルを連結して、ファイルの外部から単一のファイルにする必要があります。

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

注: 上書き:> vs追加:>>

2017年12月の更新:

7.3p1以降には、[含める]オプションがあります。これにより、構成ファイルを含めることができます。

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.

ジェフのおかげで、これは良いアイデアです。私はPuppetやAugeasについてあまり知りませんので、物事を可能な限りシンプルに保つために、あなたの解決策が最良のようです。構成を複数の構成に分割し、ファイルの1つが変更されるたびに.ssh / configファイルを再作成する単純なスクリプトを作成できます。これがどれだけきれいなのかはわかりませんが、それはうまくいくようで、私の目的には役立ちます。
ラングラー

52

次のように、sshオプションで使用する現在の構成ファイルを指定できます。

ssh -F /path/to/configfile

それが唯一の方法のようです。

また、ある構成を別の構成に含めることもできません。


PerlのNet :: OpenSSHモジュール(複数のプライベートキーファイルなど)を使用する場合、モジュールがすべての可能性を与えるわけではないオプションがあります。
ジミーケーティング16年

36

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

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

(ここに解決済みのバグレポートへのリンクがあり、パッチも含まれていますhttps : //bugzilla.mindrot.org/show_bug.cgi?id=1585#c24


2
それはあまりにもクールです。これを楽しみにしています。最終的にこの問題を正しい方法で解決する必要があります:)
ラングラー

2
configファイルの先頭にIncludeディレクティブを追加するだけです。なぜそれが下部で機能していないのか分かりません。
pylover

17

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

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


ssh -F <(cat .ssh/*.config)理想的です。私もこれを思いつきましたが、同じエラーが出ています。誰もがここの問題は何ですか?
病気

2
sshはファイルのパーミッションをチェックします。この種のリダイレクトはそのチェックをサポートしていません。
カムデンナーツ

2

またcat config_* > config、設定全体を生成するために使用します。しかし、puppet / cfengineなどをまだ使用していない場合は使用しません(ところで:構成管理システムを使用しない理由は?)。

パッケージ(deb、rpm)を生成し、ローカルリポジトリに配置します。そして、postinstスクリプトでは、猫が設定を生成します。おそらくローカルフォルダーも含めます...利点は、cron-apt&Coの実行中にssh / configの更新が毎日実行されることです。


0

次の場所でMakefileを使用できます~/.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

次に、既存のものconfigを移動してconfig.in実行makeし、生成しconfigます。


0

私はconfig.d自分の設定を整理するためのディレクトリの概念で遊んでいます。したがって、上記のオプションの山に追加するために、ここに私のために働いているものがあります。

ディレクトリ構造は次のようなものです

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

〜/ .ssh / configをビルドし、私のシェルのrun-configに存在する関数は次のとおりです

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
}

必要に応じsshMakeConfigて、各シェルセッションで新しい構成を確認する場合は、run-configの最後に追加します

〜/ .ssh / configを再コンパイルする必要があるときはいつでもsshMakeConfig、何らかの形で実行することで(直接、run-configのソースを取得するか、新しいシェルを開始します)

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