我在 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 *+*
模式的命令的递归调用。但我有两个问题:
- 表达式使用
%%
. 为了了解原因,我使用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 /') [....]
即
\(
现在\
在子shell 中用a 转义。为什么这是必要的?
谢谢,
——扎克