ssh "packet_write_wait: Connection to x.x.x.x port 22: Broken pipe" -- 源代码在哪里?

ssh "packet_write_wait: Connection to x.x.x.x port 22: Broken pipe" -- where is the source code?

我们将客户端 ssh 连接到显示此错误的远程服务器。一直 运行 都很好,防火墙规则也没有改变。当一个 ssh 会话在周末空闲时,它仍然处于连接状态。有时当我们 'less' 和 shift-F 在文件上几个小时时,它会显示此错误。

我不打算在 post 中解决这个问题。我们想查看 ssh 源代码以弄清楚发生了什么。在 Centos 7 上,我下载了 openssh-7.4p1-21.el7.src.rpm,并提取了 openssh-7.4p1.tar.gz。 'grep' 通过源码找到了 'packet_write_wait' 函数。但奇怪的是,在所有 .h 和 .c 文件中都找不到“Broken pipe”(或每个单词分别使用 -i)。该错误文本来自哪里?

您可以找到 OpenSSH 源代码的副本 in github. The packet_write_wait function is in opacket.c:

void
packet_write_wait(void)
{
    int r;

    if ((r = ssh_packet_write_wait(active_state)) != 0)
        sshpkt_fatal(active_state, __func__, r);
}

它调用另一个函数来写入数据包。如果失败,它会调用 sshpkt_fatalsshpkt_fatalpacket.c 中,它的工作是打印错误信息然后退出。

/*
 * Pretty-print connection-terminating errors and exit.
 */
void
sshpkt_fatal(struct ssh *ssh, const char *tag, int r)
{
    switch (r) {
    case SSH_ERR_CONN_CLOSED:
        logdie("Connection closed by %.200s port %d",
            ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
[...code removed...]
            /* FALLTHROUGH */
    default:
        logdie("%s%sConnection %s %.200s port %d: %s",
            tag != NULL ? tag : "", tag != NULL ? ": " : "",
            ssh->state->server_side ? "from" : "to",
            ssh_remote_ipaddr(ssh), ssh_remote_port(ssh), ssh_err(r));
    }
}

您所询问的邮件由默认案例处理。最后一个参数提供冒号后的文本,通过调用 ssh_err:

提供
const char *
ssh_err(int n)
{
    switch (n) {
    case SSH_ERR_SUCCESS:
        return "success";
    case SSH_ERR_INTERNAL_ERROR:
        return "unexpected internal error";
[...etc...]

您感兴趣的ssh_err案例是这个:

case SSH_ERR_SYSTEM_ERROR:
        return strerror(errno);

简而言之,“Broken pipe”消息来自标准库函数strerror,它将错误编号转换为标准错误消息。

list of standard error codes 表示“破管”与 EPIPE 错误有关。