我正在部署一个脚本,该脚本在防火墙后面的各种客户端上运行,而这些客户端不受我控制。该脚本尝试使用 SSH 客户端登录到我控制的远程服务器(该脚本预装了用于身份验证的私钥)。某些数据中心的某些防火墙会将所有出站端口 22 请求重定向到不同的服务器(各个设施的系统管理员似乎出于自己的目的这样做了)。
在这些情况下,脚本会失败(因为 ssh 客户端登录失败)。该脚本有一个诊断工具,可以测试用户的连接。为了能够确定我的远程服务器是否可以从端口 22 上的工作站访问,我想运行以下命令
telnet my-remote-host 22
从我的脚本中,测试响应。我的目标服务器响应:
SSH-2.0-OpenSSH_4.3
我的本地开发服务器响应:
SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu4
注意:这些是远程登录端口 22 上的响应,而不是我的服务器的 OpenSSH 横幅文本(在这种情况下无法访问)
我该如何控制这个文本?-- 因此我可以插入一个令牌,将我自己的服务器标识为在这种情况下正在 ping 的服务器。接受端口 22 请求的数据中心服务器可能运行与我自己的远程服务器完全相同的 OpenSSH 版本。
(目前我的诊断只是报告登录失败,但也有其他原因导致这种情况发生 - 我正在寻找一种更细粒度的诊断,可以在我尝试真正登录之前测试我的服务器是否真的可以通过端口 22 访问)
答案1
抱歉,恐怕改变该文本的唯一方法是修改源代码并手动编译 ssh。
答案2
你做错了!确定你是否连接到“好”服务器的唯一方法是检查其密钥的指纹。看看ssh_配置 (5)手册页。您正在寻找的参数应该是'严格主机密钥检查‘
顺便说一句,不要用这个横幅做傻事。它的内容是在协议规范中定义的,更改它可能会导致您的客户端无法连接。
答案3
您可以/应该使用它ssh-keyscan
来收集和比较主机的公钥。我认为它比更改横幅更难伪造(正如您从其他回复中看到的那样,更改横幅往往会让人们感到非常恼火!)。如果您获得密钥并且它与您知道的密钥相匹配,则主机将启动并在端口 22 上监听,而无需您登录。这样就不必在每次发布新版本时重新编译 ssh 包。
$ ssh-keyscan localhost
# localhost SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu4
localhost ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5qXqsZ4S/e4ANfQraXbJx9muKgdrPWrwI/SrIbnZLso9Poszmt3+NrBbTYkuZR92a6BL2gDXCdG0ugsY01u6xItKnnB0XZLYkSqqqwoGubqWbGfC5Zxsosne9cCevVNl3aomSNf8ctw+rEdBfrWjom6wu0CTy1umbDkT186l9LDoefzeOqSpPyIQBHZcDPeeY0B8vPyTCsC5ly/hwoQb/3nT5QMRaawlHNKJMgDE3avTUsPdtVjG2V55rpJpIDeBid7icMwxbGqTAS9T3hW111BdGGjaXspk1t23FnZOUQTzfI4kXj3SxUjSHIx6czX9SZ9NMa/7VewtJPVxRuPLGw==
每个主机的密钥都不同。
因此,像这样的事情将会使事情顺利进行。
key=$(ssh-keyscan localhost)
known_key="localhost ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5qXqsZ4S/e4ANfQraXbJx9muKgdrPWrwI/SrIbnZLso9Poszmt3+NrBbTYkuZR92a6BL2gDXCdG0ugsY01u6xItKnnB0XZLYkSqqqwoGubqWbGfC5Zxsosne9cCevVNl3aomSNf8ctw+rEdBfrWjom6wu0CTy1umbDkT186l9LDoegzeOqSpPyIQBHZcDPeeY0B8vPyTCsC5ly/hwoQb/3nT5QMRaawlHNKJMgDE3avTUsPdtVjG2V55rpJpIDeBid7icMwxbGqTAS9T3hW111BdGGjaXspk1t23FnZOUQTzfI4kXj3SxUjSHIx6czX9SZ9NMa/7VewtJPVxRuPLGw=="
echo "($key)"
echo "-------"
echo "($known_key)"
if [[ "$key" = $known_key ]]; then
echo "GOOD host key matches known key"
else
echo "ERROR host key does not match known key"
fi