[Java] Runtime.getRuntime.exec() doet NIETS

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dag iedereen,

ik ben al een tijdje opzoek naar een manier om een extern commando via Java aan te roepen in Java.
Na wat opzoekwerk kwam ik tot de conclsie dat hiervoor een methode zit ingebouwd, namelijk de Runtime.getRuntime().exec("commando")-methode.

Allemaal goed en wel, maar nu in de praktijk.
Ik wil gemakkelijk starten, en daarom besloot ik gewoon te beginnen met het -ls commando ( Linux ).

Dit zou dan het volgende moeten zijn:

Java:
1
2
3
4
5
try{
        String cmd = "ls";
        Runtime.getRuntime().exec(cmd);}
catch (IOException e) {JOptionPane.showMessageDialog(mainPanel, "error");
      }


Wanneer ik het programma run gebeurt er gewoon niets. Ik heb na het commando ook even een messageBox gezet om te controleren als ik al tot daar geraak, en dat doet hij ook, maar de terminal wordt niet geopend ...

Ik weet dus niet wat ik verkeerd doe, is het misschien het principe dat ik niet begrijp, een fout in de code, of nog iets anders?

Ik schrijf in Netbeans IDE 6.7 onder Ubuntu 9.04 Jaunty

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:26

Creepy

Tactical Espionage Splatterer

Opent geen terminal? Nee, natuurlijk niet. Het voert het process uit en je zult zelf de eventuele input en output moeten afvangen. De exec methode returnt een Process object en aan de hand daarvan kan je de output weer afvangen. Dat staat overigens prima uitgelegd in de docs? Dus heb je die al bekeken?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

Als je wilt dat ie een terminal opent moet je dat op de huidige $SH van de gebruiker doen, of blind bash openen.

Maar ik neem aan dat dat niet de bedoeling is ;)

[ Voor 18% gewijzigd door Sebazzz op 01-08-2009 23:08 . Reden: Reden: Reden: Reden: Reden: Reden: Reden: Reden: Reden: ]

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Alvast een tip om gezeur in de toekomst te voorkomen maak gebruik van processbuilder ipv runtime.exec()

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Bl4ckviper schreef op zaterdag 01 augustus 2009 @ 23:36:
Alvast een tip om gezeur in de toekomst te voorkomen maak gebruik van processbuilder ipv runtime.exec()
En/of bekijk http://www.javaworld.com/...2-2000/jw-1229-traps.html

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Volgens mij heb ik idd de ProcessBuilder nodig.
Ik keek al even in de docs, maar ik snap er eigenlijk niet echt veel van.

Moet ik gewoon mijn commando ingeven ( hier dus -ls ) of moet ik eerst op de een of andere manier mijn terminal open doen?

De code die ik nu heb ziet er als volgt uit:
Er gebeurt weer niks, en ik krijg ook geen foutmelding te zien :s

Java:
1
2
3
4
5
try{
        Process p = new ProcessBuilder("bash").start();
        }
        catch (IOException e) {JOptionPane.showMessageDialog(mainPanel, "Test");
}

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Verwijderd schreef op zondag 02 augustus 2009 @ 11:56:
Volgens mij heb ik idd de ProcessBuilder nodig.
Ik keek al even in de docs, maar ik snap er eigenlijk niet echt veel van.

Moet ik gewoon mijn commando ingeven ( hier dus -ls ) of moet ik eerst op de een of andere manier mijn terminal open doen?

De code die ik nu heb ziet er als volgt uit:
Er gebeurt weer niks, en ik krijg ook geen foutmelding te zien :s

Java:
1
2
3
4
5
try{
        Process p = new ProcessBuilder("bash").start();
        }
        catch (IOException e) {JOptionPane.showMessageDialog(mainPanel, "Test");
}
Als jij een terminal window wil tonen moet je dat of simuleren, of je moet een terminal window starten. Ik ben niet zo'n grote linux gebruiker, maar bash is slechts de (script/shell) interpreter en toont dus geen terminal. Je moet waarschijnlijk een xterm(?) starten.

De grote vraag is: waarom doe je dit? Is er niet een platformonafhankelijke manier om je probleem op te lossen (dus binnen Java)?

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:26

Creepy

Tactical Espionage Splatterer

Een processBuilder of een exec() is geen commandline o.i.d. Bash start je nu onder java. Er wordt dus niet automatisch een terminal gestart. Je zult inderdaad dan zelf een terminal moeten starten (xterm of een andere). Maar wat probeer je nu precies te bereiken? Wil je nu de output van een ls hebben, wil je een terminal starten of wil je iets anders?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
@OP Je moet onderscheid maken tussen de Terminal applicatie (zeg maar het venster dat je op je scherm krijgt), de shell (bash) en de commando's die je binnen die shell kunt uitvoeren (zoals 'ls'). Die drie onderdelen zijn onafhankelijk van elkaar (anders dan onder Windows zijn alle "shell" commando's gewoon losse executables die je ook zonder shell kan aanroepen: onder Windows zit bijv. "dir" ingebakken in de cmd.exe shell).

Jouw Java applicatie roept nu die commando's aan, net als de Terminal applicatie dat normaal doet. Als jij iets op je scherm wilt zien, dan moet je daar zelf voor zorgen (bijv. door stdout en stderr van het gestarte proces uit te lezen en dat op het scherm te zetten).

Als je een terminal wilt starten, moet je de Terminal app aanroepen, niet bash of ls (overigens moet je dan alsnog stderr en stdout inlezen, om te voorkomen dat de applicatie blokt omdat z'n output buffer(s) vol zijn).

[ Voor 26% gewijzigd door Herko_ter_Horst op 02-08-2009 13:36 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
In feite wil ik een applicatie schrijven waarmee gebruikers hun computer na x aantal minuten kunnen afsluiten. Het programma moet op verschillende platformen draaien, en daarom koos ik voor Java.

Ik wou beginnen met het schrijven voor Linux, omdat ik hier nu op programmeer en dan ook direct mijn resultaat kan laten zien.

Het formulier bestaat uit 3 tekstvakken en 1 knop.
In de tekstvakken moet het aantal uur, aantal minuten en aantal seconden worden ingevuld en wanneer op de knop wordt gedrukt zal de computer na de ingevulde tijd aflsuiten.

Om de computer af te sluiten moet ik gebruik maken van een commando, daarmee dat ik wil weten hoe ik zo'n commando moet uitvoeren. Om het mij even gemakkelijk te maken probeerde ik dit eerst met het ls-commando, maar zonder resultaat.

Als ik het goed begrijp, wordt mijn commando nu wel uitgevoerd, maar zie ik het alleen niet ...
Klopt dit?

EDIT: Ik denk nu opeens op een groot probleem. Binnen Linux moet ik het commando als root uitvoeren. Het probleem is echter dat je het wachtwoord dan nodig hebt :s.

Kan ik dit op de een of andere manier omzeilen?

[ Voor 10% gewijzigd door Verwijderd op 02-08-2009 15:01 ]


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

sudo is your friend

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Verwijderd schreef op zondag 02 augustus 2009 @ 14:37:
Als ik het goed begrijp, wordt mijn commando nu wel uitgevoerd, maar zie ik het alleen niet ...
Dat klopt.
EDIT: Ik denk nu opeens op een groot probleem. Binnen Linux moet ik het commando als root uitvoeren. Het probleem is echter dat je het wachtwoord dan nodig hebt :s.

Kan ik dit op de een of andere manier omzeilen?
Omzeilen niet, want dat zou een beetje de beveiliging zinloos maken :) Wat je wel kunt doen is het command uitvoeren via sudo en dan in sudoers je gebruiker de rechten geven om zonder password root commandos uit te voeren. Dat is echter zo gevaarlijk dat je vrijwel niemand zover gaat krijgen om dat te doen :)

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gerco schreef op zondag 02 augustus 2009 @ 15:45:
[...]

Dat klopt.


[...]

Omzeilen niet, want dat zou een beetje de beveiliging zinloos maken :) Wat je wel kunt doen is het command uitvoeren via sudo en dan in sudoers je gebruiker de rechten geven om zonder password root commandos uit te voeren. Dat is echter zo gevaarlijk dat je vrijwel niemand zover gaat krijgen om dat te doen :)
Dus als ik het goed begrijp is het vrijwel onmogelijk om mijn programma te runnen in Ubuntu en OS X?
Of kan ik mijn gebruikers gewoon naar het SUDO paswoord vragen om het daarna te gebruiken?

[ Voor 7% gewijzigd door Verwijderd op 02-08-2009 16:49 ]


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 23:11
Je kunt ze ook vragen om het /etc/sudoers aan te laten passen (met visudo hoor je dat te doen) en ze dit te laten toevoegen:
{username} ALL=NOPASSWD:/sbin/shutdown
Dan kan een specifieke gebruiker de computer afsluiten zonder wachtwoord.

