我正在为我的 OpenSSH 客户端使用一个配置文件,而不是在需要时在命令行中定义选项,以下是我的配置文件中的示例:
$ cat ~/.ssh/config
---- 此处删除最重要的部分 ----
Host hmnw
Hostname hmnw.mydomain.com
User myname
Port 60022
IdentityFile ~/.ssh/id_rsa
当我尝试 ssh 到该主机时:
$ ssh hmnw
它不起作用。
但当我这样做
$ ssh -p 60022 hmnw
它通过了。
出于好奇,我strace
对此过程做了以下操作:
$ ssh hmnw&
$ sudo strace -p $!
connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("XX.XX.XX.XX")}, 16
我知道它正在尝试连接到默认 SSH 端口 22。
注意:上面更改了我的实际主机名和 IP 地址。
我究竟做错了什么?
我的 ssh 版本
$ ssh -V
OpenSSH_7.2p2 Ubuntu-4ubuntu2.1, OpenSSL 1.0.2g 1 Mar 2016
根据@muru 的建议添加此内容
$ ssh -vvvv hmnw
OpenSSH_7.2p2 Ubuntu-4ubuntu2.1, OpenSSL 1.0.2g 1 Mar 2016
debug1: Reading configuration data /home/myname/.ssh/config
debug1: /home/myname/.ssh/config line 2: Applying options for *
debug1: /home/myname/.ssh/config line 21: Applying options for hmnw
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: resolving "hmnw.mydomain.com" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to hmnw.mydomain.com [xx.xx.xx.xx] port 22.
答案1
我在配置中找到了问题所在,这是我基于假设而犯的错误:
~/.ssh/config
我的文件顶部
### default for all ##
Host *
ForwardAgent no
ForwardX11 no
ForwardX11Trusted yes
User myname
Port 2222
Protocol 2
ServerAliveInterval 30
ServerAliveCountMax 120
此处的端口2222
覆盖了60022
下面属于的端口hmnw
。
我Port 2222
从中删除Host *
,现在它可以工作了。
更新:根据@muru 的建议,将默认配置从文件顶部移到底部config
允许我使用自定义端口条目作为默认*
@steeldriver 的建议Host * !hmnw
也很有用,我还没有使用它的案例,但我可以看到如果需要的话它可以允许我否定特定主机的某些设置。
答案2
看起来远程控制(在 ubuntu 16.04 上)默认不使用 ~/.ssh/config,这与OpenSSH 客户端配置,说
命令行选项优先于配置文件。接下来使用用户特定的配置文件 ~/.ssh/config。最后使用全局 /etc/ssh/ssh_config 文件。将使用每个配置参数的第一个获取的值。
以下两种解决方案仍然有效:
sudo ssh -F ~/.ssh/config the_name_after_Host
- 将配置行放在文件中
/etc/ssh/ssh_config
(在文件的开头),而不是~/.ssh/config