Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/02/2009, à 12:41

pmdzlineur

[RESOLU]lancer un bash en terminal à partir d'un programme C++

Bonjour,
j'écris un programme en QT C++ .
Je dois copier un répertoire dans un /var/www.
Je dois donc être en root.
J'ai donc écris un petit bash qui fait ça.
Mais comment dans mon programme C++ pouvoir accéder au terminal pour lancer ce bash en terminal et donc obtenir le prompt de mot de passe, ou bien pouvoir passer le mot de passe en argument par un QLine Edit.
J'en suis là :

#include <QtGui>
#include <QtCore>
#include "stdlib.h"
#include "string.h"

#define tr QObject::tr
#define trUtf8 QObject::trUtf8

int main(int argc,char* argv[]){
QApplication app(argc,argv);
QStringList arguments = app.arguments();
QFileInfo pathinfo(arguments[0]);
QString pathabsolu = pathinfo.absolutePath();
QStringList localhostMphp;
localhostMphp << "http://localhost/MedinPHP/index.php";
#ifdef Q_OS_LINUX
QString firefox = "/usr/bin/firefox";
QString www = "/var/www";
QString apache = "apache";
QString medinphp = "MedinPHP";

QDir dir2("/etc");
QDir dir1(""+www+"");
QStringList listdir1 = dir1.entryList();
QStringList listeetc = dir2.entryList();

if(listeetc.contains("apache")==false){
QMessageBox::warning(0,tr("erreur"),trUtf8("Je n'ai pas trouvé apache, est-il installé ?\nSi non veuillez en terminal installer apache2."),QMessageBox::Abort);}

else if(dir1.exists()==false){
QMessageBox::warning(0,tr("attention"),trUtf8("/var/www n'existe pas"),QMessageBox::Abort);}

else if(listdir1.size() == 0 || !listdir1.contains(medinphp)){
QMessageBox::warning(0,tr("attention"),trUtf8("MedinPHP n'est pas installé dans /var/www,\nvoulez vous l'installer ?"),QMessageBox::Ok|QMessageBox::Ok);
QString cheminprocessbash = pathabsolu+"/copymedinphp.sh";
std::string processbash = cheminprocessbash.toStdString();
const char* chprocessbash = processbash.c_str();
int retour = system(chprocessbash);
	if(!retour==0){
	QMessageBox::warning(0,trUtf8("erreur"),trUtf8("erreur lancement system()"),QMessageBox::Ok);
	}

Merci

Dernière modification par pmdzlineur (Le 08/02/2009, à 17:49)


je ne suis pas informaticien, juste utilisateur un peu averti ;-)
http://www.freemedforms.com/fr/start
http://code.google.com/p/rapidcomptamed/
médecin volant, mais pas en même temps ;-)

Hors ligne

#2 Le 08/02/2009, à 13:54

Bburst

Re : [RESOLU]lancer un bash en terminal à partir d'un programme C++

Si ton application est graphique, tu peux lancer la commande "gksudo bash path/to/script.sh" depuis ton programme c++.
Tu n'as pas besoin de passer par un terminal.
Pour lancer une commande (et si tu n'as pas besoin d'interagir avec le programme) tu peux faire directement :

#include <stdlib.h>
...
system("gksudo bash path/to/script.sh");
...

Ce qui va lancer la commande, et continuer ton programme tout de suite (pas d'attente).

Hors ligne

#3 Le 08/02/2009, à 15:46

pmdzlineur

Re : [RESOLU]lancer un bash en terminal à partir d'un programme C++

merci beaucoup de ta réponse, ça marche bien et ça me dépanne.
Cependant ça ne marchera que sur les distribs qui utilisent "en natif" sudo comme Ubuntu.
Par exemple sous Debian il faut déclarer sudo par visudo, ça nécessite de la part de l'utilisateur un peu de connaissances.
J'ai regardé, il y a aussi gksu, je vais tester. En espérant que c'est plus portable.
Ton avis ?


je ne suis pas informaticien, juste utilisateur un peu averti ;-)
http://www.freemedforms.com/fr/start
http://code.google.com/p/rapidcomptamed/
médecin volant, mais pas en même temps ;-)

Hors ligne

#4 Le 08/02/2009, à 15:56

Bburst

Re : [RESOLU]lancer un bash en terminal à partir d'un programme C++

Je connaissais pas gksu, mais apparemment c'est juste une interface autour de su, qui est disponible sous debian, j'imagine.
Apparemment, "gksudo" = "gksu root", tu peux donc remplacer l'un par l'autre si c'est plus portable (ce dont je n'ai aucune idée).

Hors ligne

#5 Le 08/02/2009, à 17:45

pmdzlineur

Re : [RESOLU]lancer un bash en terminal à partir d'un programme C++

Bon je verrai ça plus tard wink
Donc le code qui marche, pour ceux qui en auraient besoin, vu que j'ai eu du mal à trouver sur google.

#include <QtGui>
#include <QtCore>
#include "stdlib.h"
#include "string.h"

#define tr QObject::tr
#define trUtf8 QObject::trUtf8

int main(int argc,char* argv[]){
QApplication app(argc,argv);
QStringList arguments = app.arguments();
QFileInfo pathinfo(arguments[0]);
QString pathabsolu = pathinfo.absolutePath();
QStringList localhostMphp;
localhostMphp << "http://localhost/MedinPHP/index.php";
#ifdef Q_OS_LINUX
QString firefox = "/usr/bin/firefox";
QString www = "/var/www";
QString apache = "apache";
QString medinphp = "MedinPHP";

QDir dir2("/etc");
QDir dir1(""+www+"");
QStringList listdir1 = dir1.entryList();
QStringList listeetc = dir2.entryList();

if(listeetc.contains("apache")==false){
QMessageBox::warning(0,tr("erreur"),trUtf8("Je n'ai pas trouvé apache, est-il installé ?\nSi non veuillez en terminal installer apache2."),QMessageBox::Abort);}

else if(dir1.exists()==false){
QMessageBox::warning(0,tr("attention"),trUtf8("/var/www n'existe pas"),QMessageBox::Abort);}

else if(listdir1.size() == 0 || !listdir1.contains(medinphp)){
QMessageBox::warning(0,tr("attention"),trUtf8("MedinPHP n'est pas installé dans /var/www,\nvoulez vous l'installer ?"),QMessageBox::Ok|QMessageBox::Ok);
QString cheminprocessbash = "/usr/bin/gksudo bash "+pathabsolu+"/copymedinphp.sh";
std::string processbash = cheminprocessbash.toStdString();
const char* chprocessbash = processbash.c_str();
int retour = system(chprocessbash);
	if(!retour==0){
	QMessageBox::warning(0,trUtf8("erreur"),trUtf8("erreur lancement system()"),QMessageBox::Ok);
	}

Merci encore de ton aide.

Dernière modification par pmdzlineur (Le 08/02/2009, à 17:47)


je ne suis pas informaticien, juste utilisateur un peu averti ;-)
http://www.freemedforms.com/fr/start
http://code.google.com/p/rapidcomptamed/
médecin volant, mais pas en même temps ;-)

Hors ligne