Verder: besef je wel dat je nu een programma aan het maken bent voor functionaliteit die in zowel Windows als Linux (en Mac vrij zeker ook) al standaard met het shutdown- command mogelijk is. :)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jaap-Jan schreef op zondag 02 augustus 2009 @ 17:00:
Je kunt ze ook vragen om het /etc/sudoers aan te laten passen (met visudo hoor je dat te doen) en ze dit te laten toevoegen:


[...]
Dan kan een specifieke gebruiker de computer afsluiten zonder wachtwoord.

Verder: besef je wel dat je nu een programma aan het maken bent voor functionaliteit die in zowel Windows als Linux (en Mac vrij zeker ook) al standaard met het shutdown- command mogelijk is. :)
De bedoeling is dat mensen die niet kennen van commando's en dergelijke op een gemakkelijke manier hun computer over x aantal minuten kunnen laten afsluiten.
Het komt er dus eigenlijk op neer dat ik het shutdown commando een GUI wil gaan geven.

Daarom is het ook niet aan te raden om het visoers-bestand te laten aanpassen aangezien deze n00bs er geen verstand van hebben.

Voor Windows is dit allemaal geen probleem, aangezien je daar gewoon commando's kan uitvoeren en niet telkens zo'n sudo-wachtwoord nodig hebt, maar dit zit dus anders bij Linux & Mac OS X

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 23:11
En als je programma nou zelf /etc/sudoers aanpast? Gewoon vragen om het wachtwoord, om het 'de gebruiker mogelijk te maken om de computer af te laten sluiten zonder wachtwoord'. :)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jaap-Jan schreef op zondag 02 augustus 2009 @ 17:17:
En als je programma nou zelf /etc/sudoers aanpast? Gewoon vragen om het wachtwoord, om het 'de gebruiker mogelijk te maken om de computer af te laten sluiten zonder wachtwoord'. :)
Dit kan ik idd doen.
Een andere mogelijkheid is het wachtwoord te vragen en dit dan mee te verwerken in het commando.

Mijn code ziet er dan als volgt uit:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    private void btnShutdownMouseClicked(java.awt.event.MouseEvent evt) {                                         
        // TODO add your handling code here:

        // Shutdown Computer

        String str = txtMinutes.getText();
        Boolean blnIsNumeric = Boolean.TRUE ;
        int i = 0;

        String[] strCommand = new String[2];
        strCommand[0] = "sudo shutdown - h +" + str;
        strCommand[1] = JOptionPane.showInputDialog("Please, insert your Sudo-password");


        try{
        Process p = new ProcessBuilder(strCommand).start();
        }
        catch (IOException e) {JOptionPane.showMessageDialog(mainPanel, "Error: Wrong command");
}
        // Check if input is correct

        do {     
            // If we find a non-digit character we return false.
            if (!Character.isDigit(str.charAt(i))){
            blnIsNumeric = Boolean.FALSE;
            }
            else{
                blnIsNumeric = Boolean.TRUE;
            }
        // Raise counter
        i++;
        }
            while ((blnIsNumeric == Boolean.TRUE) && (i < str.length()));
        

        if (blnIsNumeric == Boolean.FALSE){
        JOptionPane.showMessageDialog(null, "Please, insert the correct values");
        }
        else{
        Integer.parseInt(str);
        }
        
    }    


And guess what ...
Doesn't work :p

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 23:11
Ga eens stderr en stdout lezen, want volgens mij staat op regel 10 gewoon een fout in de commandline- opdracht (er hoort geen spatie tussen de streep en de 'h' te staan).

En nog wel meer rare dingen, waarom vraag je een wachtwoord via processbuilder (en niet gewoon vóórdat je dat commando gaat uitvoeren? Met andere woorden: regel 12 slaat nergens op. :)

Ooh ja, kijk eens hier voor hoe je werkt met I/O- streams (stdin, stdout, stderr) in processbuilder. Je moet het wachtwoord naar stdin schrijven. :)

