c++, τώρα πως να το εκφράσω ...??

luckyb | Πέμ, 12/25/2008 - 19:18 | 1' | 9

Καλά Χριστούγεννα σε όλους
Εύχομαι μια χρονιά με πολύ και ελεύθερο κώδικα
:-)

Ψάχνω έναν τρόπο να τρέχω μέσα από πρόγραμμα σε c++ μια διεργασία με δικαιώματα root.
(νομίζω καταλάβατε ποιο πρόγραμμα είναι αυτό :-p)

Δηλαδή να τρέχει οποιοσδήποτε χρήστης το πρόγραμμα με ότι δικαιώματα έχει. Αλλά κάποια στιγμή η εφαρμογή χρειάζεται να τρέχει συγκεκριμένη διεργασία η οποία θέλω να τρέχει με δικαιώματα root (να ζητάει password φυσικά).

Ελπίζω να μη μου απαντήσει κανείς σύντομα γιατί Χριστουγεννιάτικα θα έχει καλύτερα πράγματα να κάνει
:-)

Δώσε αστέρια!

MO: (ψήφοι: 0)

Σχόλια

Καλές γιορτές σε όλους!

Πρόσφατα βρήκα αυτό:
_____________________________________________________
#include

int main()
{
execlp ("sh", "sh", "-c", "kdesu konqueror", NULL);
return 0;
}
_____________________________________________________

το οποίο τρέχει αντί για 'kdesu konqueror' ό,τι του πεις.
Τώρα για σκέτο su command δεν ξέρω, δοκίμασέ το, αλλά το sudo τρέχει κι αυτό.

thank u spatman
...και καλές γιορτές
:-)

πολύ χρήσιμο αυτό που γράφεις.
Όντως μπορείς να τρέξεις κάτι ως root,
...αλλά στη δική μου περίπτωση (την οποία δεν διευκρίνισα αρκετά όπως πάντα) δεν βολεύει για τους εξής λόγους:

- θέλω κάτι που να δουλεύει σε όλες τις διανομές, με οποιοδήποτε γραφικό περιβάλλον. Οπότε θα υπάρξει μια σύγχυση στο τι να χρησιμοποιήσω (kdesu, gksu, sudo, su, su-to-root...). Σκέφτομαι αν μπορώ με συνθήκες να το ελέγξω...

- Το βασικότερο είναι ότι σε περιορίζει σε ήδη υπάρχον εκτελέσιμο (τώρα θα μου πεις, "διεργασία δεν ανέφερες ??" ...και θα'χεις και δίκιο). Θα ήθελα να μπορώ να τρέξω και απλά ένα μέρος του κώδικα με διαφορετικά δικαιώματα (πχ εκεί που είσαι στο κυρίως παράθυρο του gui να πατάς ένα κουμπί και να βγαίνει...
ένα άλλο παράθυρο με τα επιθυμητά δικαιώματα, αφού έχει ζητήσει root password)

αλήθεια, αν τρέξεις ένα εκτελέσιμο το οποίο δεν χρειάζεται x-server με πχ "kdesu KanoPapadesStinKonsola", θα σου ζητήσει root password με γραφικό διάλογο.
Το KanoPapadesStinKonsola θα τρέξει ?? :?

Δεν έχω ψάξει αρκετά το θέμα, νομίζω όμως ότι αν μια εφαρμογή τρέξει ως root τότε θα έχει δικαιώματα υπερχρήστη όσο τρέχει. Έτσι, αν θες μια πρόχειρη λύση, θα μπορούσες να φτιάξεις το dialog σου ως ξεχωριστό εκτελέσιμο πρόγραμμα και να το καλείς μέσα από το GUI σου, αλλά μάλλον αυτό είναι μπελάς... Πάντως το "kdesu touch /root/test" έτρεξε, άρα και οι άλλοι PapadesStinKonsola μάλλον θα τρέξουν.

μπράβο ρε spatman

τελικά μπορεί να γίνει δουλειά :-)

