PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C/C++: Pseudo Terminal + su



lukrop
02-08-2007, 17:27
Ich schreibe an einem Qt Programm und brauche zu gewissen zeitpkt. root zugriff, sprich ich muss aus dem programm heraus (also in c implementiert) su und ssh ausfuehren koennen. Da ssh und su aus einem pseudoterminal gestartet werden muessen und nicht direkt ueber QProcess startbar sind habe ich mittels forkpty() mir zu einem pseudoterminal verholfen. Ich kann auch (wenn ich auf mit read() und write() auf den filedeskriptor zugreie) verschiedene commands wie `ls -oh` oder `mkdir` ausfuehren nur wenn es zu ssh oder su kommt wird es problematisch. Wenn ich dem filedeskriptor des pseudoterminals mit write() das `su` command zukommen lasse wird su als eigener childprozess der bash (die im pseudoterminal laeuft) gestartet und ich bekomme keinen output mehr zu sehen... wenn ich das programm aus einer shell heraus starte sehe ich noch "Passwort: " nach dem su aufruf... Hier kommt noch der code (ist eine funktion des Qt Programms und noch nicht sehr sauber programmiert, aufgrund meiner andauernden testerei)


#define BLOCKSIZE 64 //bytes
#define BASH "/bin/bash"

int fd;
int pty;
char buffer[BLOCKSIZE];


pty = forkpty(&fd,0,0,0);

if (pty == -1){
perror("Failed!");
}

if (pty == 0){

// char *cmd[] = { "su -", (char *)0 };

execv(BASH,NULL);

}

else {
qDebug() << "Child PID:" << pty;
// waitpid(pty,&status,NULL);

write(fd, "\n",1);
write(fd, "su\n", 3);
write(fd, "<hierdaspw>\n",8);
write(fd, "ls -oh\n",7);
// write(fd, "\n",1);

while(1)
{
int length = 0;
// int len2 = 0;
length = read (fd, buffer, BLOCKSIZE);
// len2 = read(0, buffer, BLOCKSIZE);
if (length == 0 || (length < 0 && errno != EINTR))
break;
if (length > 0)
write (1, buffer, length);
// if (len2 > 0)
// write (1, buffer, len2);
}


lg lukrop

edit:

hier noch der output wenn ich es aus einer shell herausstarte (wenn nicht dann steht "Passwort:" nicht da)

lukas@cheetah64x2 ~/projekte/apps/donkeydb $ ./donkeydb
Child PID: 19934

su
ls -oh
lukas@cheetah64x2 ~/projekte/apps/donkeydb $
lukas@cheetah64x2 ~/projekte/apps/donkeydb $ su
Passwort: Getötet

lukrop
03-08-2007, 00:19
geloest...


#define BLOCKSIZE 64 //bytes
#define BASH "/bin/bash"

int fdM;
int fdS;

char slaveName;

int pty;
int isctty;

char buffer[BLOCKSIZE];

char user[] = {"root"};

pty = forkpty(&fdM,&slaveName,0,0);

if (pty == -1){
perror("Failed!");
}

else if (pty == 0){ /* Kindprozess */


execl(BASH,"bash","-c","su","-",user,NULL);
}

else { /* Elternprozess */
// waitpid(pty,&status,NULL);

fdS = open(&slaveName,O_RDWR);

sleep(1);

write(fdM,"<meinpw>\n",<pwlaenge>);
write(fdM,"cd\n",3);
write(fdM,"ls\n",3);
qDebug() << "Child PID:" << pty;

while(1){

int length = 0;

length = read (fdM, buffer, BLOCKSIZE);
if (length == 0 || (length < 0 && errno != EINTR))
break;
if (length > 0)
write (STDOUT_FILENO, buffer, length);
}

ist zwar nicht die schoenste variante aber endlich geht es... :)