cygwin sshd "getnameinfo fail"
Я запускаю службу Openssh sshd от Cygwin. Когда соединение RSA установлено:
$ ssh Administrator@ZETA
Последний вход в систему: ср 11 мая 13:58:50 2016 с 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 ответ
Чтобы устранить ошибку cygrunsrv при установке sshd_debug
сервис, вы также должны изменить <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
во-первых, прежде чем пытаться определить его снова, используя параметры отладки.
Примечание. Приведенные ниже команды необходимо вводить в оболочке с правами администратора. Когда 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
наименование услуги:
Еще один пример, который сделает 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
, которая должна возвращать строку с понятным человеку IP-адресом (удаленного) peer_ipaddr или local_ipaddr. Однако функция завершается с неизвестным 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
должен вернуть FQDNforward dns lookup
должен вернуть IP-адрес