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
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!!!
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
Bonjour j'ai téléchargé la bibliothèque et j'ai obtenu le code suivant:
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?
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; } } }
La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!
hum hum... au vue de cette ligne
tu dois pouvoir la saisir dans la console, directement
Code : Sélectionner tout - Visualiser dans une fenêtre à part channel.setInputStream(System.in);
"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
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
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!!!
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
La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!
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!!!
Après des recherches j'ai trouvé cette classe:
le script eteindre.sh possède 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 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(); } } }
j'ai modifier le fichier sudoers et il m'affiche toujours le message suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part sudo init 0
Dans le fichier sudoers j'ia ajouté:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4Connected sudo: no tty present and no askpass program specified exit-status: 1 DONE
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!!!
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:
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part user_name ALL = NOPASSWD /sbin/init
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
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!!!
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.
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!!!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager