Gentoo Linux の wiki で、動的 jumphost リストに関する次の記述に出くわしました。
ProxyCommand ssh $(echo %h | sed 's/+[^+]*$//;s/\([^+%%]*\)%%\([^+]*\)$/\2 -l \1/;s/:/ -p /') nc -w1 $(echo %h | sed 's/^.*+//;/:/!s/$/ %p/;s/:/ /')
sed
動作しますが、式を完全 に理解したいと思います。
元のリファレンスを読んで、Host *+*
パターンを使用して、コマンドの再帰呼び出しをよく理解することができました。しかし、2 つの質問があります。
- 式は を使用し
%%
ます。理由を確認するために を使用ssh -v
したところ、ssh
クライアントが を解析する$HOME/.ssh/config
と、最初の%
が取り除かれているように見えることがわかりました。上記を確認しようとして、openssh のソース コードをダウンロードしましたがreadconf.c
、手がかりが得られませんでした。私は OpenSSH ソース コードを初めて使用しますが、デバッグ情報を使用してコンパイルすることを恐れませんgdb
。それにもかかわらず、私の推測を確認するためのより迅速な方法があれば、ヒントをいただければ幸いです。 また、次の
ssh -v
ことも明らかにしました。[...] debug1: Executing proxy command: exec ssh $(echo zackp%node0+zackp%node1+node3 | sed 's/+[^+]*$//;s/\\([^+%]*\\)%\\([^+]*\\)$/\\2 -l \\1/;s/:/ -p /') [....]
つまり、サブシェル
\(
で a を使用してエスケープされるようになりました。\
なぜこれが必要なのですか?
ありがとう、
――ザック