![ssh_config 中的变量扩展](https://linux22.com/image/94503/ssh_config%20%E4%B8%AD%E7%9A%84%E5%8F%98%E9%87%8F%E6%89%A9%E5%B1%95.png)
我有一些远程管理的设备这个描述,这样要从我的服务器连接,我输入:
ssh localhost -p 2870
由于我管理着很多主机,因此我想简化此操作,这样我就可以输入:
ssh 2870
我不想使用 bash 别名(从那时起我就不能使用 SCP 和 Ansible),所以尝试了以下方法~/.ssh/config
:
Host 28??
HostName localhost
Port %h
这会失败,因为无论出于何种原因 %h 都不会在端口行上扩展(它将在主机名和其他名称上扩展)。所以尝试了这个:
Host 28??
ProxyCommand ssh -v localhost -p %h
这里 %h 展开正常,我可以看到它正常登录到服务器(通过公钥),但我没有收到提示。
关于如何在 ssh 配置中执行此“别名”有什么想法吗?
答案1
看来 %h 扩展在 Port 指令中不起作用。如果您不介意用大量条目填充 .ssh/config ,那么动态生成它们并不难(特别是如果您有一个列表,或者它们是连续的):
$(for port in `seq 2000 2900`
do
echo Host $port
echo " Hostname localhost"
echo " Port ${port}"
echo ""
done) >> ~/.ssh/config
由于我们可以查看ssh的源码,可以确认Port没有进行扩展:
读取conf.c:https://github.com/openssh/openssh-portable/blob/dc664d1bd0fc91b24406a3e9575b81c285b8342b/readconf.c
为主机和exec选项调用函数percent_expand - 这似乎是将%h转换为主机名的函数。从 ssh.c 调用相同的函数。有趣的是,ProxyCommand 似乎将这些变量的扩展推迟到以后。 Port 指令不调用它。
https://github.com/openssh/openssh-portable/blob/ed877ef653847d056bb433975d731b7a1132a979/misc.c