cygwin sshd“getnameinfo 失败”

cygwin sshd“getnameinfo 失败”

我从 Cygwin 运行 Openssh sshd 服务。建立 RSA 连接后:

$ ssh Administrator@ZETA

上次登录:2016 年 5 月 11 日星期三 13:58:50 来自 10.1.1.140

—— 没有错误信息。

但是,当我使用内联命令时:

$ ssh Administrator@ZETA "echo hi"

你好

-- 该命令有效,但在 ZETA 上,Windows 事件日志现在显示:

sshd:PID 7068:错误:get_socket_address:getnameinfo 2 失败:未知错误

调用此函数通常会导致事件日志中充满错误。

在调试模式下通过命令行启动 sshd:

 /usr/sbin/sshd -ddd

-- 不会产生错误。它还可以在不同的用户下运行,我必须chown administrator /var/empty让它工作。

尝试以调试模式启动 sshd 作为 Windows 服务,如建议的那样https://cygwin.com/ml/cygwin/2014-03/msg00488.html失败:

$ /usr/bin/cygrunsrv -I sshd -d "CYGWIN sshd_debug" -p /usr/sbin/sshd -a "-D -d -d -d" -y tcpip

/usr/bin/cygrunsrv:安装服务时出错:OpenService:Win32 错误 1073:指定的服务已存在。

答案1

为了解决安装sshd_debug服务时出现的 cygrunsrv 错误,您还必须更改以下内容,<service_name>而不仅仅是以下<service display name>内容:

cygrunsrv -I <service_name> -d "<service display name>" -p <service_path>

在哪里

  • <service_name>是 Windows 内部服务名称
  • <service display name>services.msc是列表中显示的名称

或者您必须sshd先停止并删除已定义的服务,然后尝试使用调试参数再次定义它。

笔记:以下命令必须在 shell 中输入管理权限. 当 sshd 运行时调试模式使用-d-dd-ddd,服务器将不会分叉并且只会处理一个连接然后停止。

定义第二个sshd_debug服务:

要安装第二项服务,名为sshd_debug

/usr/bin/cygrunsrv -I sshd_debug -d "CYGWIN sshd_debug" -p /usr/sbin/sshd -a "-D -d -d -d" -y tcpip

请注意,特定的<service_name><service display name>不能被定义多次,否则将引发错误cygrunsrv

在启动新服务之前,必须停止sshd_debug正常服务:sshd

/usr/bin/cygrunsrv -E sshd

现在启动sshd_debug服务:

/usr/bin/cygrunsrv -S sshd_debug

使用现有的sshdservice_name 重新定义:

另一个示例将使cygrunsrv您的问题中的命令起作用(使用服务名称:)sshd

# Stop the service
/usr/bin/cygrunsrv -E sshd

# Remove the service
/usr/bin/cygrunsrv -R sshd

# Install using the same service_name with debug options
/usr/bin/cygrunsrv -I sshd -d "CYGWIN sshd_debug" -p /usr/sbin/sshd -a "-D -d -d -d" -y tcpip

# Start the service
/usr/bin/cygrunsrv -S sshd

在特定帐户下安装服务

/usr/bin/cygrunsrv -I sshd_debug -d "CYGWIN sshd_debug" -p /usr/sbin/sshd -a "-D -d -d -d" -y tcpip -u "<account_name>" -w "<password>"

错误:get_socket_address: getnameinfo 2 failed

抛出错误消息的函数get_socket_address定义在canohost.c

static char *
get_socket_address(int sock, int remote, int flags)
{
    ...
    switch (addr.ss_family) {
    case AF_INET:
    case AF_INET6:
        /* Get the address in ascii. */
        if ((r = getnameinfo((struct sockaddr *)&addr, addrlen, ntop,
            sizeof(ntop), NULL, 0, flags)) != 0) {
            error("get_socket_address: getnameinfo %d failed: %s",
                flags, ssh_gai_strerror(r));
            return NULL;
        }
        return xstrdup(ntop);
    ...
    }
}

getnameinfo它调用带有标志的函数NI_NUMERICHOST,该函数应返回一个字符串,其中包含(远程)peer_ipaddr 或 local_ipaddr 的可读 IP 地址。但是,该函数失败并出现未知EAI_SYSTEM错误(A system error occurred)。

所以这并没有太大的帮助,但它可能表明错误与 DNS 名称解析有关。

要进行故障排除,您可以检查名称解析是否正常工作:

# netstat: check where sshd listens and if you have any errors
netstat -ano | grep ":22"
netstat -ao | grep ":22"


# reverse dns lookup
nslookup <remote_ip_address>
nslookup <local_ip_address>

# forward dns lookup (using the hostnames returned by the above commands)
nslookup <remote_hostname>
nslookup <local_hostname>


# or for example using dig

# reverse dns lookup
dig -x <remote_ip_address>
dig -x <local_ip_address>

# forward dns lookup (using the hostnames returned by the above commands)
dig <remote_hostname> +search
dig <local_hostname> +search
  • 应该reverse dns lookup返回完整域名
  • 应该forward dns lookup返回IP地址

相关内容