web-dev-qa-db-ja.com

あるSSH設定ファイルに別の設定ファイルを含む方法はありますか?

それが重要な場合:

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

あるSSH設定ファイルに別の設定ファイルを含めたいのですが。ユースケースは、私のデフォルトの.ssh/configファイルに欲しいものを何でも定義して、それから別のファイル(例えば~/.ssh/foo.config)の中にいくつかの余分な事柄を追加することです。ただし、2番目のファイルに最初のファイルを組み込んでもらいたいので、最初のファイルにすべてを複製する必要はありません。それは可能ですか?ありがとうございます。

126
Joe Casadonte

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

Include

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

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

これは、対応する未解決の機能要求/バグチケットへのリンクです。

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

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

28
rems

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ページによる2番目の可能性は、システム全体の設定を/etc/ssh/ssh_configに、ユーザーの設定を~/.ssh/configに入れることです。

更新どうやら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" "[email protected]"
    rm "$tmp_fifo"
}
24
estani

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

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

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

17
Christian Hudon

他の「醜い」ものと同じように、ここで私のものはワンライナーです:

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

まあ、私はちょっとこれをするためにカンニングをする。私の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

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

https://github.com/markhellewell/sshconfigfs

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

FIFO経由でこれを行う記事も見つかりました。 http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/

3
amontero

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

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

3
Szymon Jeż

これらの別名の解決策はどれも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セッションを変更した場合、変更内容が失われてしまうため、既存のファイルが.bakファイルに移動されないようにすることです。 (2行目)問題は、しばらくしてからたくさんの.bakファイルがあることです。

2
Dean Rather

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
1
panticz.de

私の馬鹿な答え:

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

だから私はこれを解決しました:

  • 個別のOpenSSH設定ファイルを~/.ssh/config.d/に保存します。
  • 変更するときはcat ~/.ssh/config.d/* > ~/.ssh/configをしてください
  • 栄光の日に、OpenSSH 7.3p1以降のディストリビューションバージョンにアップグレードすると、代わりに次のものを含むファイルを作成できます。

Include config.d/*

0
Adrian

私のマシンの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
gmathio