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 emservices.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