Russian Qt Forum
Ноябрь 26, 2024, 09:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с командной строкой(терминалом)  (Прочитано 8337 раз)
bigory
Гость
« : Октябрь 29, 2010, 21:02 »

Здравствуйте!
Подскажите как работать с командной строкой?
Я знаю что можно послать в командную строку команду, используя QProcess / system() , но проблема в том, что в нем нельзя послать сразу несколько команд. Т.е. если выполнять так:

system(dir);
system("pause");

то запустится командная строка, покажет содержимое в директории, потом закроется, запуститься новое и выполниться остановка. Как выполнить все команды в одном окне?
Как получать то, что выводит командная строка?
Записан
Alex_cs_gsp
Гость
« Ответ #1 : Октябрь 29, 2010, 21:58 »

Не понимаю зачем такое может понадобится, для получения списка файлов в Qt есть другие механизмы.
Но если это нужно, то можно перенаправить вывод в текстовый файл и считать оттуда.
Записан
bigory
Гость
« Ответ #2 : Октябрь 29, 2010, 23:15 »

Мне нужно написать программу клиент, который по команде сервера делает настройки системы, удаляет ненужные файлы и прочее. Помимо связи с сервером, она должна быть еще и невидимой.
С невидимостью я разобрался, со связью с сервером разобраться не сложно, осталось только понять как как отвечать на вопросы, которые может задавать консоль и передавать в качестве переменных сообщения, которые выводит консоль.
Записан
Denjs
Гость
« Ответ #3 : Октябрь 30, 2010, 01:20 »

сдается мне - вам сюда:
http://www.prog.org.ru/index.php?topic=5677.msg25539#msg25539
и сюда http://www.prog.org.ru/index.php?topic=10611.msg63701#msg63701 (тут есть исходники как для родительского так и для дочернего приложения).
не?

т.е. предлагаю вам искать в направлении дочерних процессов и работы с stdin|stdout дочерней программы/потока.
т.е. запускаете bash или cmd как дочерний поток.. вроде так...
Записан
Alex_cs_gsp
Гость
« Ответ #4 : Октябрь 30, 2010, 07:28 »

С невидимостью я разобрался, со связью с сервером разобраться не сложно, осталось только понять как как отвечать на вопросы, которые может задавать консоль и передавать в качестве переменных сообщения, которые выводит консоль.

Вы хотите пользователя написать?
Записан
Denjs
Гость
« Ответ #5 : Октябрь 30, 2010, 11:34 »

С невидимостью я разобрался, со связью с сервером разобраться не сложно, осталось только понять как как отвечать на вопросы, которые может задавать консоль и передавать в качестве переменных сообщения, которые выводит консоль.

Вы хотите пользователя написать?
radmin консольный он хочет написать) (как я понял) программу котрая может работать с консольными приложенями .причем локально. поому я и тослал к запуску дочерних приложений и перехвату потоков ввода-вывода. Надо правда отметить что в ssh пароль так например не вбить.. там другие механизы используются...

почему только ssh и telnet ... уж не условия ли курсовой тут проглядывают?)))))))
Записан
bigory
Гость
« Ответ #6 : Октябрь 30, 2010, 22:40 »

Denjs, именно что-то типа radmin(а) я и хочу написать)) Спасибо за интересные ссылки, совет, буду разбираться. Если будут вопросы, буду здесь писать
Записан
bigory
Гость
« Ответ #7 : Ноябрь 01, 2010, 23:00 »

Я просмотрел ссылки. Очень было интересно. Но у меня есть одна сложность.
Мне не нужно чтобы запускалась форма, и чтобы она не появлялась я исключаю

Код:
    QApplication a(argc, argv);
    myProcess w;
    w.show();

    return a.exec();

Пытаюсь отправить команду в командную строку и получить ответ от нее через. В main.cpp не получается. Как правильно это сделать?
Выношу сюда пример, который я пытаюсь повторить:
Код:
#include "myprocess.h"

myProcess::myProcess(QWidget *parent) : QDialog(parent)
{
        sb.setText("start");
        ib.setText("input");
        QVBoxLayout *vl=new QVBoxLayout;
        vl->addWidget(&sb);
        vl->addWidget(&te);
        vl->addWidget(&le);
        vl->addWidget(&ib);
        setLayout(vl);

        connect(&sb,SIGNAL(clicked()),this,SLOT(startProcess()));
        connect(&ib,SIGNAL(clicked()),this,SLOT(doInput()));
        connect(&myProc,SIGNAL(readyReadStandardOutput()),this,SLOT(showOutput()));
        connect(&myProc,SIGNAL(readyReadStandardError()),this,SLOT(showOutput()));
}

void myProcess::startProcess()
{
        QString prog="C:\\WINDOWS\\system32\\cmd.exe";
     //   QString prog="C:\\Qt\\2010.05\\qt\\Forum\\testcon-build-desktop\\release\\testcon.exe";
        myProc.start(prog);
        if(myProc.waitForStarted())
                te.append(QString("Program <b>%1</b> started").arg(prog));
        else
                te.append(QString("Can't start program <b>%1</b>").arg(prog));
}

void myProcess::doInput()
{
        QString s=le.text()+"\n";
        if(myProc.write(s.toAscii())!=-1) le.clear();
}

void myProcess::showOutput()
{
        te.append(QString::fromLocal8Bit(myProc.readAllStandardOutput()));
        te.append(QString::fromLocal8Bit(myProc.readAllStandardError()));
}

Вот мои наброски:

Код:
#include "mainwindow.h"
#include <QProcess>

int main(int argc, char *argv[])
{   
    const char* user="Администратор";
    const char* pass="123";
    std::string s;
    s+="net user ";
    s+=user;
    s+=" ";
    s+=pass;
    QString prog="C:\\WINDOWS\\system32\\cmd.exe";
    QProcess myProc;
    myProc.start(prog);
   
………

    return 0;
}

Где  …. , это я не знаю что дальше делать. Вроде как сигналы в main не работают. Как мне реализовать задуманное?
« Последнее редактирование: Ноябрь 01, 2010, 23:09 от bigory » Записан
developer
Гость
« Ответ #8 : Ноябрь 02, 2010, 11:54 »

Я не очень вчитывался в топик. Но я уже делал когда-то подобное. К сожалению только под Юникс.
Эта либа написанная на питоне. http://pexpect.sourceforge.net/pexpect.html.
Код можно посмотреть и переписать на с++.
Здесь используеться технология псевдотерминалов. А также системные визовы fork(), spawn().
Если найти аналоги под винду то думаю и под віинду переписать тоже можно.
Записан
Denjs
Гость
« Ответ #9 : Ноябрь 03, 2010, 01:56 »

Мне не нужно чтобы запускалась форма, и чтобы она не появлялась я исключаю
Код:
    QApplication a(argc, argv);
    myProcess w;
    w.show();

    return a.exec();
простите - вы a.exec() удаляете из main ?! или что? где?

что бы формочка не появлялась - смотрите как писать консольные приложения.  без формоем.
в моих примерах кажется формочка только у исходного приложения - а у дочернего нет.
Вы родительское приложение тоже консольным хотите сделать?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 20.