cygwin sshd «getnameinfo failed»

Я запускаю службу sshd Openssh от Cygwin. Когда установлено соединение RSA:

$ ssh Administrator@ZETA

Последний вход: среда, 11 мая 13:58:50 2016 с 10.1.1.140

- сообщения об ошибке нет.

Однако, когда я использую встроенную команду:

$ ssh Administrator@ZETA "echo hi"

привет

- команда работает, но на ZETA в журнале событий Windows теперь написано:

sshd: PID 7068: error: get_socket_address: getnameinfo 2 failed: Неизвестная ошибка

Вызов этого часто приводит к заполнению журнала событий ошибками.

Запуск 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: указанная служба уже существует.

2
задан 12 May 2016 в 17:49
1 ответ

Чтобы устранить ошибку cygrunsrv при установке служба sshd_debug , вам также необходимо изменить , а не только <отображаемое имя службы> в:

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

где

  • < service_name> - это внутреннее имя службы Windows.
  • <отображаемое имя службы> - это имя, отображаемое в services.msc list

ИЛИ необходимо остановить и удалить сначала уже определенная служба 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

Обратите внимание, что конкретный < имя_службы> или <отображаемое имя службы> не может быть определено более одного раза, в противном случае 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

Чтобы установить службу под определенным пользователем unt

/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 не удалось

Функция 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 ( Произошла системная ошибка ).

Таким образом, это не очень помогает, но может указывать на то, что ошибка должна быть с разрешением имен 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
  • Обратный поиск DNS должен возвращать fqdn
  • Прямой поиск DNS должен возвращать IP-адрес
1
ответ дан 3 December 2019 в 12:40

Теги

Похожие вопросы