![cygwin sshd“getnameinfo 失败”](https://linux22.com/image/682683/cygwin%20sshd%E2%80%9Cgetnameinfo%20%E5%A4%B1%E8%B4%A5%E2%80%9D.png)
我从 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
使用现有的sshd
service_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地址