Есть задача: Приложение должно иметь возможность удалённо администрировать устройства с линуксом на борту через ssh. Лучшим вариантом было бы просто вызывать для необходимого устройства подобие консоли и работать как из обычной через ssh соединение. Вопрос : Как можно это организовать? Кто работал с ссш под Qt?
Примечание: libssh 0.3.4
Просто нужно присоединить к проекту libssh и скомпилить их вместе. А там уже из GUI цеплять нужные функции или из консоли.
Что именно вызывает затруднение?
Скомпилить не проблема. Приложение гуишное, то что имеется сейчас даже подключаться не хочет. Проблема в том чтобы из под гуи дать юзверю работать под "виртуальной консолью".
Вот то что не подключается.
SSH::SSH()
{
//int ret;
ssh = ssh_new();
ssh_opt = ssh_options_new();
//ret = ssh_option_set_wanted_algos(ssh_opt,KEX_COMP_C_S,"none");
//ret = ssh_option_set_wanted_algos(ssh_opt,KEX_COMP_S_C,"none");
ssh_options_set_port (ssh_opt, 22);
ssh_options_set_host (ssh_opt, "127.0.0.1");
ssh_options_set_username (ssh_opt, "root");
ssh_set_options (ssh, ssh_opt);
ssh_is_server_known(ssh);
if (ssh_connect(ssh) != SSH_OK)
{
qDebug("Error at connection :%s\n",ssh_get_error(ssh));
return;
}
channel = channel_new(ssh);
if(channel_open_session(channel) !=0)
{
qDebug("Error at channel opening :%s\n",ssh_get_error(ssh));
return;
}
/*if(ssh_userauth_password(ssh, "root", "pass") != SSH_AUTH_SUCCESS)
{
qDebug("Error at connection :%s\n",ssh_get_error(ssh));
return;
}
if(ssh_userauth_kbdint(ssh, "root", NULL) != SSH_AUTH_SUCCESS)
{
qDebug("Error at connection :%s\n",ssh_get_error(ssh));
return;
}
if (ssh_userauth_autopubkey(ssh, "hello") != SSH_AUTH_SUCCESS)
{
qDebug("Authenticating with pubkey: %s\n",ssh_get_error(ssh));
if (ssh_userauth_password (ssh, "root", "pass") != SSH_AUTH_SUCCESS)
{
qDebug("Authentication with password failed: %s\n",ssh_get_error (ssh));
return;
}
}*/
}
С подключением вроде разобрался, остаётся вопрос с подключением терминала.
Вот что есть на даный момент.
void SSH::openSshConnectionForHost(QString host, QString pass)
{
ssh_options_set_port (ssh_opt, 22);
ssh_options_set_host (ssh_opt, host.toLocal8Bit().constData());
ssh_options_set_username (ssh_opt, "root");
ssh_set_options (ssh, ssh_opt);
ssh_is_server_known(ssh);
if (ssh_connect(ssh) != SSH_OK)
{
qDebug("Error at connection :%s\n",ssh_get_error(ssh));
return;
}
if(ssh_userauth_password(ssh, "root", pass.toLocal8Bit().constData()) != SSH_AUTH_SUCCESS)
{
qDebug("Error at connection :%s\n",ssh_get_error(ssh));
return;
}
}
void SSH::slotExecSshCommand(QString ssh_command)
{
channel = channel_new(ssh);
if(channel == NULL)
{
qDebug("Error at channel open :%s\n",ssh_get_error(ssh));
return;
}
if(channel_open_session(channel) != SSH_OK)
{
qDebug("Error at open channel session :%s\n",ssh_get_error(ssh));
return;
}
if(channel_request_exec(channel,ssh_command.toAscii().data()) != SSH_OK)
{
qDebug("Error at EXEC :%s\n",ssh_get_error(ssh));
return;
}
out_file = fopen("/home/prophet/out_ssh_log.txt","w");
int i =0;
while(i <= 0 || i == data_in_poll)
{
i = channel_poll(channel,0);
}
data_in_poll = i;
channel_read_buffer(channel,buff,i,0);
//QString reply = QString::fromAscii(buffer_get(buff));
QString reply;
if(buffer_get_len(buff) != (ulong)i)
{
qDebug("Error in poll");
return;
}
reply.sprintf("%s",(char*)buffer_get(buff));
emit signalSendSshReply(reply);
fwrite(buff,sizeof(char),i,out_file);
fclose(out_file);
channel_close(channel);
}
Собрал приложение с этой библиотекой, при запуске "Ошибка при запуске приложения (0xc000007b)"
Убираю из кода строку
ssh_session my_ssh_session = ssh_new();
сразу все нормально запускается. Никто не сталкивался?может
ssh_session my_ssh_session = new ssh_new();
Нет, в документации и в примерах именно так.
http://api.libssh.org/master/libssh_tutor_guided_tour.html
Ну это не проблема qt впринципе, простое консольное приложение c libssh тоже не запускается.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)