~/.ssh/config
使用IP地址作为主机名时,您无法实现此目的。由于不仅连接到不同的IP地址而且连接到不同的端口,因此引入了更多的复杂性,因为这几乎排除了DNS解析器的任何调整。
我的立场是正确的-您可以使用Match originalhost ... exec ...
组合菜单,~/.ssh/config
请参阅@MichałPolitowski的答案。但是,尽管它对于OpenSSH可以很好地工作,但是您不一定在其他SSH客户端中可以找到类似的功能。
您可以使用一个简单的包装器(如果需要从各种外壳程序使用外壳程序函数或脚本,则可以解决该问题)ssh
,该程序将检查您所在的网络并使用适当的Host
条目。最大的问题是,如何可靠地检测您所在的网络。我会想到本地IP地址,但它并不可靠,因为您可能还需要从使用与工作网络相同的子网的LAN连接。
如果本地和远程网络都可以使用相同的端口,则可以/etc/resolv.conf
根据所使用的网络进行编辑-显然必须自动完成(很可能是从DHCP客户端的挂钩脚本中完成)。或者-更好-运行本地名称服务器(例如dnsmasq
),并为其提供适当的配置。但是,这超出了这个问题的范围。
如果只需要交互式连接,则另一个选择是使用将扫描的命令完成~/.ssh/config
。这将节省您一些键入操作(特别是如果您有足够多的Host
条目)。这样的东西(用于bash
初始化):
# complete session names for ssh
declare -g _ssh_complete_hostlist 2> /dev/null
function _ssh_complete_init () {
_ssh_complete_hostlist=$( \
sed -nr '/^\s*Host\s*=/{s/^[^=]+= *//;s/ /\n/g;p}' ~/.ssh/config \
| sort )
}
_ssh_complete_init
function _ssh_complete () {
local match=${COMP_WORDS[${COMP_CWORD}]}
local hosts=
local default=
for h in $_ssh_complete_hostlist; do
if [[ $h =~ ^$match ]]; then
hosts="$hosts $h"
fi
done
if ! (( ${COMP_CWORD} == ${#COMP_WORDS[@]}-1 )); then
default=$( compgen -f ${COMP_WORDS[${COMP_CWORD}]} )
fi
COMPREPLY=($hosts $default)
}
complete -F _ssh_complete ssh
第一个函数创建一个列表,列出主机的完成情况(通常在每个shell中运行一次就足够了),第二个函数执行实际的完成,尽管有点笨拙-仅在主机名完成时才完成命令行上的最后一个标记。
综上所述,解决此问题的正确方法是通过VPN连接到工作网络,从而可以像访问办公室一样访问本地工作IP地址。然后,您可以硬线的地址转换成任何你喜欢的任何层:~/.ssh/config
,/etc/resolv.conf
或(恕我直言最好的选择)办公室名称服务器。
/etc/hosts
通过SSH配置文件来解决这个问题?还是某种“检测”您当前连接到哪个LAN的方式?