[ Voor 57% gewijzigd door Jaap-Jan op 02-08-2009 17:53 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Niet om het een of het ander hoor, maar alle consumenten-OS'en met GUI hebben daarin een shutdown knop zitten. OSX, Windows, Ubuntu (onderdeel van GNOME), etc. Waarom ben je precies het wiel opnieuw aan het implementeren?

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jaap-Jan schreef op zondag 02 augustus 2009 @ 17:44:
Ga eens stderr en stdout lezen, want volgens mij staat op regel 10 gewoon een fout in de commandline- opdracht (er hoort geen spatie tussen de streep en de 'h' te staan).

En nog wel meer rare dingen, waarom vraag je een wachtwoord via processbuilder (en niet gewoon vóórdat je dat commando gaat uitvoeren? Met andere woorden: regel 12 slaat nergens op. :)

Ooh ja, kijk eens hier voor hoe je werkt met I/O- streams (stdin, stdout, stderr) in processbuilder. Je moet het wachtwoord naar stdin schrijven. :)
Ik heb de code aangepast, maar het probleem blijft bestaan.
Maar hoe lees ik de stdout en stderr uit?
Ik heb al even gegoogled, maar vond hier niets over :s

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
CyBeR schreef op zondag 02 augustus 2009 @ 17:46:
Niet om het een of het ander hoor, maar alle consumenten-OS'en met GUI hebben daarin een shutdown knop zitten. OSX, Windows, Ubuntu (onderdeel van GNOME), etc. Waarom ben je precies het wiel opnieuw aan het implementeren?
Ja, een shutdownknop wel ja, maar daarmee kan je niet zeggen: "Sluit de computer na X aantal minuten af".

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Verwijderd schreef op zondag 02 augustus 2009 @ 16:35:
Dus als ik het goed begrijp is het vrijwel onmogelijk om mijn programma te runnen in Ubuntu en OS X?
Of kan ik mijn gebruikers gewoon naar het SUDO paswoord vragen om het daarna te gebruiken?
Je kunt in Mac OS X en Linux bij het starten van een programma aangeven dat het admin rechten nodig heeft. Dan zal de gebruiker bij het starten om het password gevraagd worden en draait je programma dus als admin en kun je alles doen wat je wilt. In Windows (vanaf Vista) moet je dit trouwens ook doen.

Voor die password dialog hoef je niets te doen buiten de shortcut aanpassen of op een andere manier aangeven wat je wilt (is OS afhankelijk). Dat password krijgt jouw programma dus ook nooit te zien en dat is precies de bedoeling.

Daarna kun je gewoon een shutdown command geven zonder passwords te vragen ofzo, want je programma draait immers al onder administrator/root.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 23:11
Ik heb even een voorbeeldje gemaakt:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.io.*;

public class Test {
        public static void main(String[] args) {
                ProcessBuilder pb = new ProcessBuilder("ls");
                Process p;
                try {
                        p = pb.start();
                }
                catch (IOException ioe) {
                        System.err.println("Error while starting process");
                        return;
                }
                BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String line = null;
                try {
                        while ((line = reader.readLine()) != null) {
                                System.out.println(line);
                        }
                }
                catch (IOException ioe) {
                        System.err.println("Error while processing output");
                        return;
                }
        }
}

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jaap-Jan schreef op zondag 02 augustus 2009 @ 18:29:
Ik heb even een voorbeeldje gemaakt:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.io.*;

public class Test {
        public static void main(String[] args) {
                ProcessBuilder pb = new ProcessBuilder("ls");
                Process p;
                try {
                        p = pb.start();
                }
                catch (IOException ioe) {
                        System.err.println("Error while starting process");
                        return;
                }
                BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String line = null;
                try {
                        while ((line = reader.readLine()) != null) {
                                System.out.println(line);
                        }
                }
                catch (IOException ioe) {
                        System.err.println("Error while processing output");
                        return;
                }
        }
}
Ik heb dit even toegevoegd aan de code, en nu krijg ik dit als output:
code:
1
2
3
4
5
6
7
build
build.xml
hello
manifest.mf
nbproject
src
test
Gerco schreef op zondag 02 augustus 2009 @ 18:29:
[...]

Je kunt in Mac OS X en Linux bij het starten van een programma aangeven dat het admin rechten nodig heeft. Dan zal de gebruiker bij het starten om het password gevraagd worden en draait je programma dus als admin en kun je alles doen wat je wilt. In Windows (vanaf Vista) moet je dit trouwens ook doen.

Voor die password dialog hoef je niets te doen buiten de shortcut aanpassen of op een andere manier aangeven wat je wilt (is OS afhankelijk). Dat password krijgt jouw programma dus ook nooit te zien en dat is precies de bedoeling.

Daarna kun je gewoon een shutdown command geven zonder passwords te vragen ofzo, want je programma draait immers al onder administrator/root.
Dit ziet er inderdaad zeer veelbelovend uit, ik zoek het meteen even op.
Euhm ... hoe moet ik dit intypen in Google?

