Qt QProcess sudo BASH PASSWORD

введите сюда описание изображения

Здравствуйте. Я тут взялся написать небольшую программку QtDeployer, ориентированную на Linux. Суть в том что там щелкаешь мышью, выбираешь release-файл, а она сама собирает ваше приложение, так что вам не надо печатать в терминале многабукав. По сути, это просто GUI для linuxdeployqt. И вот, базовый функционал, кажется, готов, но... Хочется добавить кнопку установки linuxdeployqt в /usr/bin, но тут возникают сложности с паролем. Конечно, можно реализовать инсталлер через BASH скрипт, где пользователь введет его сам, но, все же, хочется узнать, как скормить пароль в QProcess, чтобы реализовать запрос пароля именно через программу. По сути, тут вопрос упирается в синтаксис BASH. Как это сделать, чтобы команду можно было без проблем запихать в QProcess? Мне конкретно нужно чтобы было выполнено что-то типа

sudo cp linuxdeployqt.AppImage /usr/local/bin/linuxdeployqt

Еще добавлю кое-что. Вот, у меня версия 5.12.2 и такой код:

     QProcess *console=new QProcess();
     QString command;
     command = "echo MyPassword|sudo touch 1";
     console->startDetached(command);

И он почему-то не работает.

     QProcess process; 
     QString command = "echo MyPassword|sudo touch 1";    
     process.start(command);

Тоже не работает. Вывод приложения такой:

     QProcess: Destroyed while process ("echo") is still running.

Ответы (2 шт):

Автор решения: Andrey madmentat

Так, нагуглил про BASH. В UBUNTU-подобных ОС sudo требует ключа "-S", причем, именно большого "S", иначе не получится:

echo MyPassword | sudo -S touch 1
→ Ссылка
Автор решения: Sergey Tatarincev

Надо было посмотреть на что жалуется. В отличие от винды, в линуксе все команды должны чем то обрабатываться. Вам надо примерно такое:

void MainWindow::on_pushButton_clicked()
{

    QProcess* p = new QProcess();
    connect(p,&QProcess::readyReadStandardError,this,&MainWindow::slot_readyRead);
    connect(p,&QProcess::readyReadStandardOutput,this,&MainWindow::slot_readyRead);
    connect(p,static_cast<void (QProcess::*)(int)>(&QProcess::finished),this,&MainWindow::slot_finished);
    QString password = QInputDialog::getText(this,"Hello", "Insert your password", QLineEdit::Password);
    p->start("sh", QStringList() << "-c" << QString("echo %1 | sudo -S %2").arg(password).arg(ui->lineEdit->text()));
}

void MainWindow::slot_finished(int exitCode)
{
    ui->plainTextEdit->appendPlainText(QString("Process exited with code %1").arg(exitCode));
    qobject_cast<QProcess*>(sender())->deleteLater();
}

void MainWindow::slot_readyRead()
{
    QByteArray output = qobject_cast<QProcess*>(sender())->readAllStandardError();
    if(!output.isEmpty())
        ui->plainTextEdit->appendPlainText(QString("\nERROR: %1\n").arg(QString::fromUtf8(output)));
    output = qobject_cast<QProcess*>(sender())->readAllStandardOutput();
        if(!output.isEmpty())
            ui->plainTextEdit->appendPlainText(QString::fromUtf8(output));
}
→ Ссылка