Mein C Programm braucht Root rechte!

Yellow

Yellow

Doppel-As
Hi Leute!

Ich habe mal hier im Forum gesucht aber leider keine für mich nachvollziehbare Erklärung für meine Situation gefunden.

Ich möchte ein Programm schreiben das mit start meinen USB-Stick umountet. Das Programm ansich ist nicht das Problem. Doch ich kann nur mit root Rechten "mounten, umounten". Wie kann ich das am besten lösen?

Wäre euch für ein nettes Beispiel etc. sehr dankbar :hilfe2:
(Beispiel bitte nur auf die Rechte bezogen, rest will ich selber versuchen ;) )

Yellow

PS: Dieses Programm möchte ich entwickeln weil es besser sein soll einen USB-Stick erst zu umounten bevor ich in entfehrne. Link zu dem Tread im Unixboard: :::LINK:::

EDIT: Ich habe mich mal bei netten Usern in unserem Chat ein bischen Informiert und habe erfahren das ich ja mittels
"sudo -u root /file/path" ja auch ein Proggy ausführen kann. Doch ich möchte ja gerne das dass Programm root Rechte hat. (hm... bin ich damit im falschen Thread)?
 
Zuletzt bearbeitet:
Wo ist das Problem? Wenn du dein Programm mit Sudo ausführst müsste es doch gehen!? Und warum willst du sowas denn in C schreiben? Für sowas sollte ein Shell-Skript nun wirklich ausreichen!? Und was soll das Programm denn genau machen? Schreibe dir doch einfach nen einfachen alias in deine .bashrc - Dann kannste nen selbst gewählten Befehl (zB "hans") ausführen und dieser wird dann wie ein "sudo umount ..." ausgeführt. Dann musste halt dein PW eingeben aber einfacher wirste das nich hinkriegen fürchte ich!?...
 
Danke hört sich super an. Aber da ich noch nicht so erfahren in Linux bin, denke ich wird es etwas Probleme für mich mit dem .bashrc geben!

Und das ich dazu C nehme liegt daran das ich es als Progammierübung benutzte ;)
 
Code:
alias start_usb='sudo mount /dev/sdx /mnt'
in die ~/.bashrc eintragen

Zum Bleistift

Oder ein Startscript:
Code:
#! /bin/bash

if [ ${UID} != "0" ]; then
 echo "Keine Berechtigung"
  exit 1
   fi

case $1 in

start)
echo "Mounting /dev/sdx ..."
mount /dev/sdx /mnt
echo "done!"
;;

stop)
echo "Unmounting /dev/sdx ..."
umount /dev/sdx
echo "Done!"
;;

restart)
$0 stop
$0 start
;;

*)
echo "Usage: `basename $0` start|stop|restart"
 exit 1
;;

esac
 
Auch wenn du es jetzt nicht benutzen willst dürfte die .bashrc interessant für dich sein. Ich erklärs dir mal, weil ich grad zuviel zeit hab:
In der Datei ( /home/deinusername/.bashrc ) stehen die Befehle, die beim Start der Shell ausgeführt werden sollen.
Der Befehl "alias" erlaubt dir, kurzschreibweisen für lange Befehle zu erstellen.
Wenn du so einen Alias-Befehl jetzt also in deine .bashrc reinschreibst läd die Shell immer diese kurzschreibweise. Jetzt kannst du zB in deine Bashrc sowas wie
Code:
# Meine Aliase <- das ist wegen der Route ein Kommentar
alias [COLOR="Lime"]hans[/COLOR]='[COLOR="Purple"]sudo chown www-data /var/www/webdesign/ -R[/COLOR]'
Das grüne Ding kannst du nennen, wie du willst (aber sollte kein normaler Befehl wie "ls" sein, sonst gibts Komplikationen). Das Lilane Ding muss der Befehl sein, der tatsächlich ausgeführt werden soll. also bei dir sowas wie "umount ..."
Hoffe das war aufschlussreich
 
Hi,

du kannst dich zur Gruppe wheel hinzufügen und dann in visudo (also root ausführen) hier die 2. Zeile unkommentieren:
Code:
# Same thing without a password
#%wheel  ALL=(ALL)       NOPASSWD: ALL

Dann musst du bei sudo nie mehr das Passwort eingeben. Ist ganz schön praktisch, aber auch unsicher.
 
Benutzt doch einfach pmount, das läuft suid-root und ist auch noch einfacher zu nutzen. Und ja, %wheel ALL=(ALL) NOPASSWD: ALL ist wirklich eine saudumme Idee.
 
Also erstmal danke für eure Antworten. Ich bin mir nun noch nicht ganz sicher wie ich es machen werde, doch ich denke anhand eurer Beispiele wird mir schon eine Vernünftige Variante einfallen.

Doch eine Frage z-shell(oder euch): Was ist das für ein Syntax? Also C ist das nicht oder? Wo bekomme ich Leermaterial für diese Sprache her!?

Thx Yellow
 
Wo bekomme ich gute Lektüre dafür her? Möchte das nicht nur Copy / Pasten. Möchte das dann schon begreifen was ich da genau schreibe und von meinem System verlange!

EDIT: LACH, HABEN ZUR GLEICHEN GESCHRIEBEN! ;)
 
Zuletzt bearbeitet:
@z-shell: Danke für die Super Links. Habe dir mir erstmal gesaved ;) THX
 
*thread aufwaerm*

ich schreibe ein programm, dass mittels forkpty() einen pseudo-terminal oeffnet und auf dessen file-diskreptoren ich schreiben kann... soweit so gut, das funktioniert... wenn ich allerdings auf diesem pty "su -c <irgendeincommand>" ausfuehren will passiert garnichts... irgendwie wird die passwortabfrage nicht and stdout geschickt sondern su handhabt das anders, jetzt wollte ich wissen ob jemand weiß wie ich das problem loesen kann...

Code:
//Ausschnitt aus dem Programm (Qt-Gui anwendung)

#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);
    write(fd, "\n",1);
    write(fd, "su\n", 3);
    write(fd, "meinpw\n", 7);
// write(fd, "ls -oh\n",7);
    write(fd, "\n",1);
}

else {
qDebug() << "Child PID:" << pty;

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

EDIT:
geloest...

Code:
#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... :)
 
Zuletzt bearbeitet:
Zurück
Oben