2013-06-26 1 views
2

Я немного запутался в поведении реализаций демона OTP ssh, и мне интересно, может ли кто-то прояснить ситуацию для меня. Отборочные; У меня есть следующие программы:Почему этот демон erlang ssh отвечает «no hostkey alg»?

-module(sshd). 

-export([start/0, stop/1]). 

-spec start() -> {ok, ssh:ssh_daemon_ref()} | {error, atom()}. 
start() -> 
    _ = application:start(crypto), 
    _ = application:start(ssh), 

    Opts = [ 
      {system_dir, "/etc/erl_sshd/"}, 
      {pwdfun, fun passwd/2} 
      ], 

    ssh:daemon(2222, Opts). 

-spec stop(ssh:ssh_daemon_ref()) -> ok. 
stop(Ref) -> 
    ssh:stop_daemon(Ref). 

%% ===================================================================     
%% Internal Functions                 
%% ===================================================================     

-spec passwd(User::string(), Password::string()) -> boolean(). 
passwd(User, User) -> 
    true; 
passwd(_User, _Password) -> 
    false. 

и создали /tmp/erl_sshd на диске следующим образом:

> mkdir /tmp/erl_sshd 
> ssh-keygen -t rsa -f /tmp/erl_sshd/ssh_host_rsa_key 
Generating public/private rsa key pair. 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /tmp/erl_sshd/ssh_host_rsa_key. 
Your public key has been saved in /tmp/erl_sshd/ssh_host_rsa_key.pub. 
The key fingerprint is: 
... 

Тестирование с OpenSSHd:

> /usr/sbin/sshd -p 2222 -h /tmp/erl_sshd/ssh_host_rsa_key -d 
debug1: sshd version OpenSSH_5.6p1 
debug1: read PEM private key done: type RSA 
debug1: private host key: #0 type 1 RSA 
debug1: setgroups() failed: Operation not permitted 
debug1: rexec_argv[0]='/usr/sbin/sshd' 
debug1: rexec_argv[1]='-p' 
debug1: rexec_argv[2]='2222' 
debug1: rexec_argv[3]='-h' 
debug1: rexec_argv[4]='/tmp/erl_sshd/ssh_host_rsa_key' 
debug1: rexec_argv[5]='-d' 
debug1: Bind to port 2222 on 0.0.0.0. 
Server listening on 0.0.0.0 port 2222. 
debug1: Bind to port 2222 on ::. 
Server listening on :: port 2222. 

я могу получить быстрый без проблем:

> ssh localhost -p 2222 -v 
OpenSSH_5.6p1, OpenSSL 0.9.8r 8 Feb 2011 
debug1: Reading configuration data /etc/ssh_config 
debug1: Applying options for * 
debug1: Applying options for * 
debug1: Connecting to localhost [::1] port 2222. 
debug1: Connection established. 
debug1: identity file /Users/blt/.ssh/id_rsa type 1 
debug1: identity file /Users/blt/.ssh/id_rsa-cert type -1 
debug1: identity file /Users/blt/.ssh/id_dsa type -1 
debug1: identity file /Users/blt/.ssh/id_dsa-cert type -1 
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.6 
debug1: match: OpenSSH_5.6 pat OpenSSH* 
debug1: Enabling compatibility mode for protocol 2.0 
debug1: Local version string SSH-2.0-OpenSSH_5.6 
debug1: SSH2_MSG_KEXINIT sent 
debug1: SSH2_MSG_KEXINIT received 
debug1: kex: server->client aes128-ctr hmac-md5 none 
debug1: kex: client->server aes128-ctr hmac-md5 none 
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent 
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP 
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent 
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY 
debug1: checking without port identifier 
The authenticity of host '[localhost]:2222 ([::1]:2222)' can't be established. 
RSA key fingerprint is 01:0e:c6:0b:f4:48:ab:0a:49:2a:66:38:27:67:8f:52. 
Are you sure you want to continue connecting (yes/no)? ^C 

Whe п я начинаю Erlang SSHd, хотя:

> erl 
Erlang R15B03 (erts-5.9.3) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false] 

Eshell V5.9.3 (abort with ^G) 
1> c(sshd), {ok, Ref} = sshd:start(). 
{ok,<0.49.0>} 
2> 

не повезло:

> ssh localhost -p 2222 -v          
OpenSSH_5.6p1, OpenSSL 0.9.8r 8 Feb 2011 
debug1: Reading configuration data /etc/ssh_config 
debug1: Applying options for * 
debug1: Applying options for * 
debug1: Connecting to localhost [::1] port 2222. 
debug1: Connection established. 
debug1: identity file /Users/blt/.ssh/id_rsa type 1 
debug1: identity file /Users/blt/.ssh/id_rsa-cert type -1 
debug1: identity file /Users/blt/.ssh/id_dsa type -1 
debug1: identity file /Users/blt/.ssh/id_dsa-cert type -1 
debug1: Remote protocol version 2.0, remote software version Erlang 
debug1: no match: Erlang 
debug1: Enabling compatibility mode for protocol 2.0 
debug1: Local version string SSH-2.0-OpenSSH_5.6 
debug1: SSH2_MSG_KEXINIT sent 
debug1: SSH2_MSG_KEXINIT received 
debug1: kex: server->client aes128-cbc hmac-sha1 none 
debug1: kex: client->server aes128-cbc hmac-sha1 none 
no hostkey alg 

Помимо создания пользователя, я сделал те же шаги, описанные в User Guide и покрыли ту же землю как this question. Я на системе OS X:

> sw_vers 
ProductName: Mac OS X 
ProductVersion: 10.7.5 
BuildVersion: 11G63 

При запуске Erlang оболочки в качестве корневого пользователя и перенаправить system_dir на /etc все работы, как и ожидалось. Кто-нибудь еще ясно, что случилось? Возможно, пользовательские разрешения в каталоге /tmp/erl_sshd, что erlang беззвучно выдает ошибку? Я ранее включил приложение sasl, но ничего из вывода не выскочил на меня, как уместно.

ответ

0

Похоже, что при установке {system_dir, "/etc/erl_sshd/"} это должно быть действительно /tmp/erl_sshd/. Вы добавили все файлы демона в /tmp/erl_sshd. При запуске OpenSSH вы также используете /tmp/erl_sshd с правильными файлами.