除了打字错误,你没有做错什么:array(‘hostkey’,’ssh-rsa’)应该是array(‘hostkey’=>’ssh-rsa’)。函数ssh_connect()刚刚为连接失败返回false;当正在使用错误的凭据时,回调根本就不会被启动。
有解决方案(例如,如下面的rubo77所提到的),但是我发现的将会给你最多的控制,并允许你做你想要的(例如跟踪MAC错误),是使用phpseclib库(http://phpseclib.sourceforge.net/ssh/intro.html)进行ssh连接,控制。它给出非常精确的命令控制,还包括日志记录。
这不是最简单的解决方案,但您可以像您直接在键盘/终端一样精细控制。
您可以控制超时,并可以对命令使用回调。但是,如果要更好的控制,请使用read()和write(),并且可以监视断开连接或其他问题。检查documentation on logging with phpseclib:您可以记录和解析日志,或调用getLastError()。
例如,日志文件将显示“断开连接关闭的服务器”,但也会告诉您是否在登录时使用不受支持的身份验证模式。
或者为了更多,阅读代码:这里,例如,是断开原因:
$this->disconnect_reasons = array(
1 => 'NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT',
2 => 'NET_SSH2_DISCONNECT_PROTOCOL_ERROR',
3 => 'NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED',
4 => 'NET_SSH2_DISCONNECT_RESERVED',
5 => 'NET_SSH2_DISCONNECT_MAC_ERROR',
6 => 'NET_SSH2_DISCONNECT_COMPRESSION_ERROR',
7 => 'NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE',
8 => 'NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED',
9 => 'NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE',
10 => 'NET_SSH2_DISCONNECT_CONNECTION_LOST',
11 => 'NET_SSH2_DISCONNECT_BY_APPLICATION',
12 => 'NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS',
13 => 'NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER',
14 => 'NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE',
15 => 'NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME'
);