複数のホストに接続するために使用する要塞サーバーがあり、.ssh/configが数千行以上に増えています(接続するホストは数百あります)。これは少し扱いにくいものになり始めており、.ssh/configファイルを複数のファイルに分割する方法があるかどうか知りたいのですが。理想的には、他のファイルが.ssh/configファイルとして扱われるような場所を指定します。
~/.ssh/config
~/.ssh/config_1
~/.ssh/config_2
~/.ssh/config_3
...
Ssh/configのドキュメントを読みましたが、これが可能であるとは思いません。しかし、おそらく他の誰かが同様の問題を抱えており、解決策を見つけました。
~/.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.
次のように、sshオプションで使用する現在の構成ファイルを指定できます。
ssh -F /path/to/configfile
それが唯一の方法のようです。
また、ある設定を別の設定に含める方法もありません。
Ssh 7.3(2016年8月1日にリリース)から、Include
ディレクティブが利用可能になりました。
Include:指定された構成ファイルを含めます。複数のパス名を指定でき、各パス名には、globワイルドカードとユーザーのホームディレクトリへのシェルのような「〜」参照を含めることができます。絶対パスのないファイルは
~/.ssh
にあると見なされます。Include
ディレクティブをMatch
またはHost
ブロック内に指定して、条件付きの包含を実行できます。
(これは、修正済みのバグレポートへのリンクであり、パッチも含まれています: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )
私は個人的にこれらのコマンドを使用して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
これが役に立てば幸いです。
また、cat config_* > config
を使用して、構成全体を生成します。ただし、puppet/cfengineなどをまだ使用していない場合は、使用しません(ところで、構成管理システムを使用しないのはなぜですか???)。
パッケージ(deb、rpm)を生成して、ローカルリポジトリに配置します。そしてpostinstスクリプトで、猫はあなたの設定を生成します。おそらく、ローカルフォルダーも含めます...利点は、cron-apt&Coの実行中にssh/configの更新が毎日アクティブになることです。
私は構成を整理するために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をソースするか、新しいシェルを開始します)
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
を生成します。