我们最近不得不重建我们的一台云服务器(我们使用 Rackspace)。所有服务器几乎完全相同,并使用了另一台服务器的快照。恢复后,我允许运行一个 cron 作业,使用 Unison 将原始服务器中源代码控制之外的几个文件同步到新重建的服务器。本质上,这个 SSH 会比较两台机器之间的文件,然后在两台机器之间复制/删除/任何文件。
但是,自重建以来,我收到来自 Cron Daemon 的电子邮件,其中显示以下错误:
ssh_exchange_identification: read: Connection reset by peer Fatal error: Lost connection with the server
奇怪的是,如果我以 cron 作业运行的同一用户身份登录并通过 SSH 连接到同一服务器(使用相同的密钥进行身份验证),则不会看到任何错误。此外,如果我从命令行手动运行 Unison,则不会看到任何错误。此外,如果我关闭 Unison 的静默模式,则成功的 Unison 批处理作业的输出将显示在控制台中,并且相同的输出将显示在电子邮件中,但每当 cron 作业运行时,我仍然会收到几个与上述相同的错误。
我已经检查了 id_rsa/id_rsa.pub 密钥、authorized_keys 等的权限和内容,它们看起来很好。
有人能解释一下为什么这种情况会突然发生吗?同步似乎在进行中,但每次运行时我都会收到几封电子邮件,并出现该错误。
答案1
“对端重置连接”表示远端(本例中为 SSH 服务器)异常关闭了 TCP 流。发生这种情况的一种方式是远程进程崩溃。
“ssh_exchange_identification” 表示服务器和客户端正在交换横幅字符串,这些横幅字符串用于标识连接两端的 SSH 软件。当 TCP 连接关闭时,客户端正在等待服务器发送其横幅字符串。
如果可以的话,您确实需要在服务器上排除故障。尝试找到重现问题的方法。然后,在服务器上,假设服务器正在运行 openssh,您可以运行:
/path/to/sshd -d -p 1022
这将启动 sshd 的调试副本,监听端口 1022。它将接受来自客户端的单个连接,并打印调试输出。如果您在连接到此 sshd 实例时可以重现问题,则调试消息应该可以清楚地说明发生了什么。