Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/02/2015, à 23:21

YOSS

Commande Ubuntu dans un code JAVA

Bonjour,

Je dois lance une commande ubuntu (application), a partir d'un code JAVA.

J'ai essaye, avec le code suivant:

class Test
{
	String command="./monapplication";
	Runtime runtime = Runtime.getRuntime();
	Process process = null;
	public static void main(String args[])
{
		try
		{
			process = runtime.exec(command);
		} catch(Exception err) {;}
}
}

J'ai recu les erreurs suivantes:

Test.java:18: non-static variable process cannot be referenced from a static context
			process = runtime.exec(command);
			^
Test.java:18: non-static variable command cannot be referenced from a static context
			process = runtime.exec(command);
			                       ^
Test.java:18: non-static variable runtime cannot be referenced from a static context
			process = runtime.exec(command);
			          ^
3 errors

J'ai compris les messages d'erreurs. Mais je ne sais pas comment je vais les resoudre.
Avez vous des idees pour corriger mon code ?
Merci d'avance pour vos reponses.

Dernière modification par YOSS (Le 19/03/2015, à 09:09)

Hors ligne

#2 Le 20/02/2015, à 00:03

pires57

Re : Commande Ubuntu dans un code JAVA

public static String command="./monapplication";

Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn

Hors ligne

#3 Le 20/02/2015, à 00:05

claudius01

Re : Commande Ubuntu dans un code JAVA

Normal, tu es dans un context static à cause de l'appel depuis le main.
Je te propose donc le même programme avec command, runtime et process déclarés static qui est sans erreur dans Eclipse (il faut tout passer en static ;-)

public class Test {

	static String command = "./monapplication";     // Add static
	static Runtime runtime = Runtime.getRuntime();	// Add static
	static Process process = null;			// Add static

	public static void main(String args[]) {
		try {
			process = runtime.exec(command);
		} catch (Exception err) {
			System.out.println(err.getMessage());
		}
	}
}

Hors ligne

#4 Le 20/02/2015, à 01:49

YOSS

Re : Commande Ubuntu dans un code JAVA

Merci pour vos reponse!
J'ai ajoute, dans le bloc try:

System.out.println("aaaaaa");

Donc, j'obtient l'affichage de "aaaaaa". Mais la commande:

process = runtime.exec("commande");

ne s'execute pas. sad

J'ai trouve ce lien: Exécuter un programme à partir d'un dossier avec Java sous Linux (Ubuntu) .
Il me semble interessant.

Hors ligne

#5 Le 20/02/2015, à 11:00

claudius01

Re : Commande Ubuntu dans un code JAVA

Certes, mais très incomplet ;-)
Regarde plutôt dans notre cher forum: lancer Treetagger depuis un programme java

Hors ligne

#6 Le 20/02/2015, à 23:10

pingouinux

Re : Commande Ubuntu dans un code JAVA

Bonsoir YOSS,
J'ai bien reçu ton message, mais ne connais pas Java. Le lien donné par claudius01 en #5 me paraît explicite.

Hors ligne

#7 Le 21/02/2015, à 05:36

YOSS

Re : Commande Ubuntu dans un code JAVA

Bonjour,

Merci pour vos reponses!
Je suis debutant en JAVA.
claudius01, j'ai execute ton code en eliminant les parties qui ne m'interessent pas (je travail sur Ubuntu), mais rien ne se passe aussi. Voici le code:

public class Test {
public static void main(String[] args) {
	try {
            
        	//args[] = null;
                String locArgs[] = {"bash", "-c", "clear" };
                args = locArgs;
            	Runtime runtime = Runtime.getRuntime();
	 	final Process p = runtime.exec(args);
		
          } catch (Exception e) {;}
}
}

Dernière modification par YOSS (Le 21/02/2015, à 06:46)

Hors ligne

#8 Le 21/02/2015, à 15:16

claudius01

Re : Commande Ubuntu dans un code JAVA

YOSS: Débutant en Java, tu n'as pas choisi un sujet simple mais bon, c'est tout à ton honneur...
Ton programme est correct et s'il ne se passe rien, c'est normal car la commande clear ... ne fait rien ... du moins, vu du monde Java.
En effet, celle-ci ne fait qu'effacer l'écran, je te propose donc une autre commande dont l'exécution depuis une classe Java donne un résultat "visible" qui en l’occurrence est d'écrire dans un fichier le nom du répertoire où s'exécute ce programme Java.