[ Voor 43% gewijzigd door Verwijderd op 02-08-2009 18:44 ]


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 23:11
Om een programma als root te draaien, start je het programma zelf op als root (of met sudo).

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jaap-Jan schreef op zondag 02 augustus 2009 @ 18:53:
Om een programma als root te draaien, start je het programma zelf op als root (of met sudo).
Ja, daar ben ik mij van bewust, maar ik kan toch niet in mijn code gaan schrijven:

code:
1
sudo ditProgramma

:p

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Verwijderd schreef op zondag 02 augustus 2009 @ 18:33:
Euhm ... hoe moet ik dit intypen in Google?
Probeer iets als dit: http://tinyurl.com/lwkfps

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmm, ik dacht dat je bedoelde dat er een Java-code was waarmee je zo om het sudo-wachtwoord kon vragen. Want nu zie ik enkel oplossingen waarbij de gebruiker zelf in zijn shell moet gaan prutsen, wat niet echt de bedoeling is ...

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Verwijderd schreef op zondag 02 augustus 2009 @ 19:23:
Hmm, ik dacht dat je bedoelde dat er een Java-code was waarmee je zo om het sudo-wachtwoord kon vragen. Want nu zie ik enkel oplossingen waarbij de gebruiker zelf in zijn shell moet gaan prutsen, wat niet echt de bedoeling is ...
Beter lezen...

Wanneer je in linux (Gnome) een shortcut naar je app maakt met als command line "gksudo jouwapp", moet de gebruiker een password invoeren. Voor KDE is het "kdesu" ipg "gksudo". Zo'n shortcut lever je natuurlijk gewoon mee. In Mac OS X weet ik niet hoe het moet, maar het zal iets soortgelijks zijn. In Windows moet je op de shortcut (.lnk file) een vinkje aanzetten "Run this program as Administrator". Die kun je in je installer ook gewoon zo aanmaken of meeleveren.

Je geeft overigens wel heel erg snel op wanneer je een klein probleempje tegenkomt en rent terug naar de helpdesk (het forum). Geen handige kwaliteit voor een aspirant programmeur.

