求大神帮忙。
suse linux下的。
报错:
Password authentication failed
Init session failed!
代码如下:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpSocket>
#include <libssh2.h>
#include <iostream>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_runProgram_clicked();
private:
Ui::MainWindow *ui;
int run_program();
void closeChannel(LIBSSH2_CHANNEL *channel);
int initSession();
int closeSession();
QTcpSocket *socket_;
LIBSSH2_SESSION *session_;
LIBSSH2_AGENT *agent_;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDebug>
#include <QByteArray>
#include <QTcpServer>
#include <QTcpSocket>
#include <QTimer>
#include <QFile>
#include <QFileInfo>
//#include <libssh2_config.h>
#include <libssh2.h>
//#include <libssh2_sftp.h>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
session_(0),
socket_(0),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
if(session_ && socket_)
{
closeSession();
}
delete ui;
}
void MainWindow::on_runProgram_clicked()
{
//qDebug()<<run_program();
if(initSession()!=1)
{
qDebug()<<"Init session failed!";
return;
}
}
void MainWindow::closeChannel(LIBSSH2_CHANNEL *channel)
{
if(channel)
{
//libssh2_channel_wait_closed(channel);
libssh2_channel_close(channel);
libssh2_channel_free(channel); // free will auto close the channel
}
}
int MainWindow::initSession()
{
QString host_ip=ui->host->text();
const char *user_name="root";
const char *pass_word="123456";
//---------- connection --------------
int libssh2_error = libssh2_init(0);
if(libssh2_error)
{
qDebug("libssh2_init() error: %d", libssh2_error);
return -2;
}
socket_=new QTcpSocket(this);
socket_->connectToHost(host_ip, 22);
if(!socket_->waitForConnected())
{
qDebug("Error connecting to host %s", host_ip.toLocal8Bit().constData());
return -1;
}
session_ = libssh2_session_init();
if(!session_)
{
qDebug("libssh2_session_init() failed");
return -2;
}
libssh2_error = libssh2_session_startup(session_, socket_->socketDescriptor());
if(libssh2_error)
{
qDebug("libssh2_session_startup() error: %d", libssh2_error);
return -3;
}
{
/* At this point we havn't yet authenticated. The first thing to do
* is check the hostkey's fingerprint against our known hosts Your app
* may have it hard coded, may go to a file, may present it to the
* user, that's your call
*/
// const char *fingerprint = libssh2_hostkey_hash(session_, LIBSSH2_HOSTKEY_HASH_SHA1);
// qDebug( "Fingerprint: ");
// for(int i = 0; i < 20; i++)
// qDebug( "%02X ", (unsigned char)fingerprint);
// qDebug( "\n");
}
// qDebug("Password authentication: [%s] [%s]", user_name.toLocal8Bit().constData(), pass_word.toLocal8Bit().constData());
//char *a=libssh2_userauth_list(session_, user_name.toLocal8Bit().constData(), user_name.toLocal8Bit().length());
//std::cout<<*a<<std::endl;
if(libssh2_userauth_password(
session_,
user_name,
pass_word
))
{
qDebug("Password authentication failed");
socket_->disconnectFromHost();
libssh2_session_disconnect(session_, "Client disconnecting for error");
libssh2_session_free(session_);
libssh2_exit();
return -4;
}
return 1;
}
int MainWindow::closeSession()
{
if(socket_->isOpen())
socket_->disconnectFromHost();
socket_->deleteLater();
socket_=0;
libssh2_session_disconnect(session_, "Client disconnecting normally");
libssh2_session_free(session_);
libssh2_exit();
return 1;
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}