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

Java Discussion :

Extinction d'une machine sur le LAN depuis Java


Sujet :

Java

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut Extinction d'une machine sur le LAN depuis Java
    Bonjour à tous j'aimerais à partir du code java un script qui permet d’éteindre une machine Linux connaissant son adresse IP dans le réseau
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Mouais... comme ça ça va pas être possible... si on pouvait éteindre une machine du réseau sans se logger dessus t'imagines un peu la cata...

    par contre, en ssh, un fois loggé root, on peut lancer "shutdown -h now"

    mais il faut passer par une lib (p.ex. http://www.jcraft.com/jsch/), et aussi connaître le pass root ou avoir un compte root-like sur la machine ciblée
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Bonjour j'ai téléchargé la bibliothèque et j'ai obtenu le code suivant:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    /* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
    /**
    * This program enables you to connect to sshd server and get the shell prompt.
    * $ CLASSPATH=.:../build javac Shell.java
    * $ CLASSPATH=.:../build java Shell
    * You will be asked username, hostname and passwd.
    * If everything works fine, you will get the shell prompt. Output may
    * be ugly because of lacks of terminal-emulation, but you can issue commands.
    *
    */
    import com.jcraft.jsch.*;
    import javax.swing.*;
     
    	public class Shell{
    		public static void main(String[] arg){
    			try{
    				JSch jsch=new JSch();
     
    				//jsch.setKnownHosts("/home/foo/.ssh/known_hosts");
     
    				String host=null;
    				if(arg.length>0){
    					host=arg[0];
    				}
    				else{
    					host=JOptionPane.showInputDialog("Enter username@hostname",
    							System.getProperty("user.name")+
    							"@localhost");
    				}
    				String user=host.substring(0, host.indexOf('@'));
    				host=host.substring(host.indexOf('@')+1);
    				Session session=jsch.getSession(user, host, 22);
    				String passwd = JOptionPane.showInputDialog("Enter password");
    				session.setPassword(passwd);
    				UserInfo ui = new MyUserInfo(){
    					public void showMessage(String message){
    						JOptionPane.showMessageDialog(null, message);
    					}
    					public boolean promptYesNo(String message){
    						Object[] options={ "yes", "no" };
    						int foo=JOptionPane.showOptionDialog(null,
    								message,
    								"Warning",
    								JOptionPane.DEFAULT_OPTION,
    								JOptionPane.WARNING_MESSAGE,
    								null, options, options[0]);
    						return foo==0;
    					}					
    					// If password is not given before the invocation of Session#connect(),
    					// implement also following methods,
    					// * UserInfo#getPassword(),
    					// * UserInfo#promptPassword(String message) and
    					// * UIKeyboardInteractive#promptKeyboardInteractive()
    				};
    				session.setUserInfo(ui);			
    				// It must not be recommended, but if you want to skip host-key check,
    				// invoke following,
    				// session.setConfig("StrictHostKeyChecking", "no");				
    				//session.connect();
    				session.connect(30000); // making a connection with timeout.				
    				Channel channel=session.openChannel("shell");
    				// Enable agent-forwarding.
    				//((ChannelShell)channel).setAgentForwarding(true); 
    				channel.setInputStream(System.in);
    				/*
    				// a hack for MS-DOS prompt on Windows.
    				channel.setInputStream(new FilterInputStream(System.in){
    				public int read(byte[] b, int off, int len)throws IOException{
    				return in.read(b, off, (len>1024?1024:len));
    				}
    				});	*/ 
    				channel.setOutputStream(System.out); 
    				/*
    				// Choose the pty-type "vt102".
    				((ChannelShell)channel).setPtyType("vt102");
    				 */ 
    				/*
    				// Set environment variable "LANG" as "ja_JP.eucJP".
    				((ChannelShell)channel).setEnv("LANG", "ja_JP.eucJP");
    				 */ 
    				//channel.connect();
    				channel.connect(3*1000);
    			}
    			catch(Exception e){
    			System.out.println(e);
    			}
    		}
     
    		public static abstract class MyUserInfo
    		implements UserInfo, UIKeyboardInteractive{
    			public String getPassword(){ return null; }
    			public boolean promptYesNo(String str){ return false; }
    			public String getPassphrase(){ return null; }
    			public boolean promptPassphrase(String message){ return false; }
    			public boolean promptPassword(String message){ return false; }
    			public void showMessage(String message){ }
    			public String[] promptKeyboardInteractive(String destination,
    					String name,
    					String instruction,
    					String[] prompt,
    					boolean[] echo){
    				return null;
    			}
    		} 
    }
    Maintenant je ne comprend pas pourquoi on retourne null sur les méthodes prévues pour les paramètres de la machine et je ne sais toujours pas comment exécuter une commande?
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    hum hum... au vue de cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    channel.setInputStream(System.in);
    tu dois pouvoir la saisir dans la console, directement
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par Pill_S Voir le message
    hum hum... au vue de cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    channel.setInputStream(System.in);
    tu dois pouvoir la saisir dans la console, directement
    J'aimerais passer en paramètre la commande et je ne sais pas comment renseigner l'adresse IP, le login et le mot de passe?
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  6. #6
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    http://www.jcraft.com/jsch/examples/Sudo.java.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Channel channel=session.openChannel("exec");
    
    // man sudo
    // -S The -S (stdin) option causes sudo to read the password from the
    // standard input instead of the terminal device.
    // -p The -p (prompt) option allows you to override the default
    // password prompt and use a custom one.
    ((ChannelExec)channel).setCommand("sudo -S -p '' "+command);
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Merci j'ai testé le code mais j'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.jcraft.jsch.JSchException: java.net.ConnectException: Connection refused: connect
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  8. #8
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Es-tu sûr que le deamon ssh est lancé sur le poste à éteindre? Que l'ip est la bonne? Qu'il n'y a pas un firewall qui bloque ssh?
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  9. #9
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par Pill_S Voir le message
    Es-tu sûr que le deamon ssh est lancé sur le poste à éteindre? Que l'ip est la bonne? Qu'il n'y a pas un firewall qui bloque ssh?
    Je peux dire avec certitude que l'ip est bonne pour savoir si le demon est lancé je ne sais pas. est-ce que ça ne se lance pas automatiquement? sinon comment faire? et pour le firewall si c'est le cas comment contourner?
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  10. #10
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Problème de débutant je n’avais pas installer le serveur ssh sur le poste serveur maintenant j'ai testé la classe que vous m'avez donné elle marche bien mais j'aimerais avoir juste une classe qui se connecte au serveur et l’éteint je n'arrive pas à modifier cette classe parce qu'elle est un peu touffu et incompréhensible pour moi
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  11. #11
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Après des recherches j'ai trouvé cette classe:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    package utilisateur;	
    import java.io.InputStream; 
    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;
     
    public class SSHCommandExecutor {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            String host="IP";
            String user="User_Name";
            String password="Password";
            String command1=" sh /bin/eteindre.sh";
            try{
     
                java.util.Properties config = new java.util.Properties();
                config.put("StrictHostKeyChecking", "no");
                JSch jsch = new JSch();
                Session session=jsch.getSession(user, host, 22);
                session.setPassword(password);
                session.setConfig(config);
                session.connect();
                System.out.println("Connected");
     
                Channel channel=session.openChannel("exec");
                ((ChannelExec)channel).setCommand(command1);
                channel.setInputStream(null);
                ((ChannelExec)channel).setErrStream(System.err);
     
                InputStream in=channel.getInputStream();
                channel.connect();
                byte[] tmp=new byte[1024];
                while(true){
                  while(in.available()>0){
                    int i=in.read(tmp, 0, 1024);
                    if(i<0)break;
                    System.out.print(new String(tmp, 0, i));
                  }
                  if(channel.isClosed()){
                    System.out.println("exit-status: "+channel.getExitStatus());
                    break;
                  }
                  try{Thread.sleep(1000);}catch(Exception ee){}
                }
                channel.disconnect();
                session.disconnect();
                System.out.println("DONE");
            }catch(Exception e){
                e.printStackTrace();
            }
     
        }
    }
    le script eteindre.sh possède le code suivant:
    j'ai modifier le fichier sudoers et il m'affiche toujours le message suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Connected
    sudo: no tty present and no askpass program specified
    exit-status: 1
    DONE
    Dans le fichier sudoers j'ia ajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    user_name ALL = NOPASSWD /sbin/init
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  12. #12
    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
    alors, faire un init 0 pour un shutdown, c'est un peu comme tirer la prise du pc pour le redémarrer. Ca marche, mais ce n'est pas commce ça qu'on est censé faire. Il y a une commande shutdown sous linux, utilise là.

    Ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    user_name ALL = NOPASSWD /sbin/init
    Toi t'as pas peur, la sécurité ça a pas l'air ton problème. Tu viens de donner le droit à n'importe quel utilisateur d'arrêter la machine. Ceci inclu par exemple les script php si t'as un serveur web. Youpie... Soit un peu plus restrictif.

    Enfin, sudo ne marchera pas si il n'y a pas de console pour entrer le mot de passe.

    Il y a un exemple spécifique de sudo avec jsch ici:

    http://www.jcraft.com/jsch/examples/Sudo.java.html

  13. #13
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Oui merci j'ai vu ce lien et j'arrive pas à entrer les paramètres sans passer par les boites de dialogues car j'aimerais lancer la commandes et que tout se passe sans la réaction de l'utilisateur
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  14. #14
    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
    ben au lieu d'afficher une boite de dialogue, tu récupère l'information ailleurs (hardcodée dans le code, dans un fichier de config, ...) tu es libre de faire ce que tu veux hein. Tout ce que t'as à faire, c'est uen fois que tu as la string avec le mot de passe, tu l'envoie au serveur, comme le fait l'exemple.

  15. #15
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    ok j'ai suivi vos conseils ça marche bien
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

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

Discussions similaires

  1. Lister les processus d'une machine sur un réseau local
    Par Grosbenji dans le forum Windows
    Réponses: 2
    Dernier message: 29/11/2007, 17h59
  2. executer une commande sur un serveur depuis une page web
    Par nico33410 dans le forum Général Conception Web
    Réponses: 12
    Dernier message: 21/04/2007, 19h02
  3. Modifier l'heure et la date d'une machine sur le réseau -VB6
    Par GEGER dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 25/11/2005, 19h41
  4. Précense d'une machine sur le réseau
    Par ArkAng3 dans le forum MFC
    Réponses: 11
    Dernier message: 09/05/2005, 10h07
  5. probleme d'acces a une machine sur un réseau
    Par zorian dans le forum Développement
    Réponses: 3
    Dernier message: 09/06/2004, 13h04

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