[ Voor 5% gewijzigd door Gerco op 02-08-2009 19:28 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Neverwinterx
  • Registratie: December 2005
  • Laatst online: 12-09 10:56
(jarig!)
Het programma moet op verschillende platformen draaien, en daarom koos ik voor Java.
Een kleine opmerking hierbij. Het afsluiten van de computer is erg platform-afhankelijk en je zult dus inderdaad gebruik moeten maken van externe oproepen met exec()/ProcessBuilder. Maar je zult dus zo'n code moeten voorzien voor elk platform en dan detecteren van welk platform gebruik gemaakt wordt om de juiste code uit te voeren. Dit maakt je motivatie om voor Java te kiezen ongedaan.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gerco schreef op zondag 02 augustus 2009 @ 19:26:
[...]

Beter lezen...

Wanneer je in linux (Gnome) een shortcut naar je app maakt met als command line "gksudo jouwapp", moet de gebruiker een password invoeren. Voor KDE is het "kdesu" ipg "gksudo". Zo'n shortcut lever je natuurlijk gewoon mee. In Mac OS X weet ik niet hoe het moet, maar het zal iets soortgelijks zijn. In Windows moet je op de shortcut (.lnk file) een vinkje aanzetten "Run this program as Administrator". Die kun je in je installer ook gewoon zo aanmaken of meeleveren.

Je geeft overigens wel heel erg snel op wanneer je een klein probleempje tegenkomt en rent terug naar de helpdesk (het forum). Geen handige kwaliteit voor een aspirant programmeur.
Je hebt volkomen gelijk, dit is zo ongeveer mijn slechtste eigenschap, ik geef enorm snel op.
Maar goed, ik probeer een programmeertaal (java) van 0 af zelf te leren aangezien we op school enkel VB.Net krijgen :s
Het is logisch dat ik snel enkele problemen tegenkom waar ik nooit eerder mee geconfronteerd ben, maar nu kan ik niet naar de leraar toestappen om hulp te vragen, maar probeer ik oplossingen te zoeken door wat rond te neuzen op het wereldwijde web en dus ook mijn vragen te posten op fora.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Neverwinterx schreef op zondag 02 augustus 2009 @ 19:34:
[...]


Een kleine opmerking hierbij. Het afsluiten van de computer is erg platform-afhankelijk en je zult dus inderdaad gebruik moeten maken van externe oproepen met exec()/ProcessBuilder. Maar je zult dus zo'n code moeten voorzien voor elk platform en dan detecteren van welk platform gebruik gemaakt wordt om de juiste code uit te voeren. Dit maakt je motivatie om voor Java te kiezen ongedaan.
Ik voorzag al een selectie structuur die conroleert met welk os we te maken hebben. Op die manier kan ik toch verschillende codes uitvoeren.

Volgens mij was het zo iets:

Java:
1
String osName = system.getProperty("os.name")

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Verwijderd schreef op zondag 02 augustus 2009 @ 19:37:
Je hebt volkomen gelijk, dit is zo ongeveer mijn slechtste eigenschap, ik geef enorm snel op.
Maar goed, ik probeer een programmeertaal (java) van 0 af zelf te leren aangezien we op school enkel VB.Net krijgen :s
Wanneer je eenmaal leert hoe de principes werken is de taal waarin je die principes toepast bijna irrelevant. Ik kan me voorstellen dat je dat nu nog niet kan zien, maar dat komt met ervaring vanzelf. Het is daarom ook zeer aan te raden om meerdere programmeertalen te leren, je wordt er een beter programmeur van.
Het is logisch dat ik snel enkele problemen tegenkom waar ik nooit eerder mee geconfronteerd ben, maar nu kan ik niet naar de leraar toestappen om hulp te vragen, maar probeer ik oplossingen te zoeken door wat rond te neuzen op het wereldwijde web en dus ook mijn vragen te posten op fora.
Er is niets mis met het posten van vragen op fora, iedereen doet dat. Het is natuurlijk wel zaak om meer dan alleen het eerste resultaat op Google te lezen. En wanneer je er met de eerste pagina resultaten niet uitkomt kijk je naar de tweede (en de derde).

Na een paar paginas resultaten gaan ze meestal nergens meer over en pas je de zoektermen aan. Gebruik synoniemen of gok soms gewoon een beetje hoe iets zou kunnen heten. Dat kan je naar andere forum vragen leiden van mensen die iets soortgelijks proberen. Die geven je dan vaak weer een idee voor een andere zoekterm om te proberen.

Persoonlijk denk ik dat leren zoeken ook een erg belangrijk deel is van leren programmeren. Zoeken is echter net zo moeilijk als programmeren :) Er is zo belachelijk veel informatie beschikbaar dat het tegenwoordig een kunst is om het goede nog te vinden.

