[Λύθηκε] Προβλημα σε πρόγραμμα C++, Java που τρέχει sudo linux_εντολές

tom1972 | Κυρ, 09/07/2014 - 00:34 | 2' | 24

Έχω φτιάξει ένα πρόγραμμα σε C++ το οποίο τρέχει εντολές του linux που απαιτούν κωδικό sudo με τη βοήθεια της συνάρτησης της C++ system().

Τρέχει κανονικά το πρόγραμμα, και "στέκεται" να του βάλω κωδικό sudo ....

ΠΡΟΣΟΧΗ τώρα ....

Το ίδιο προγραμμα σε Java, με χρήση της

Runtime.getRuntime().exec("sudo εντολή_linux"), όταν πάει να τρέχει την εντολή μου γράφει "[sudo] password for tom:", ΔΕΝ "στέκεται" να του βάλω κωδικό (καλά ούτε οι γυναίκες μου στέκονται ....), και περνάει στην επόμενη χωρίς sudo εντολή την οποία εκτελεί κανονικά, και τέλος .... , δηλαδή εμφανίζει στην κονσόλα το παρακάτω :

"[sudo] password for tom: [email protected]-Laptop:~ >".

Δεν ξέρω αν χρειάζεται να έχετε γνώσεις Java, αλλά χρειάζομαι τις ειδικές σας γνώσεις στο linux ....

ΥΓ : Έθεσα το ερώτημα και σε κάποια προγραμματιστικά site, αλλά απάντηση δεν πήρα, παρά μόνο να αλλάξω το sudoers αρχείο .... Εγώ δε θέλω να υποβάλλω ένα μελλοντικό χρήστη της εφαρμογής σε τέτοιες περιπέτειες, ώστε να του κάνω τη ζωή πιο εύκολη και να μην αναγκαστεί να με βρίζει ....

Ευχαριστώ εκ των προτέρων .... Θωμάς !

Δώσε αστέρια!
Σχόλια

Φίλε μου μόλις το κοίταξα και έγραψα αυτό για να το δοκιμάσω ....

$echo mypassword\n | sudo -S <εντολή>

όπου mypassword έβαλα τον κωδικό μου, και μου έβγαζε IOException ...

Δεν ξέρω αν το κατάλαβα καλά αυτό που έγραφε η εξήγηση και δεν το εξηγάει με ένα παράδειγμα ...

Ξέρεις πως να το κάνω ?

ΥΓ : Δεν είναι "χαζό" να βάλω μέσα στον κώδικά μου τον κωδικό μου ?

Το κοίταξα πιο πριν .... δε γράφει κατι διαφορετικό .... Ασε που τα γράφει για τη C ...

Κάπου έχει το echo σκέτο χωρίς το $.

Όταν το έβγαλα, δε μου έτρεξε καθόλου η εντολή ... ούτε exception ούτε τίποτε.

Θα σου πρότεινα να κάνεις στην αρχή sudo su για να αποκτήσεις πρόσβαση root, και μετά γράψε την εντολή του linux χωρίς το sudo.

Ερώτηση : η ASK_PASS η οποία είναι μεταβλητή περιβάλλοντος ξέρει κάποιος τι είναι και πως λειτουργεί ?

Έψαξα αλλά δεν κατάλαβα πως λειτουργεί !

@ Precise Δεν λειτουρεί αυτό που μου προτίνεις ....

@ Maras

Παρεμπιπτόντως ευχαριστώ για τη μεταμεσονύχτια βοήθεια .... !

Τίποτα Tom, απλά μετά ήμουν πολύ κουρασμένος για να συνεχίσω.

Λοιπόν για να συνοψίσουμε, θέλεις να τρέχεις το πρόγραμμα σε Java και όταν εκτελείται η sudo να περιμένει να του δώσεις το password. Σε C++ λές ότι τα κατάφερες, αλλά στην Java δεν περιμένει και πάει στην επόμενη εντολή, σωστά?

