处理' ssh2_auth_password()'错误的凭据错误

时间:2014-07-22 08:27:02

标签: php zend-framework ssh exception-handling basic-authentication

在处理ssh2_auth_password()函数(以及ssh2_connect())上的错误时,我有点挣扎。我成功地管理连接并登录到我的远程服务器,但是,当提供错误的凭据时,我希望能够处理这些情况。我正在使用ZF 1.12,我已经创建了一个小控制器插件:

<?php
class My_Controller_Plugin_Scp extends Zend_Controller_Plugin_Abstract
{
    private $host;
    private $login;
    private $password;
    private $destDir = '.';
    private $connexion;

    public function __construct()
    {
        $co = ssh2_connect($this->getHost(), 22);
        if(false === $co)
            throw new Exception('Can\'t connect to remote server');

        $this->setConnexion($co);
    }

    /**
     * @return bool
     * @throws Exception
     */
    public function auth()
    {
        $auth = ssh2_auth_password($this->getConnexion(), $this->getLogin(), $this->getPassword());

        if($auth === false)
            throw new Exception('Authentication failed!');

        return $auth;
    }

我在我的控制器中使用这个插件:

    try {
        // Préparation à la copie en SSH du fichier template
        $scp = new My_Controller_Plugin_Scp();
        $scp->auth(); // Authentification
    } catch(Exception $e) {
        echo $e->getMessage();
        $this->getHelper('Redirector')->setGotoRoute(array(), 'ficheVoir');
        exit();
    }

实际输出是,当我弄清楚凭据时,会抛出PHP警告,而我希望能够显示自定义错误消息。

我的Exception和东西有什么问题吗?

1 个答案:

答案 0 :(得分:3)

我无法测试您的代码,因为很多东西都丢失了。 我根据你的代码编写了一个简单的连接函数:

<?php

function connect() {
    $host = '';
    $login = '';
    $password = '';
    $co = ssh2_connect($host, 22);
    if (false === $co)
        throw new Exception('Can\'t connect to remote server');
    $result = @ssh2_auth_password($co, $login, $password);
    var_dump($result);
    if ($result === false) {
        throw new Exception('Authentication failed!');
    }
    echo 'Connection estabilished';
}

try {
    connect();
} catch (Exception $e) {
    echo 'Caught exception: ', $e->getMessage(), "\n";
}

我使用@来抑制PHP警告,不要抛出丑陋的PHP错误消息。如果$resultfalse,则会抛出Exception并正在正确处理。基本上,解决方案只是在@函数之前添加ssh2_auth_password()