それが重要な場合:
あるSSH設定ファイルに別の設定ファイルを含めたいのですが。ユースケースは、私のデフォルトの.ssh/config
ファイルに欲しいものを何でも定義して、それから別のファイル(例えば~/.ssh/foo.config
)の中にいくつかの余分な事柄を追加することです。ただし、2番目のファイルに最初のファイルを組み込んでもらいたいので、最初のファイルにすべてを複製する必要はありません。それは可能ですか?ありがとうございます。
7.3p1以降ではInclude
キーワードがあり、これを使用して設定ファイルを含めることができます。
Include
指定された設定ファイルを含めます。複数のパス名を指定することができ、各パス名にglob(3)ワイルドカードを含めることができ、ユーザー設定では、シェルのようなユーザーホームディレクトリへの "〜"参照を含めることができます。絶対パスのないファイルは、ユーザー設定ファイルに含まれる
出典: ssh_config(5) 。~/.ssh
if、またはシステム設定ファイルに含まれる/etc/ssh
ifにあると見なされます。Include
ディレクティブは、Match
またはHost
の中に記述して条件付き包含を実行する。
たとえば、~/.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/*
いいえ、私の知る限りこれは不可能です。
これは、対応する未解決の機能要求/バグチケットへのリンクです。
https://bugzilla.mindrot.org/show_bug.cgi?id=1585
https://bugs.launchpad.net/ubuntu/+source/openssh/+ bug/739495
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" "$@"
rm "$tmp_fifo"
}
Ssh 7.3(2016年8月1日リリース)以降、Include
ディレクティブが利用可能になりました。
インクルード:指定した設定ファイルをインクルードします。複数のパス名を指定でき、各パス名にはグロブワイルドカードとシェルのようなユーザーホームディレクトリへの参照を含めることができます。絶対パスのないファイルは
~/.ssh
にあると見なされます。Include
ディレクティブは、条件付き包含を実行するためにMatch
またはHost
ブロックの中に現れることがあります。
(これは解決されたバグレポートへのリンクで、パッチも含まれています: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )
他の「醜い」ものと同じように、ここで私のものはワンライナーです:
alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
まあ、私はちょっとこれをするためにカンニングをする。私の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経由でも発射できると確信しています。
もう1つの、ヒューズベースのソリューション(自分でテストしていない):
https://github.com/markhellewell/sshconfigfs
「1つの大きなファイルを管理し続ける必要はなく、代わりに多数の小さな論理チャンクから動的に設定ファイルを構築します。」
FIFO経由でこれを行う記事も見つかりました。 http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/
私は個人的にこれらのコマンドを使って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
これが助けになることを願っています。
これらの別名の解決策はどれもgit
やssh
以外の他のプログラムには使えません。
私は一気にまとめましたが、あなたはそれを改善したいと思うかもしれません。
これをあなたの~/.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ファイルがあることです。
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
私の馬鹿な答え:
だから私はこれを解決しました:
~/.ssh/config.d/
に保存します。cat ~/.ssh/config.d/* > ~/.ssh/config
をしてくださいInclude config.d/*
私のマシンの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'
それは魅力のように働きます。