Τα 2 προγράμματα είναι αντίστοιχα? Δηλαδή ότι έκανες στη C++ μετά το έκανες και στην Java με τις αντίστοιχες εντολές?

Απ' αυτά που διάβασα φαίνεται ότι η παράμμετρος -S στην sudo, την κάνει να γίνεται η είσοδος από το stdin.

Το να γράψεις το password σου στον κώδικα είναι όντως χαζό...
 

C++ και Java είναι οι κώδικες αντιγραφή, απλά είναι μετάφραση στις αντίστιχες εντολές ...

π.χ.

Runtime.getRuntime().exec("blabla"+"blabla"+var);

system("blabla"+"blabla"); [το var πως το έμπασα μέσα στο system έγινε με μια χαριτωμενιά που βρήκα σε ένα site]

Ότι και να είναι στη C++ λειτουργεί, αλλά σε Java τρέχει η sudo εντολή, γράφει αυτά που ανέφερα

"[sudo] password for tom: [email protected]-Laptop:~ >"

Από ότι φαίνεται στην πάνω γραμμή, παρακάμπτει τον κωδικό περνά στην άλλη εντολή και τελειώνει ...

 

Δε φαίνεται να λειτουργεί, αλλά θα το κοιτάξω αργότερα φίλε ...

Μια παρατήρηση ...

Γι' αυτό που λέγαμε :

" Το να γράψεις το password σου στον κώδικα είναι όντως χαζό "

Θα έβρισκα κάποια λύση ....

Αν δεν γινόνταν αλλιώς, θα μπορούσα να βάλω στη θέση του μια μεταβλητή, καλώντας το χρήστη από την 1η στιγμή να βάλει τον κωδικό του για το πρόγραμμα αυτό ...

Τον κωδικό θα τον αποθήκευα στη μεταβλητή αυτή (στη μνήμη θα αποθηκευόνταν ποιος θα τον υπεκλεπτε ?), και θα τον χρησιμποποιούσα έτσι ...
Απλά μια ιδέα στην περίπτωση που δε γινόταν τίποτε άλλο ....

Ναι απλά δε νομίζω ο κωδικός σου να είναι αποθηκευμένος σε string μορφή, απλά θα τον έβρισκες, θα τον έκανες parse σε string και θα έκανες έναν έλεγχο με το string που θα έδινε ο χρήστης.

Φίλε Maras θα σου εκμνηστηρευτώ κάτι ....

Με τη Java ασχολούμαι το τελευταίο εξάμηνο !

Από αυτά που λέει μέσα στο stackoverflow τα μισά δεν καταλαβαίνω γιατί τα κάνει ...

Θα προσπαθήσω να καταλάβω πως θα τα εφαρμόσω και θα σου ποστάρω εδώ προσπάθειες, να μου πεις (όποτε νοιώσεις ότι έχεις διάθεση, χρόνο και μπορείς - δεν το βιάζομαι ... ) που και αν κάνω λάθος !

Όχι αύριο, αλλά αυτές τις μέρες μόλις βρώ λίγο ελεύθερο χρόνο ....

Νόμιζα ότι θα καθαρίσω σαν τη C++ (που όχι ότι την ξέρω τέλεια, αλλά η system του "μεγάλου" Ritchie καθάρησε για όλα για εμένα ....).

Τώρα με μπλέκει με : Runtime (που προχθές την έμαθα), με ProcessBuilder, με InputStreamReader (την οποία ακούω για 1η φορά ... - μπλέκει Stream και Reader).

Βασικά σε ντρέπομαι αλλά θέλω πολλά να μάθω ακόμη ...

Να ξέρεις ότι αν με βοηθήσεις, ότι μου πεις θα είναι άκρως διδακτικό για εμένα ... !

Δε με νοιάζει για το πρόγραμμα που θέλω να γράψω (λειτουργεί σε C++), αλλά η όλη διαδικασία θα με κάνει απλά καλύτερο !

Με εκτίμηση Θωμάς

