IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

[Runtime] Problème pour exécuter un chmod en java


Sujet :

API standards et tierces Java

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [Runtime] Problème pour exécuter un chmod en java
    Bonjour,

    Je vous expose mon problème: j'ai besoin de modifier les droits pour permettre d'exécuter des fichiers que je viens de copier sur un serveur (Aix, ou HpUx, ou Sun ou Linux ou windows).

    Important: mes clients peuvent être en jdk 1.4, jdk 1.5 ou jdk 1.6.

    J'ai tenté d'utiliser la fonction exec mais les droits ne se positionnent pas. Je ne reçois cependant aucune erreur. Je viens de tester sur un Aix53.

    Ci-dessous le code que j'utilise. Est-ce que quelqu'un a une idée de ce qui se passe?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    private void droitExecution()
    {
            if (this.sOsA.startsWith("windows")) return;
    	String sCmd[] = {"chmod","-R","775","*"};
    	System.out.println("Traitement des droits d'execution ...(" + sCmd[0] + ")");
    	try
    	{
    	    System.out.println("this.fRootBatchA = "+this.fRootBatchA);
    	    Runtime.getRuntime().exec(sCmd,null,this.fRootBatchA);			
    	}
    	catch (Exception e)
    	{
    	   System.out.println("Impossible de gerer les droits d'execution sur les fichiers de commandes (" + sCmd[0] + ")");
    	   System.out.println("Passer la commande " + sCmd[0]);
    	}
    }

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Essaie de lire les flux d'entrée et de l'erreur standard de l'objet Process retourné par Runtime.exec().
    Ne pas lire les flux de sortie et d'erreur d'un processus externe peut entrainer un bloquage de celui-ci. Et même si ce n'est pas le cas, tu pourras ainsi lire l'éventuel message d'erreur que chmod peut retourner.

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai testé avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    	private void droitExecution()
    	{
    		if (this.sOsA.startsWith("windows")) return;
    		String sCmd[] = {"chmod","-R","775","*"};
    		System.out.println("Traitement des droits d execution ...(" + sCmd[0] + ")");
    		Process p;
    		try
    		{
    			System.out.println("this.fRootBatchA = "+this.fRootBatchA);
    			p = Runtime.getRuntime().exec(sCmd,null,this.fRootBatchA);			
    			p.getOutputStream().flush();
    			String line;
    			BufferedInputStream is;
    			if (p.getInputStream() != null)
    				is = new BufferedInputStream(p.getInputStream());
    			else
    				is = new BufferedInputStream(p.getErrorStream());
    			BufferedReader out = new BufferedReader(new InputStreamReader(is));
    			System.out.println("parcours des lignes");
    			while ((line = out.readLine()) != null)
    			{
    				System.out.println(line);
    			}
    			out.close();
    			System.out.println("sortie ok");
    		}
    		catch (Exception e)
    		{
    			System.out.println("Impossible de gerer les droits d'execution sur les fichiers de commandes (" + sCmd[0] + ")");
    			System.out.println("Passer la commande " + sCmd[0]);
    		}
    	}
    Le résultat est toujours aussi peu explicite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Traitement des droits d execution ...(chmod)
    this.fRootBatchA = /progs
    parcours des lignes
    sortie ok

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il y a plusieurs problèmes qui se mèlent :
    • Lorsque tu lances un programme externe il faut traiter tous ses flux, c'est à dire son stdin, stdout et stderr. Ce dernier permet notamment d'avoir une idée du problème...
    • Ces flux doivent être traiter en parallèle, sous peine d'interblocage. Dans le pire des cas si vraiment tu veux les ignorer il faut les fermer explicitement !
    • exec() lance une application avec des paramètres tels quels, et est très différents d'une ligne de commande qui peut contenir des meta-caractères interprété par le shell : ici il n'y a pas de shell donc "*" est passé tel quel au programme, qui ne le comprend pas !!!


    Bref tu dois soit utiliser le shell système, soit spécifier un à un tes paramètres... le tout sans oublier une gestion propre des flux...

    Plus d'info :


    a++

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour toutes ces infos. Les tutoriaux sont très utiles. Y a plus qu'à !

    Je vais faire de nouveaux essais et je vous tiens au courant.

    Merci encore

  6. #6
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut solution
    Grace aux tutoriaux j'ai trouvé une solution qui fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String sCmd[] = {"/bin/sh", "-c", "chmod -R 775 *"};
     
    Process p = Runtime.getRuntime().exec(sCmd,null,this.fRootBatchA);
    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/07/2008, 16h15
  2. quelques problèmes pour exécuter mes codes
    Par djimangue dans le forum Langage
    Réponses: 6
    Dernier message: 18/12/2007, 01h00
  3. Problème pour exécuter un script CGI
    Par urban45 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 19/07/2007, 08h13
  4. Problème pour exécuter un script Perl
    Par jungle360 dans le forum Langage
    Réponses: 5
    Dernier message: 23/04/2006, 14h37
  5. Problème pour exécuter une chaîne de caractères
    Par Pongo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/09/2005, 10h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo