openssh – 一つの SSH 設定ファイルに別の設定ファイルをインクルードする方法はありますか?

openssh ssh

それが重要な場合には

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

一つの SSH 設定ファイルに別の設定ファイルを含めたいと思います。使用例としては、デフォルトの .ssh/config ファイルに好きなものを定義して、別のファイル (~/.ssh/foo.config など) にいくつかの余分なものを前置しておくことです。しかし、最初のファイルのすべてを複製する必要がないように、2つ目のファイルには最初のファイルを組み込みたいと思っています。これは可能でしょうか?ありがとうございます

  166  Joe Casadonte  2011-02-18


ベストアンサー

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

Include

    指定された設定ファイルを含む。複数のパス名を指定することができ、各パス名には glob(3) ワイルドカードや、ユーザ設定では、ユーザのホームディレクトリへのシェルのような “~” 参照を含めることができます。 絶対パスのないファイルは、ユーザ設定ファイルに含まれている場合は ~/.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/*

195  Osaka  2016-11-05


いや、私の知る限りでは、これは不可能だ

ここでは、対応するオープンな機能要求/バグチケットへのリンクを示しています

1585 – Allow an `Include' option which reads another config file in place and does not error out when `Include' file not readable
Bug #739495 “include in .ssh/config” : Bugs : openssh package : Ubuntu
Could you implement sub-config including feature, please? It's very useful to split a user config file into many pieces if you have a many hosts.

28  rems  2011-02-18


sshクライアントを起動したい場合は、bashでこのようにするといいでしょう

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

とすると、通常は ssh を使用して、両方のファイルをこの順番で読み込ませることができます

サーバデーモン sshd のために、-F の代わりに -f を使用して、直接デーモンを起動する場所を書き留めておくことで、同じことができます

man ページによると、システム全体の設定を /etc/ssh/ssh_config に、ユーザの設定を ~/.ssh/config に置くというのが第二の可能性です

Update どうやらいくつかの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"
}

25  estani  2012-04-19


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

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

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

17  Christian Hudon  2016-07-11


他の「ブス」と同様に、ここでは私のワンライナーを紹介します

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

14  Aleksandr Makov  2013-02-21


まあ、これをするためにちょっとしたチートをしています。私のbash .profile的なファイルの中に、ログイン時にホームディレクトリの様々な部分を置き換えるブロックがあるので、毎回新しいものを生成しています。例

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  Dave  2012-11-20


個人的には、これらのコマンドを使って 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.)

or:

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)

because:

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

は私のために動作しません、戻ります

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

少しでもお役に立てれば幸いです

3  Szymon Jeż  2012-11-27


もう一つ、FUSEベースのソリューション(自分ではテストしていません)

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over 420 million projects.

“一つの大きなファイルを管理し続けるのではなく、[…]代わりに、多くの小さな論理的な塊から動的にコンフィグ “ファイルを構築します

FIFO経由でこれをやっている記事も見つけました。http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/

3  amontero  2013-06-10


これらのエイリアス解決策は、gitssh以外のプログラムでは動作しません

手っ取り早くまとめたけど改善した方がいいよ

これを~/.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を変更した場合、次のセッションを開いたときに変更内容が失われてしまうことです。(2行目) 問題は、しばらくするとたくさんの.bakファイルができてしまうことです

2  Dean Rather  2015-05-19


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

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 で ~/.ssh/config.d ディレクトリからインクルードを使用するように設定します

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

1  panticz.de  2017-03-21


私の間抜けな答えは

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

だから私はこれに落ち着きました

  • 別々の OpenSSH 設定ファイルは ~/.ssh/config.d/ に保管してください
  • 1を変更するときは、cat ~/.ssh/config.d/* > ~/.ssh/configを行います
  • あなたが OpenSSH 7.3p1 以降のバージョンのディストロにアップグレードした輝かしい日には、 代わりに OpenSSH 7.3p1 を含むファイルを作成することができます

Include config.d/*

0  Adrian  2018-05-06


私のマシンでも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'

それは魅力的に機能します

0  Benjam  2018-08-16


タイトルとURLをコピーしました