【问题标题】:ssh "packet_write_wait: Connection to x.x.x.x port 22: Broken pipe" -- where is the source code?ssh "packet_write_wait: Connection to x.x.x.x port 22: Broken pipe" -- 源代码在哪里?
【发布时间】:2021-05-09 12:44:17
【问题描述】:

我们的客户端 ssh 连接到显示此错误的远程服务器。它一直运行良好,防火墙规则也没有改变。当一个 ssh 会话在周末空闲时,它仍然是连接的。有时,当我们在文件上“少”并按 shift-F 几个小时时,它会显示此错误。

我不想在这篇文章中解决这个问题。我们想查看 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


    【解决方案1】:

    您可以找到 OpenSSH 源代码 in github 的副本。 packet_write_wait 函数在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 表示“Broken pipe”与 EPIPE 错误相关。

    【讨论】:

    • 啊,是的,我已经通过开关查看了几次,但仍然错过了 stderror(errno) 的情况。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2016-09-22
    • 1970-01-01
    相关资源
    最近更新 更多