通过 ~/.ssh/config 多次更改主机名

通过 ~/.ssh/config 多次更改主机名

我在 ~/.ssh/config 中进行了以下设置

match host devbox 
 compression yes 
 user hari 
 port 22 
 hostname 192.168.9.7 

match originalhost devbox exec "~/.ssh/check_if_outside_home.sh" 
 hostname devbox.harisund.com 

这个想法是这样的——

  • 始终连接到 192.168.8.15(如果我已经在家庭网络中,这将起作用)
  • 如果我不在家庭局域网内,请连接到 devbox.harisund.com

然而,通过详细的日志记录,我看到了这一点 -

  1 OpenSSH_7.2p2 Ubuntu-4ubuntu2.2, OpenSSL 1.0.2g  1 Mar 2016 
  2 debug1: Reading configuration data /home/hsundararaja/.ssh/config 
  3 debug2: checking match for 'host devbox' host devbox originally devbox 
  4 debug3: /home/hsundararaja/.ssh/config line 734: matched 'host "devbox"' 
  5 debug2: match found 
  6 debug2: checking match for 'originalhost devbox exec "~/.ssh/check_if_outside_home.sh"' host 192.168.9.7 originally devbox 
  7 debug3: /home/hsundararaja/.ssh/config line 744: matched 'originalhost "devbox"' 
  8 debug1: Executing command: '~/.ssh/check_if_outside_home.sh' 
  9 debug1: permanently_drop_suid: 14741 
 10 debug3: command returned status 0 
 11 debug3: /home/hsundararaja/.ssh/config line 744: matched 'exec "~/.ssh/check_if_outside_home.sh"' 
 12 debug2: match found 
 13 debug1: /home/hsundararaja/.ssh/config line 839: Applying options for * 
 14 debug1: Reading configuration data /etc/ssh/ssh_config 
 15 debug1: /etc/ssh/ssh_config line 19: Applying options for * 
 16 debug2: resolving "192.168.9.7" port 22 
 17 debug2: ssh_connect_direct: needpriv 0 
 18 debug1: Connecting to 192.168.9.7 [192.168.9.7] port 22. 
 19 debug2: fd 3 setting O_NONBLOCK 
 20 debug1: connect to address 192.168.9.7 port 22: Connection timed out 
 21 ssh: connect to host 192.168.9.7 port 22: Connection timed out 

在第 4 行中,它检测 ~/.ssh/config 中的第一节。此时,主机名更改为 192.168.9.7。到目前为止一切都很好。

在第 7 行,到达第二节。

在第 8 行,它检查我们是否在家外,并返回 0。正如预期的那样。

第 12 行表示这是一个匹配,这意味着我们应该将主机名更改为 devbox.harisund.com

然而,在第 16 行,我们看到它仍然使用设置的本地主机名。

为什么?这是预期的行为吗?

答案1

这正如设计和记录的那样man 5 ssh_config

对于每个参数,将使用第一个获得的值。配置文件包含由主机规范分隔的部分,并且该部分仅适用于与规范中给出的模式之一匹配的主机。匹配的主机名通常是命令行上给出的主机名(有关例外情况,请参阅 CanonicalizeHostname 选项)。

由于使用每个参数的第一个获得的值,因此应在文件开头附近给出更多特定于主机的声明,并在末尾给出一般默认值。

简而言之,你match originalhost不能覆盖预先存在的hostname,交换顺序,你应该没问题。

相关内容