Ci-après, les sorties écran qui se lisent comme un poème et dont les commandes en ligne peuvent être exécutées telles quelles ;-):

[/home/claudius/Tmp/TestJava]$ uname -a
Linux claudius-VirtualBox 3.5.0-30-generic #51~precise1-Ubuntu SMP Wed May 15 08:48:19 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

[/home/claudius/Tmp/TestJava]$ pwd
/home/claudius/Tmp/TestJava

[/home/claudius/Tmp/TestJava]$ ls -l
total 4
-rw-rw-r-- 1 claudius claudius 454 févr. 21 13:02 Test.java

[/home/claudius/Tmp/TestJava]$ cat Test.java
public class Test {

   public static void main(String[] args) {
      try {
         System.out.println("Starting...");
         // args[] = null;
         String locArgs[] = { "bash", "-c", "pwd > Ou_sommes_nous" };
         Runtime runtime = Runtime.getRuntime();
         final Process p = runtime.exec(locArgs);      
         System.out.println("Leaving.");
      } catch (Exception e) {
         System.out.println(e.getMessage());
      }
   }
}

[/home/claudius/Tmp/TestJava]$ javac Test.java

[/home/claudius/Tmp/TestJava]$ ls -l
total 8
-rw-rw-r-- 1 claudius claudius 814 févr. 21 13:02 Test.class
-rw-rw-r-- 1 claudius claudius 454 févr. 21 13:02 Test.java

[/home/claudius/Tmp/TestJava]$ java Test
Starting...
Leaving.

[/home/claudius/Tmp/TestJava]$ ls -l
total 12
-rw-rw-r-- 1 claudius claudius  28 févr. 21 13:03 Ou_sommes_nous
-rw-rw-r-- 1 claudius claudius 814 févr. 21 13:02 Test.class
-rw-rw-r-- 1 claudius claudius 454 févr. 21 13:02 Test.java

[/home/claudius/Tmp/TestJava]$ cat Ou_sommes_nous
/home/claudius/Tmp/TestJava

[/home/claudius/Tmp/TestJava]$ 

En espérant t'avoir aidé et bienvenu dans ce monde Java qui est l'un des langages les plus utilisés dans le monde professionnel
(cf. Redmonk : Swift progresse de façon spectaculaire, Go également, JavaScript et Java au coude à coude pour la première place)

NB: Deux petites remarques:
- Toujours pendre l'habitude de donner de l'information dans un catch (comme ici un simple "System.out.println(e.getMessage());")
- Si tu continues en Java, choisis un IDE comme Eclipse ou Geany qui, après un investissement en temps, te facilitera grandement les choses.

Dernière modification par claudius01 (Le 21/02/2015, à 16:26)

Hors ligne

#9 Le 21/02/2015, à 17:19

YOSS

Re : Commande Ubuntu dans un code JAVA

Merci infiniment claudius01, pingouinux, et tous les membres de cet excellent forum!!
Mon probleme est resolu smile

Hors ligne

#10 Le 21/02/2015, à 17:49

claudius01

Re : Commande Ubuntu dans un code JAVA

Merci à toi YOSS, content de t'avoir aidé...
Une petite règle sur ce forum, pense à éditer ton premier message afin d'y adjoindre le texte "Résolu" dans son objet.
Merci par avance, A+


Cdlt, A+
--
Claudius

Dernière modification par claudius01 (Le 21/02/2015, à 17:50)

Hors ligne

#11 Le 19/03/2015, à 09:08

YOSS

Re : Commande Ubuntu dans un code JAVA

Bonjour tout le monde,

J'ai un petit probleme.
Je dois lancer la commande "tcpdump" dans mon code JAVA.

Le probleme est que JAVA est trop rapide. Donc, lorsque je precise a tcpdump de capturer du trafic pendant quelques secondes ceci ne fonctionne pas. Et il passe directement a l'instruction suivante.
voici le code:

class Tcpdump
{ 	public static void main(String[] args) {
	try {
		
                String locArgs1[] = {bash", "-c", "tcpdump -w -s 10 examplefile.pcap"};
                Runtime runtime1 = Runtime.getRuntime();
	   	final Process p1 = runtime1.exec(locArgs1); 
                Thread.sleep(15000);
         	System.out.println("Starting new instruction..");

Le code java doit attendre (pause) pendant que le processus tcpdump tourne et ensuite il doit reprendre.
J'ai utilise

Thread.sleep(15000);

mais je n'obtient pas de resultat.
Avez vous une idee ?
Merci beaucoup d'avance!

Hors ligne

#12 Le 19/03/2015, à 11:35

claudius01

Re : Commande Ubuntu dans un code JAVA

YOSS a écrit :

... Le probleme est que JAVA est trop rapide.

Merci pour lui ...
Mais non, c'est que ledit programme tcpdump est exécuté en parallèle dans un thread de la JVM pendant que le code de la classe Tcpdump continue son petit bonhomme de chemin.

A la place de Thread.sleep(15000), il serait plus propre et même fortement conseillé d'utiliser la méthode waitFor() sur l'objet Process p1 comme expliqué dans Executing Operating System Commands From Java.

YOSS a écrit :

... mais je n'obtiens pas de résultat.

Peux-tu être plus précis. Merci par avance

Hors ligne

#13 Le 19/03/2015, à 15:27

YOSS

Re : Commande Ubuntu dans un code JAVA

Merci beaucoup claudis pour ta reponse!

Claudius01 a écrit :

Merci pour lui ...

Oui je sais que c'est un objectif... big_smile hmm

Claudius a écrit :

Peux-tu être plus précis. Merci par avance

Le fichier pcap generer par tcpdump doit etre utilise par l'instruction suivante dans la meme classe. Donc vu que JAVA est trop rapide wink l'instruction ne trouve pas le fichier pcap (meme avec un Thread.sleep). Merci!

Hors ligne

#14 Le 19/03/2015, à 15:53

claudius01

Re : Commande Ubuntu dans un code JAVA

J'imagine que tu as vérifié que le fichier pcap généré par tcpdump existe bien.
Donc vu que JAVA est trop rapide n'est pas synchronisé dans la version qui utilise Thread.sleep(15000), je t'invite à utiliser la méthode waitFor() et de tracer juste après le code exit retourné par tcpdump au moyen de exitValue() (cf. Class Process).
A suivre...

Dernière modification par claudius01 (Le 19/03/2015, à 15:54)

Hors ligne

#15 Le 21/03/2015, à 07:12

YOSS

Re : Commande Ubuntu dans un code JAVA

Bonjour,

@claudius01: Oui le fichier tcpdump existe bien. Voici le code pour uniquement tcpdump:

class tcpdump
{ 	public static void main(String[] args) {
	try {
            	System.out.println("Starting...");
        		
                String locArgs1[] = {"bash", "-c", "tcpdump -i eth0 -s 10 -w test.pcap"};
		        
                Runtime runtime1 = Runtime.getRuntime();
		
         	final Process p1 = runtime1.exec(locArgs1); 

		p1.waitFor();     
         	 }
 
	catch (Exception e) {
		System.out.println(e.getMessage());
	    }
	}
}

En fait le code permet de creer le fichier et capture de paquets, mais il se bloque. Il n'y a pas un exit!!!

Hors ligne

#16 Le 22/03/2015, à 00:02

claudius01

Re : Commande Ubuntu dans un code JAVA

Bonsoir,

Tu n'as pas choisi une commande "facile"...
Il se trouve que "tcpdump" se termine sur des critères bien précis...
Je te propose la commande suivante qui "tue" tcpdump après 15 secondes

$ date; echo 'password' | sudo -S tcpdump -i eth1 -w test.pcap & sleep 15 && sudo pkill -HUP -f tcpdump; date

qui donne bien

Sat Mar 21 22:52:49 CET 2015
[3] 10251
[sudo] password for XXXX:
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
34 packets captured
34 packets received by filter
0 packets dropped by kernel
Sat Mar 21 22:53:04 CET 2015

avec un fichier "test.pcap" créé

$ ls -l test.pcap
-rw-r--r-- 1 root root 2732 Mar 21 22:53 test.pcap

Si ok, insérer cette commande dans le programme Java comme suit:

String locArgs1[] = {"bash", "-c", "date; echo 'password' | sudo -S tcpdump -i eth1 -w test.pcap & sleep 15 && sudo pkill -HUP -f tcpdump; date"};

A suivre...

Hors ligne

#17 Le 22/03/2015, à 16:27

YOSS

Re : Commande Ubuntu dans un code JAVA

Bonjour,

Merci beaucoup Claudius pour ton suivi..

J'ai suivi cette exemple, creation de thread (execution en parallele des deux parties de mon code):

java-Threads-ImplementingRunnable

J'ai supprime la commande waitfor(), malhereusement, toujours il y a le meme probleme de blockage.

Salutations!

Hors ligne