无法调用ssh2_connect()回调

Gan*_*til 21 php ssh

我正在使用该ssh2_connect()方法与远程服务器建立连接.如果我提供正确的主机名和端口号,则连接正确建立.由于错误的凭据无法连接,我试图调用回调函数,但我尝试它的方式是在连接失败后不调用回调.

这是我试过的代码:

$callbacks = array( 
      'ignore' => array($this, 'callbackSshDisconnect'), 
      'debug' => array($this, 'callbackSshDisconnect'), 
      'macerror' => array($this, 'callbackSshDisconnect'), 
      'disconnect' => array($this, 'callbackSshDisconnect'), 
);

ssh2_connect($hostName,$port,array('hostkey', 'ssh-rsa'),$callbacks);

public function callbackSshDisconnect($reason, $message, $language) {
    $this->log('disconnected');
    $this->log($reason);die;
}
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

blu*_*112 7

当ssh2_connect因主机,端口等错误而失败时,它不会调用任何回调.

相反,什么是返回false

PHP文档说:
成功时返回资源,错误时返回FALSE.

$result = ssh2_connect($hostName,$port,array('hostkey' => 'ssh-rsa'),$callbacks);
if ($result === false)
   exit("ssh2_connect failed");
Run Code Online (Sandbox Code Playgroud)

另外,阅读文档,你的

array('hostkey', 'ssh-rsa')
Run Code Online (Sandbox Code Playgroud)

应该

array('hostkey' => 'ssh-rsa')
Run Code Online (Sandbox Code Playgroud)


Rob*_*bie 5

除了拼写错误之外,您没有做错任何事情: array('hostkey', 'ssh-rsa')should be array('hostkey' => 'ssh-rsa')ssh_connect()对于连接失败,该函数仅返回 false;当使用错误的凭据时,回调还没有启动。

有一些解决方案(例如下面 rubo77 所建议的),但我发现的解决方案会给你最大的控制权,并允许你做你想做的事情(例如跟踪 MAC 错误),那就是使用 phpseclib 库(http://phpseclib.php )。 sourceforge.net/ssh/intro.html)用于 ssh 连接和控制。它提供了对命令的非常精细的控制,并且还包括日志记录。

这不是最简单的解决方案,但您可以像直接在键盘/终端上一样进行精细控制。

您可以控制超时并可以对命令使用回调。但如果您想要更好的控制,请使用read()write()并可以监控断开连接或其他问题。检查有关使用 phpseclib 进行日志记录的文档:您可以记录并解析日志,或者调用getLastError().

'Connection closed by server'例如,日志文件将在断开连接时显示,但也会告诉您是否在登录时使用不受支持的身份验证模式等。

或者了解更多信息,请阅读代码:例如,这里是断开连接的原因:

    $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'
    );
Run Code Online (Sandbox Code Playgroud)