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 шт):
Так, нагуглил про BASH. В UBUNTU-подобных ОС sudo требует ключа "-S", причем, именно большого "S", иначе не получится:
echo MyPassword | sudo -S touch 1
Надо было посмотреть на что жалуется. В отличие от винды, в линуксе все команды должны чем то обрабатываться. Вам надо примерно такое:
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));
}
