web-dev-qa-db-ja.com

〜/ .ssh / configファイルを複数持つことはできますか?

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

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

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

86
wrangler

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

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

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

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

注:上書き:>v.s。追加:>>

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.
58
Jeff Ferland

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

ssh -F /path/to/configfile

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

また、ある設定を別の設定に含める方法もありません。

57
rush

Ssh 7.3(2016年8月1日にリリース)から、Includeディレクティブが利用可能になりました。

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

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

37
Christian Hudon

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

これが役に立てば幸いです。

17
Szymon Jeż

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

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

2
ThorstenS

私は構成を整理するために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
}

各Shellセッションで新しい設定を確実にしたい場合は、必要に応じてsshMakeConfigをrun-configの最後に追加します

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

0
knope

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

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

0
blueyed