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:指定されたサービスは既に存在します。
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つの接続のみを処理してから停止します。
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_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);
...
}
}
フラグ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 lookup
はfqdnを返す必要がありますforward dns lookup
はIPアドレスを返す必要があります