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

Langage Java Discussion :

Utilisation d'une commande système à partir d'une application


Sujet :

Langage Java

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut Utilisation d'une commande système à partir d'une application
    Bonsoir,
    Sur un équipement qui ne possède pas d'horloge sauvegardée, je dois mettre l'heure système à jour en faisant une requête vers un serveur ntp.
    Si je récupère bien l'heure sur le serveur, le code java qui fait un appel système pour la mise àl' heure n'a aucun effet .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                            long serverTime = message.getTransmitTimeStamp().getTime();
                            System.out.println("Time long  (millisecondes) = "+ serverTime);
                            long temps = serverTime/1000; // conversion en secondes pour la commande système
                            String[] cmd = {"su","mypasswd","date","--set=@'" + temps + "'"};
                            Runtime runtime = Runtime.getRuntime();
                            runtime.exec(cmd);
                            System.out.println("serveur ntp secondes = " + temps);
                            // heure serveur ntp
                            Date date = new Date(serverTime);
                            ntpDateTime = sdf.format(date);
                            System.out.println("Time from NTP  = "+ ntpDateTime);
                            // heure système
                            date = new Date();
                            System.out.println("Heure système  = "+ sdf.format(date));
    Par contre directement sur le système Linux, la commande fonctionne :
    Donc l'éxécution et la mise à l'heure manuelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    hubert@ubuntu:~$ /opt/jdk1.7.0_60/bin/java -jar horloge.jar 
    Time long  (millisecondes) = 1484086394888
    serveur ntp secondes = 1484086394
    Time from NTP  = 10/01/2017 23:13:14
    Heure système  = 08/01/2017 20:49:42
    hubert@ubuntu:~$ su
    Password: 
    root@ubuntu:/home/hubert# date --set='@1484086394'
    Tue Jan 10 23:13:14 CET 2017
    root@ubuntu:/home/hubert# date
    Tue Jan 10 23:13:19 CET 2017
    Le problème doit sans doute se trouver à l'interface avec le système, mais je ne sais trop à quel endroit.
    Les suggestions sont les bienvenues.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ton programme clairement essaie d'exécuter en tant qu'utilisateur 'mypasswd', la commande date, ce qui ne risque pas de marcher. Le mot de passe, tu dois le fournir dans le stdin de l'application su, via le Process.getOutputStream()
    Donc la première chose serait de gérer tes flux et de lire la doc de la commande su

    mais plus basiquement c'est se toucher la nouille pour pas grand chose:

    1) tu pourrais exécuter la commande java directement en root et éviter d'avoir à y stocker ton mot de passe root
    2) tu pourrais alternativement installer un client ntp sur ton serveur unix plutot que d'en recoder un en java.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo apt-get install ntp

  3. #3
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Bonjour,
    Quelques éclaicissements pour comprendre le pourquoi du comment de la démarche /
    Il s'agit d'une application web/Tomcat située en "pleine nature" accessible avec un navigateur et une connexion ssh.
    N'ayant pas d'horloge sauvegardée, pour les logs et certaines opérations d'écriture de fichiers, j'ai besoin d'un timestamp.

    Le pcDuino/V2 précédemment utilisé avait une mise à l'heure automatique lors du démarrage du système/Ubuntu. La version 3B actuellement utilisée n'a plus cette fonctionnalité : d'ou l'installation du paquet ntpdate qui ne fonctionne pas suite à un problème entre openssl et libcrypto. Après avoir passé une journée à essayer de résoudre ce problème, j'ai laissé tomber (si je suis un utilisateur permanent de Linux, je ne pratique sudo et apt-get que sur ce projet).

    D'ou mon intention d'effectuer la mise à l'heure du système dans une petite application java avant l'activation des servlets dans Tomcat.
    Celà pourrait être fait manuellement par ssh, mais le système ayant un WatchDog, il est nécessaire d'avoir une procédure automatique.
    D'ou mon inspiration à partir de ce tuto http://ydisanto.developpez.com/tutor.../runtime-exec/
    Citation Envoyé par tchize_
    Ton programme clairement essaie d'exécuter en tant qu'utilisateur 'mypasswd', la commande date, ce qui ne risque pas de marcher. Le mot de passe, tu dois le fournir dans le stdin de l'application su, via le Process.getOutputStream()
    Ayant du mal à savoir ou j'habite avec sudo, j'ai définit un password(mypasswd) pour le compte root auquel j'accède avec su

    Citation Envoyé par tchize_
    tu pourrais exécuter la commande java directement en root et éviter d'avoir à y stocker ton mot de passe root
    Je pourrais faire un script shell qui lance automatiquement cette petite appli java lors d'un reboot, mais le mot de passe il faut qu'il soit en dur quelque part? (à moins que l'appli exécutée en root, la fonction date du système n'en n'ai pas besoin).

    Mais je viens de faire un essai, éxécutée en tant que root, l'application n'effectue pas de mise à l'heure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                            long temps = serverTime/1000; // conversion en secondes pour la commande système
                            Runtime runtime = Runtime.getRuntime();
                            String[] cmde = {"date","--set=@'" + temps + "'"};
                            runtime.exec(cmde);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    root@ubuntu:/home/hubert# /opt/jdk1.7.0_60/bin/java -jar horloge.jar 
    Time long  (millisecondes) = 1484131528180
    serveur ntp secondes = 1484131528
    Time from NTP  = 11/01/2017 11:45:28
    Heure système  = 01/01/2010 02:14:25
    root@ubuntu:/home/hubert# date
    Fri Jan  1 02:14:33 CET 2010

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par hapalemur Voir le message
    Je pourrais faire un script shell qui lance automatiquement cette petite appli java lors d'un reboot, mais le mot de passe il faut qu'il soit en dur quelque part? (à moins que l'appli exécutée en root, la fonction date du système n'en n'ai pas besoin).
    Si tu fais un script shell au démarrage, il tournera déjà en root, pas besoin de passer root.
    Citation Envoyé par hapalemur Voir le message
    Mais je viens de faire un essai, éxécutée en tant que root, l'application n'effectue pas de mise à l'heure :
    Il faut que tu traite correctement les entrées / sorties de ton application, sinon tu ne verra jamais les messages d'erreur. Le plus simple si tu veux juste les avoir à l'écran c'est d'utiliser ProcessBuilder avec inheritIO()

  5. #5
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Bsr,
    En mode console, la commande suivante effectue une mise à l'heure du système :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    root@ubuntu:/home/hubert# date --set=@'1484334000'
    Fri Jan 13 20:00:00 CET 2017
    Si je transpose en java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProcessBuilder pb = new ProcessBuilder("date", "--set=@'" + temps + "'");
    à l'éxécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    root@ubuntu:/home/hubert# /opt/jdk1.7.0_60/bin/java -jar horloge.jar
    Commande set Date avec methode inheritIO pour les flux
    date: invalid date `@\'1484337568\''
    Time long  (millisecondes) = 1484337568806
    serveur ntp secondes = 1484337568
    Time from NTP  = 13/01/2017 20:59:28
    Heure systeme  = 13/01/2017 20:25:40
    L'erreur vient des simples quotes qui doivent être mal interprétées ; donc la solution :
    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
    ......
    import org.apache.commons.net.ntp.*;
    .....
            timeInfo = timeClient.getTime(inetAddress);
            NtpV3Packet message = timeInfo.getMessage();
            long serverTime = message.getTransmitTimeStamp().getTime();
            long temps = serverTime/1000; // conversion en secondes pour la commande système
            ProcessBuilder pb = new ProcessBuilder("date", "--set=@" + temps);
            try {                        
                 pb.inheritIO();
                 System.out.println("Commande set Date avec methode inheritIO pour les flux");
                 Process process = pb.start();
                 process.waitFor();
            } catch (InterruptedException ex){
                 System.out.println("interrupted except : " + ex);
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    root@ubuntu:/home/hubert# /opt/jdk1.7.0_60/bin/java -jar horloge.jar
    Commande set Date avec methode inheritIO pour les flux
    Fri Jan 13 21:10:43 CET 2017
    Time long  (millisecondes) = 1484338243179
    serveur ntp secondes = 1484338243
    Time from NTP  = 13/01/2017 21:10:43
    Heure systeme  = 13/01/2017 21:10:43
    Il ne me reste plus qu'à créer un script qui au boot, effectue un appel à ce petit programme/

    Merci à tchize_ pour l'indication de la classe ProcessBuilder et l'utilisation des flux.

  6. #6
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Bjr,
    Si le petit script créé fonctionne bien en ligne de commande, il n'effectue pas de mise à l'heure quand je l'intègre au système en tant que service : la discussion se poursuit ici :
    http://www.developpez.net/forums/d16...e/#post8923818

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/12/2015, 08h15
  2. Réponses: 4
    Dernier message: 10/10/2010, 11h46
  3. Réponses: 2
    Dernier message: 05/03/2010, 14h15
  4. Réponses: 1
    Dernier message: 11/08/2008, 12h38
  5. exécuter une commande système à partir de sqlplus?
    Par c_moi_c_moi dans le forum Oracle
    Réponses: 24
    Dernier message: 08/11/2005, 15h11

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