Θ'αργήσω να επανέλθω (φεύγω για διακοπές !!) βέβαια

σ'ευχαριστώ πολύ

Νομίζω ότι βρήκα μια λύση στο πρόβλημα σου. Ακολουθώντας τις πατροπαράδοτες αξίες του ανοιχτού λογισμικού (κ του καλού λαδιού), δεν έχεις παρά να εγκαταστήσεις τις αντίστοιχες "dev" βιβλιοθήκες που χρειάζεσαι κ να βάλεις τα σχετικά #include στον κώδικα σου. Πχ για το gksu βρήκα:

dimitris@gibbons:~$ apt-cache show libgksu2-dev
(...)
Description: library providing su and sudo functionality (development files)
This library comes from the gksu program. It provides a simple
API to use su and sudo in programs that need to execute tasks
as other user. It provides X authentication facilities for running
programs in an X session.

Κάτι αντίστοιχο πρέπει να υπάρχει κ για KDE, κ φαντάζομαι ότι θα υπάρχει κ για το κλασσικό sudo/su. Αν δεν τα βρίσκεις, σφύρα να τα ψάξουμε μαζί.

"Use the source" luckyb, μας κάνεις περήφανους :)

Αν εγκαταστήσεις το παραπάνω πακέτο, πήγαινε καρφωτός στο /usr/share/doc/libgksu2-dev/html/index.html.

Έχει πλήρη αναφορά σε όλο το API κλπ. Επίσης, αν χρησιμοποιείς το devhelp, θα εμφανιστεί κ εκεί.

gnu_labis,

θα με κάνεις να παραβώ τις αρχές μου
...και να πάρω το laptop μαζί μου στις διακοπές !!!
}:)

An katalaba kala ayto pou thes na kaneis einai to programma sou na mporei na treksei ena komati tou (as poume tin synartsi mustberoot) san root opoiadipote xroniki stigmi, eno to ypoloipo trexei san kapoios aplos xristis (as poume o xristis luser).

To provlima sou synithos lynetai anapoda apo ayto pou perigrafeis.

Kane to programma sou setuid root, oste na ksekinaei me UID x (as poume to uid tou luser) kai effective UID 0 (root). Anoikse ena pipe, kai kane fork ena child process pou tha treksei tin synartisi mustberoot otan tou pei to parent process meso tou pipe, kane to child process na blockarei perimenontas input apo to pipe mesa se ena loop. Thymisou oti afou to programma ksekinise me euid 0 kai ekane fork, to child process exei episis euid 0.

Sto parent process gine o xristis luser kanontas setuid(getuid()), etsi theteis to UID kai to EUID iso me to UID (pou einai tou xristi luser). To parent process loipon kanei oti thes na kanei to programma sou, kai otan apofasiseis oti prepei na treksei i synartisi mustberoot, kane write ena opoiodipote byte sto pipe. Ayto exei os apotelesma na ksypnisei to child process na treksei tin synartisi kai molis ayti i synartisi epistrepsei na ksanakanei block diabazontas gia to epomeno byte sto pipe.

An kati den katalabes rota.

--
John Tsiombikas
http://nuclear.sdf-eu.org/

nuclear]An kati den katalabes rota.

Από που ν' αρχίσω ??
:-p

Μάλλον καλύτερα να μην αρχίσω ακόμα :-)
Η φιλοσοφία είναι κατανοητή.
Απλά πρέπει να ρίξω λίγο διάβασμα για την υλοποίηση στην πράξη.

nuclear,
δεν ξέρω πως τό'κανες αυτό, αλλά άλλαξες τον τρόπο που σκέφτομαι !!
Το συγκεκριμένο πρόβλημα, αργά ή γρήγορα θα λυθεί.
Η ουσία είναι πως είδα μια διαφορετική οπτική γωνία αντιμετώπισης καταστάσεων.
Καμιά φορά, χωρίς ιδιαίτερο λόγο, ένα συγκεκριμένο γεγονός το καταφέρνει αυτό.
Μακάρι να μπορούσα να το εκφράσω καλύτερα...