web-dev-qa-db-ja.com

cygwin sshd "getnameinfoが失敗しました"

CygwinからOpenSSHsshdサービスを実行しています。 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それが機能するために。

https://cygwin.com/ml/cygwin/2014-03/msg00488.html で推奨されているように、Windowsサービスとしてデバッグモードでsshdを開始しようとすると失敗します。

$ /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
Muposat

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を停止して削除する必要があります。

注:以下のコマンドは、管理者権限を使用してシェルに入力する必要があります。 sshdがデバッグモード-d-dd、または-dddで実行される場合、サーバーはフォークせず、1つの接続のみを処理してから停止します。

2番目のsshd_debugサービスを定義するには:

sshd_debugという名前の2番目のサービスをインストールするには:

/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_addresscanohost.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);
    ...
    }
}

フラグNI_NUMERICHOSTを指定して関数getnameinfoを呼び出します。この関数は、(リモート)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 lookupfqdnを返す必要があります
  • forward dns lookupIPアドレスを返す必要があります
1
rda