Λοιπόν επειδή ασχολείσαι μόνος σου, θα σου πρότεινα να σπάσεις την εκμάθηση της Java σε κομμάτια. Δηλαδή (I/O, εντολές ελέγχου, εντολές επανάληψης, κλάσεις, συναρτήσεις κτλπ). Επίσης καλό είναι να πάρεις και ένα βιβλίο για να έχεις ένα σημείο αναφοράς. Επειδή είναι αντικειμενοστραφής γλώσσα και ήδη ξέρεις C++, δεν θα έχεις πρόβλημα.

Μην αγχώνεσαι καθόλου, εδώ είμαστε να βοηθήσουμε όσο μπορούμε. Να ξέρεις ότι δεν υπάρχει χαζή ερώτηση. Αν γνωρίζω κάτι από τις απορίες που μπορεί να σου δημιουργηθούν, θα είναι χαρά μου να στο εξηγήσω.

Φιλικά Μάρας.
 

Σε ευχαριστω για τις συμβουλές φίλε Maras ...

Αυτές τις μέρες θα ξαναρωτήσω επάνω στο θέμα, μόλις ψάξω λίγο αυτά τα site που μου συνέστησες !

Με εκτίμηση Θωμας !!

Tom, εψαξα και βρηκα το παρακατω το οποιο με λιγη τροποποιηση δουλεψε

Μου έβγαλε error 1 οταν ΔΕΝ ειχα δικαιωματα να εκτελεσω την εντολη

import java.io.*;

public class sudo {
    public static void main (String[] args){
        
        String sudo = "sudo ";
        String command = "ps aux";

        try{
            Runtime rt = Runtime.getRuntime();
            Process pr = rt.exec(sudo + command);

            BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
                    String line=null;
 
                    while((line=input.readLine()) != null) {
                            System.out.println(line);
                       }//End of while
 
                    int exitVal = pr.waitFor();
                    System.out.println("Exited with error code "+exitVal);
 
                  } catch(Exception e) {
                    System.out.println(e.toString());
                    e.printStackTrace();
                  }//End of catch
        }//End of main
}//End of Class

 

Με τον κώδικα του slackware "στέκεται", να του βάλω κωδικό ....

Από τα site που έψαχνα έλλειπε η εντολή ....

"int exitVal = pr.waitFor();"

που από ότι κατάλαβα καλεί τη διεργασία να περιμένει να ολοκληρώσω αυτό που θέλω ...

Το θέμα μου λύθηκε ....

Ευχαριστώ τον slackware για την λύση (πάντα έχει λύση .... ο φίλος), και το φίλο Maras που με τα link με έφερε πιο κοντά στο πρόβλημα (απλά ενημερώθηκα για θέματα της java που δεν είχα ασχοληθεί ....), και μπόρεσα να καταλάβω καλύτερα τα γραφόμενα του slackware !!

Με εκτίμηση Θωμάς !

Απλά έχω μπεί στη διαδικασία να μετατρέψω σε πρόγραμμα το script που είχα κάνει παλιά εδώ

http://www.linuxinsider.gr/content/8262/script-mount-unmount-cd-dvd-iso-udf

Ήταν πολύ απλοικό γιατί δεν μπορούσα να χειριστώ το bash (δεν το ήξερα) τέλεια ώστε να προγραμματίσω κάτι πιο "σοβαρό".

Με C++, Java, μπορώ να χειριστώ την κατάσταση καλύτερα ....

Προς το παρόν το έχω κάνει super με C++, και τώρα θα το μεταφράσω σε Java ....

Απλά θέλω να μην είμαι όμηρος του cdemu, που πότε εγκαθίσταται πότε όχι, και μια φορά μου κράσαρε ...

Το δικό μου δεν κρασάρει, γιατί χρησιμοποιεί τις mount εντολές κατευθείαν ...

(το τελευταίο δεν μπορώ να το εξηγήσω απλά δεν κρασάρει ...)