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_fatal
。 sshpkt_fatal
在 packet.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 错误有关。
我们将客户端 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_fatal
。 sshpkt_fatal
在 packet.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 错误有关。