无法调用 ssh2_connect() 回调

2022-08-30 19:19:16

我正在使用该方法与远程服务器建立连接。如果我提供正确的主机名和端口号,则连接已正确建立。当由于凭据错误而无法连接时,我正在尝试调用回调函数,但我尝试它的方式不是在连接失败后调用回调。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;
}

我做错了什么?


答案 1

当ssh2_connect由于错误的主机、端口等原因而失败时,它不会调用任何回调。

相反,is 所做的是返回 false

PHP 文档显示:成功
时返回资源,错误时返回 FALSE。

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

另外,阅读文档,您的

array('hostkey', 'ssh-rsa')

应该是

array('hostkey' => 'ssh-rsa')

答案 2

除了拼写错误之外,你没有做错什么:应该是.该函数仅返回连接失败的 false;当使用了错误的凭据时,回调只是尚未启动。array('hostkey', 'ssh-rsa')array('hostkey' => 'ssh-rsa')ssh_connect()

有解决方案(例如,正如下面的rubo77所建议的),但我找到的一个可以给你最大的控制权,并允许你做你想做的事情(例如跟踪MAC错误),是使用phpseclib库(http://phpseclib.sourceforge.net/ssh/intro.html)进行ssh连接和控制。它可以对命令进行非常精细的控制,还包括日志记录。

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

您可以控制超时,并且可以对命令使用回调。但是,如果您想要更好的控制,请使用并可以监视断开连接或其他问题。查看有关使用 phpseclib 进行日志记录的文档:您可以记录并解析日志,也可以调用 。read()write()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'
    );

推荐