重要な場合:
- OS:Ubuntu 10.04
- SSH:OpenSSH_5.3p1 Debian-3ubuntu5
あるSSH構成ファイルに別のものを含めたいのですが。ユースケースは、既定の.ssh/config
ファイルで必要なものを定義し、別のファイル(たとえば、~/.ssh/foo.config
)にいくつかの余分なものを追加することです。ただし、2番目のファイルに最初のファイルを組み込みたいので、最初のファイルのすべてを複製する必要はありません。それはできますか?ありがとう!
重要な場合:
あるSSH構成ファイルに別のものを含めたいのですが。ユースケースは、既定の.ssh/config
ファイルで必要なものを定義し、別のファイル(たとえば、~/.ssh/foo.config
)にいくつかの余分なものを追加することです。ただし、2番目のファイルに最初のファイルを組み込みたいので、最初のファイルのすべてを複製する必要はありません。それはできますか?ありがとう!
回答:
7.3p1以降には、Include
設定ファイルを含めることができるキーワードがあります。
Include
指定された構成ファイルを含めます。複数のパス名を指定でき、各パス名にはglob(3)ワイルドカードを含めることができ、ユーザー設定の場合は、ユーザーのホームディレクトリへのシェルのような「〜」参照を含めることができます。絶対パスのないファイル
ソース:ssh_config(5)。~/.ssh
は、ユーザー構成ファイルに/etc/ssh
含まれている場合、またはシステム構成ファイルから含まれている場合にあると見なされます。Include
ディレクティブは、条件付き包含を実行するためにMatch
orHost
ブロック内に表示される場合があります。
たとえば、次の場所にあります~/.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/*
Include config.d/*
すべてのエントリを含めるために使用しますconfig.d
。
Host
エントリのリストに単に追加することはできません。
いいえ、私の知る限り、これは不可能です。
対応するオープン機能のリクエスト/バグチケットへのリンクは次のとおりです。
https://bugzilla.mindrot.org/show_bug.cgi?id=1585
https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495
Slightly modified patch applied, this will be in openssh-7.3
sshクライアントを起動したい場合は、bashでこれを行うことができます。
#files are .ssh/config and ~/.ssh/foo.config
alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)'
その後、通常sshを使用すると、両方のファイルがこの順序で読み取られます。
サーバーデーモンについてもsshd
同じことができます。-f
代わりに使用して-F
、デーモンを直接起動する場所に書き留めてください。エイリアスは必要ありません。
マニュアルページによると、2番目の可能性は、システム全体の設定を入力/etc/ssh/ssh_config
し、ユーザー設定を設定すること~/.ssh/config
です。
更新一部のbashバージョンとデバイスの作成方法に問題があるようです。(http://bugs.alpinelinux.org/issues/1465を参照)
これは回避策です(私の意見ではopinionいですが)。
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/config
、3をチェック/etc/ssh/ssh_config
する場合~/.ssh/config
、コマンドラインを渡す必要もありません。ちょうどalias ssh='ssh -F ~/.ssh/foo.config'
そして~/.ssh/config
その後、ピックアップされるはずです。foo.config
最初にロードされることを気にしない限り、上記の回避策よりもクリーンである必要があります。
ssh 7.3(2016年8月1日リリース)以降、Include
ディレクティブが使用可能になりました。
含める:指定した構成ファイルを含めます。複数のパス名を指定でき、各パス名にはグロブワイルドカードとユーザーホームディレクトリへのシェルのような「〜」参照を含めることができます。絶対パスのないファイルはにあると想定されます
~/.ssh
。Include
ディレクティブは、内部表示されることMatch
、またはHost
条件付き包含を実行するためにブロック。
(これは解決されたバグレポートへのリンクで、パッチも含まれています:https : //bugzilla.mindrot.org/show_bug.cgi?id= 1585#c24 )
他の「ugい」と同様に、ここに私のワンライナーがあります:
alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
sftp
コマンドは設定の再計算をトリガーしないことに注意してください。
まあ、私はこれを行うためにちょっとカンニング。bashの.profile-ishファイルには、ログイン時にホームディレクトリのさまざまな部分を置き換えるブロックがあるため、毎回新しいファイルを生成するだけです。例:
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経由でも起動できると確信しています。
私は個人的にこれらのコマンドを使用して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
これが助けになることを願っています。
もう1つのFUSEベースのソリューション(自分でテストしていない):
https://github.com/markhellewell/sshconfigfs
「1つの大きなファイルを管理し続ける代わりに、[...]代わりに、多数の小さな論理チャンクから動的に構成「ファイル」を構築します。」
FIFOを介してこれを行う記事も見つけました:http : //www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/
これらのエイリアスソリューションは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ファイルが作成されることです。
is_anything_changed
条件を追加すると優れた
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もアップグレードできません。
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'
それは魅力のように機能します。