我设置了一台新的 Ubuntu 14.04.4 服务器来替换 12.04 机器,但新服务器与旧的 ssh 配置存在问题。我可以在没有配置的情况下进行 ssh,甚至可以通过堡垒服务器从命令行进行 ssh,没有任何问题。例如,
ssh -o ProxyCommand="ssh -W %h:%p bastion.my.company.com" lab123.my.company.com
但是,如果我/home/myname/.ssh/config
使用以下设置创建文件,则会遇到问题。
ServerAliveInterval 150
ServerAliveCountMax 6
ControlMaster auto
ControlPath /tmp/ssh_%h_%p_%r
Host *.my.company.com
User myname
IdentityFile /home/myname/.ssh/mykey.pem
ProxyCommand ssh bastion -W %h:%p
ForwardAgent yes
Host bastion
Hostname bastion.my.company.com
User myname
IdentityFile /home/myname/.ssh/mykey.pem
当我尝试使用 ssh 与上面的配置时,我得到数百个 ssh 进程,如下所示:
myname 29855 29854 0 12:24 pts/6 00:00:00 ssh bastion -W bastion.my.company.com:22
myname 29856 29855 0 12:24 pts/6 00:00:00 ssh bastion -W bastion.my.company.com:22
myname 29857 29856 0 12:24 pts/6 00:00:00 ssh bastion -W bastion.my.company.com:22
myname 29858 29857 0 12:24 pts/6 00:00:00 ssh bastion -W bastion.my.company.com:22
ssh
只是挂起,直到我点击Ctrl+ C,然后所有 ssh 进程都会终止。
每个进程的最后几行的痕迹如下所示:
....
write(4, "SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2"..., 43) = 43
read(5, 0xbfe08efc, 1) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL} ---
+++ killed by SIGINT +++
进一步查看跟踪显示文件句柄来自以下内容:
...
socket(PF_LOCAL, SOCK_STREAM, 0) = 3
connect(3, {sa_family=AF_LOCAL, sun_path="/tmp/ssh_bastion.my.company.com_22_myname"}, 57) = -1 ENOENT (No such file or directory)
close(3) = 0
pipe([3, 4]) = 0
pipe([5, 6]) = 0
..
看起来很奇怪,/tmp 中没有套接字文件,并且跟踪中没有绑定。
答案1
Steeldriver 在评论中提供了解决方案,他建议我从通配符主机匹配中排除 bastion.my.company.com。
例如,
ServerAliveInterval 150
ServerAliveCountMax 6
ControlMaster auto
ControlPath /tmp/ssh_%h_%p_%r
Host *.my.company.com !bastion.my.company.com
User myname
IdentityFile /home/myname/.ssh/mykey.pem
ProxyCommand ssh bastion -W %h:%p
ForwardAgent yes
Host bastion
Hostname bastion.my.company.com
User myname
IdentityFile /home/myname/.ssh/mykey.pem
答案2
ControlPath /tmp/ssh_%h_%p_%r
将控制套接字放入“公共可访问”状态是一个非常糟糕的主意/tmp
。它应该位于某个安全目录中,其他用户无法访问该目录。
该行为看起来像是 的默认值已更改CanonicalizeHostname
。该选项在您的系统中默认是什么?尝试禁用它:CanonicalizeHostname no
。
设置LogLevel DEBUG3
对于调试问题也是一个很好的开始ssh
。您可以在配置中设置此选项并发布日志吗?