[ Voor 10% gewijzigd door Gerco op 02-08-2009 19:45 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 16:32
Verwijderd schreef op zondag 02 augustus 2009 @ 18:04:
[...]


Ik heb de code aangepast, maar het probleem blijft bestaan.
Maar hoe lees ik de stdout en stderr uit?
Ik heb al even gegoogled, maar vond hier niets over :s
Process.getInputStream(), (http://java.sun.com/j2se/...ess.html#getInputStream()).
Daarmee haal je de inputstream op van een Process. Mag jij raden hoe je de outputstream ophaalt.

offtopic:
Wow, 100 jaar niet gerefreshed

[ Voor 54% gewijzigd door Enfer op 02-08-2009 20:19 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Enfer schreef op zondag 02 augustus 2009 @ 20:18:
[...]


Process.getInputStream(), (http://java.sun.com/j2se/...ess.html#getInputStream()).
Daarmee haal je de inputstream op van een Process. Mag jij raden hoe je de outputstream ophaalt.

offtopic:
Wow, 100 jaar niet gerefreshed
Je link werkt niet, maar ik heb ondertussen wel gevonden hoe ik mijn input uitlees ...
Ik zie echter wel niets van fouten.
Wat ik terugkrijg is:

code:
1
2
3
4
5
6
7
8
test
build
build.xml
hello
manifest.mf
nbproject
src
test

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 23:11
Lees je wel wat mijn code doet? Het is een voorbeeld, geen uitgekauwd stuk code. Je moet het zelf aanpassen/ gebruiken in je eigen code, zodat je programma wat anders doet. Mijn programma doet alleen "ls", dus je krijgt de bestanden te zien die in je Netbeans- project staan, als je het daarvanuit draait.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jaap-Jan schreef op zondag 02 augustus 2009 @ 21:09:
Lees je wel wat mijn code doet? Het is een voorbeeld, geen uitgekauwd stuk code. Je moet het zelf aanpassen/ gebruiken in je eigen code, zodat je programma wat anders doet. Mijn programma doet alleen "ls", dus je krijgt de bestanden te zien die in je Netbeans- project staan, als je het daarvanuit draait.
Excuseer, ik heb net even de code aangepast, en bij het uitvoeren zie ik dat de catch wordt aangeroepen
Er wordt namelijk afgedrukt: " Error while starting process ".

Volgens mij zit mijn fout in het gebruiken van de sudo. Ik bouw mijn commando op d.m.v een array,
maar ik denk dat het daar fout gaat.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
String[] strCommand = new String[2];
        strCommand[0] = "sudo poweroff now";
        strCommand[1] = JOptionPane.showInputDialog("Please, insert your Sudo-password");


        try{
        Process p = new ProcessBuilder(strCommand).start();
        }
        catch (IOException e) {JOptionPane.showMessageDialog(mainPanel, "Error: Wrong command");


}


Dit is de code die gebruikt wordt om naar de output te kijken ( stdOut )

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 ProcessBuilder pb = new ProcessBuilder("strCommand");
        Process p;
        try {
                p = pb.start();
            }
                catch (IOException ioe) {
                        System.err.println("Error while starting process");
                        return;
                }
                BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String line = null;
                try {
                        while ((line = reader.readLine()) != null) {
                                System.out.println(line);
                        }
                }
                catch (IOException ioe) {
                        System.err.println("Error while processing output");
                        return;
                } 


En dit krijg ik terug als ik mijn programma run:

code:
1
2
3
run:
Error while starting process
BUILD SUCCESSFUL (total time: 15 seconds)

[ Voor 57% gewijzigd door Verwijderd op 02-08-2009 21:26 ]


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 23:11
Je leest nog steeds niet wat ik getypt heb. Regel 3 slaat nergens op, je moet het wachtwoord via stdin ingeven, niet op de commandline.

Simpelweg zoeken op 'java sudo processbuilder', levert al een correct resultaat op.

Wat meteen opvalt is dat het commando waarmee ProcessBuilder wordt geïnstantieerd er zo uitziet:
Java:
1
final String[] command = {"sudo", "du","-k",};
Zou dat misschien een oplossing kunnen zijn voor je probleem. ;)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Ik heb niet veel verstand van linux.. maar moet je sudo doen?

want je krijgt die melding omdat je commando niet goed is.

is het niet shutdown -h now? en volgens mij heb je daar toch geen root rechten voor nodig?

zo wel zou het dan niet moeten zijn;
sudo <root wachtwoord>
dan shutdown -h

ik zou zo iets doen

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class shutdownTest {

    public static void main(String[] args) {
        try {
            shutdown();
        } catch (RuntimeException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private static void shutdown() throws RuntimeException, IOException {
        List<String> shutdownCommand = new ArrayList<String>();
        String operatingSystem = System.getProperty("os.name");
        if ("Linux".equals(operatingSystem) || "Mac OS X".equals(operatingSystem)) {
            String rootPassword = JOptionPane.showInputDialog("Please, insert your Sudo-password");
            shutdownCommand.add("sudo");
            shutdownCommand.add(rootPassword);
            shutdownCommand.add("shutdown -h now");
        } else if (operatingSystem.contains("Windows")) { // Vista returns Windows Vista
            shutdownCommand.add("shutdown.exe -s -t 0");
        } else {
            throw new RuntimeException("Unsupported operating system.");
        }

        Process p = new ProcessBuilder(shutdownCommand).start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;

        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
    }
}


Belangrijk is dat je eerst je werkende commando hebt.. die kan je dan toevoegen aan de lijst..

Je kan ook nog een functie maken die de tijd toevoegt

Java:
1
2
3
4
5
6
shutdownCommand.add("shutdown -h");
shutdownCommand.add(getTime()); //Methode aanroep naar tijd ophalen

// ipv

shutdownCommand.add("shutdown -h now");

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Bl4ckviper schreef op zondag 02 augustus 2009 @ 22:38:
Ik heb niet veel verstand van linux.. maar moet je sudo doen?
Nee, want dat betekent dat het programma het wachtwoord van de gebruiker moet weten. Er zijn prima werkende mechanismen om dat te voorkomen (zoals het programma als root opstarten via gksudo or equivalent) waardoor dat niet nodig is en het programma gewoon "poweroff" kan uitvoeren.

Overigens is het helemaal niet nodig om het programma te laten draaien na het instellen van de tijd. Alle operating systems hebben een prima scheduler (cron of Windows Scheduler) aan boord waar je die taak in zou kunnen zetten nadat de tijd is gekozen. Scheelt ook weer gedoe met het uitvoeren van commandos.
is het niet shutdown -h now? en volgens mij heb je daar toch geen root rechten voor nodig?
Daar heb je zeker wel root rechten voor nodig, zou toch wat zijn op een shared shell hosting service als dat niet zo was :)

[ Voor 18% gewijzigd door Gerco op 03-08-2009 09:00 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 21:30

BCC

Waarom kan de gebruiker niet gewoon op de power button duwen? Volgens mij heeft dat crossplatform altijd hetzelfde effect.

[ Voor 33% gewijzigd door BCC op 03-08-2009 09:08 ]

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BCC schreef op maandag 03 augustus 2009 @ 09:07:
Waarom kan de gebruiker niet gewoon op de power button duwen? Volgens mij heeft dat crossplatform altijd hetzelfde effect.
Je snapt de bedoeling duidelijk niet. Ik wil dat de gebruiker op een eenvoudige manier ( met een GUI dus ) kan zeggen: "Sluit mijn computer na X aantal minuten af!".
Je kan dit gemakkelijk doen via de shell, maar niet iedereen weet hoe dit moet.

Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 21:30

BCC

?! Ok.. je zal wel een bepaald raar slag gebruikers hebben die dat wil? Maar de een Ubuntu installatie heeft toch gewoon een shutdown optie in het menu staan?

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BCC schreef op maandag 03 augustus 2009 @ 13:18:
?! Ok.. je zal wel een bepaald raar slag gebruikers hebben die dat wil? Maar de een Ubuntu installatie heeft toch gewoon een shutdown optie in het menu staan?
Mensen die "s avonds laat aan het downloaden zijn, maar hun computer niet de hele nacht willen laten aanstaan, kunnen zo zeggen dat hun computer dan om bijvoorbeeld 3 uur 's nachts moet afsluiten. Zo moet de pc / mac niet de hele nacht opstaan, en wordt er dus niet onnodig veel stroom verbruikt ;)

Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 21:30

BCC

energiezuinig en downloaden op je computer, dat zijn twee dingen die niet samengaan :) Maar je kan toch gewoon ook de standby/hibernate van je machine goed instellen? Dit tooltje is niet aan mij besteed ben ik bang ;)

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Genoeg download programma's waarbij dat gewoon al kan ;)

Maar het is een goede oefening voor de TS :D

Dus helpen wij hem graag.

[ Voor 42% gewijzigd door Bl4ckviper op 04-08-2009 18:24 ]

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bl4ckviper schreef op dinsdag 04 augustus 2009 @ 18:23:
Genoeg download programma's waarbij dat gewoon al kan ;)

Maar het is een goede oefening voor de TS :D

Dus helpen wij hem graag.
Ja, daar draait het hem eigenlijk allemaal om. Ik wou gewoon een leuke uitdaging om wat Java te leren.

EDIT: Ik heb trouwens net gedacht dat ik beter gewoon opnieuw begin, maar deze keer zonder GUI, maar alles vragen met InputBoxes e.d.
Ik denk dat het zo nog wat overzichterlijker is en misschien gemakkelijker om mee te beginnen.

[ Voor 24% gewijzigd door Verwijderd op 04-08-2009 21:27 . Reden: Toevoeging ]


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Verwijderd schreef op dinsdag 04 augustus 2009 @ 21:22:
[...]


Ja, daar draait het hem eigenlijk allemaal om. Ik wou gewoon een leuke uitdaging om wat Java te leren.

EDIT: Ik heb trouwens net gedacht dat ik beter gewoon opnieuw begin, maar deze keer zonder GUI, maar alles vragen met InputBoxes e.d.
Ik denk dat het zo nog wat overzichterlijker is en misschien gemakkelijker om mee te beginnen.
Als je een uitdaging wil om Java te leren, dan kan ik je aanraden om iets te nemen wat volledig binnen Java kan. Want op dit moment lijkt de uitdaging eerder te liggen bij Linux.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Remus schreef op woensdag 05 augustus 2009 @ 09:33:
[...]

Als je een uitdaging wil om Java te leren, dan kan ik je aanraden om iets te nemen wat volledig binnen Java kan. Want op dit moment lijkt de uitdaging eerder te liggen bij Linux.
Ja, ik ga ook proberen om dit te proberen op Windows ( ik denk dat dit minder moeilijk is --> geen Sudo ).
Maar nu zit ik even vast bij Linux; maar dit lossen we wel op ;)
Pagina: 1