cygwin sshd “getnameinfo falhou”

2

Eu executo um serviço openssh sshd da Cygwin. Quando uma conexão RSA é estabelecida:

$ ssh Administrator@ZETA

Last login: Wed May 11 13:58:50 2016 from 10.1.1.140

- não há mensagem de erro.

No entanto, quando eu uso um comando in-line:

$ ssh Administrator@ZETA "echo hi"

hi

- o comando funciona, mas no ZETA o log de eventos do Windows agora diz:

sshd: PID 7068: error: get_socket_address: getnameinfo 2 failed: Unknown error

Chamar isso geralmente preenche o log de eventos com erros.

Iniciando o sshd na linha de comando no modo de depuração:

 /usr/sbin/sshd -ddd

- não produz erros. Ele também roda sob um usuário diferente e eu tive que chown administrator /var/empty para ele funcionar.

Tentando iniciar o sshd no modo de depuração, pois o serviço do Windows, conforme recomendado no link , falha:

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

/usr/bin/cygrunsrv: Error installing a service: OpenService: Win32 error 1073: The specified service already exists.

    
por Muposat 12.05.2016 / 16:49

1 resposta

1

Para resolver seu erro cygrunsrv ao instalar um serviço sshd_debug , você também precisa alterar o <service_name> e não apenas o <service display name> em:

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

onde

  • <service_name> é o nome do serviço interno do Windows
  • <service display name> é o nome exibido em services.msc list

OU você precisa parar e remover o serviço% definidosshd antes, antes de tentar defini-lo novamente usando parâmetros de depuração.

Observação: Os comandos abaixo devem ser inseridos em um shell com privilégios de administrador . Quando o sshd é executado no modo de depuração com -d , -dd ou -ddd , o servidor não irá bifurcar e só processará uma conexão e depois parará.

Para definir um segundo sshd_debug service:

Para instalar um segundo serviço chamado sshd_debug :

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

Observe que um determinado <service_name> ou <service display name> não pode ser definido mais de uma vez, caso contrário, um erro será lançado por cygrunsrv .

Antes de iniciar seu novo serviço sshd_debug , o serviço normal sshd precisa ser interrompido:

/usr/bin/cygrunsrv -E sshd

Agora inicie o sshd_debug service:

/usr/bin/cygrunsrv -S sshd_debug

Para redefinir com o sshd service_name:

existente

Outro exemplo que fará com que o comando cygrunsrv da sua pergunta funcione (usando o nome do serviço: 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

Para instalar um serviço em uma conta específica

/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>"

Erro: get_socket_address: getnameinfo 2 failed

A função get_socket_address lançando a mensagem de erro é definida em 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);
    ...
    }
}

Ele chama uma função getnameinfo com o sinalizador NI_NUMERICHOST , que deve retornar uma string com o endereço IP legível do peer_ipaddr (remoto) ou do local_ipaddr. No entanto, a função falha com um erro desconhecido EAI_SYSTEM ( A system error occurred ).

Portanto, isso não ajuda muito, mas pode indicar que o erro tem a ver com a resolução de nomes DNS.

Para solucionar problemas, você pode verificar se a resolução de nomes está funcionando:

# 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
  • O reverse dns lookup deve retornar o fqdn
  • O forward dns lookup deve retornar o endereço IP
por 17.05.2016 / 14:05