fd
Anmeldungsdatum: 3. Juni 2009
Beiträge: 175
|
hallo habe folgende Frage und zwar will ich mir auf java ein ähnliches Programm basteln wie das "Terminal" von gnome nur mit viel weniger umfang. Es sollen einfach schaltflächen da sein wie "Apache restart" damit ich nicht jedes mal alles von hand machen muss. ich scheitere ich jedoch an dem das man ja das Kommando "/etc/init.d/apache2 restart" als Super user ausführen muss. Ich habe schon einiges rumprogrammiert an passwort übergabe es will aber nicht funktionieren. 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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163 |
import java.awt.*;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import javax.swing.*;
@SuppressWarnings("serial")
public class Oberflaeche extends JPanel {
JButton apache = new JButton("apache neustarten");
JButton vsftpd = new JButton("vsftpd neustarten");
JButton network = new JButton("netzwerk neustarten");
JTextArea anzeige=new JTextArea(); /* "Print out" anzeige*/
public static void main(String[] args) throws IOException{
Oberflaeche dieOberflaeche = new Oberflaeche();
JFrame derRahmen = new JFrame("Oberflaeche");
derRahmen.getContentPane().add(dieOberflaeche);
derRahmen.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
derRahmen.setSize(700,700);
derRahmen.setVisible(true);
}
public Oberflaeche(){
setBackground(new Color(144, 180, 202));
setLayout(null);
this.setFocusable(true);
add(apache);
add(vsftpd);
add(network);
add(anzeige);
apache.setBounds(10, 10, 200, 20);
vsftpd.setBounds(10, 40, 200, 20);
network.setBounds(10, 70, 200, 20);
anzeige.setBounds(10, 100, 500, 500);
apache.addMouseListener(new java.awt.event.MouseAdapter(){
public void mousePressed(MouseEvent e) {
try {
listenapache();
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
});
vsftpd.addMouseListener(new java.awt.event.MouseAdapter(){
public void mousePressed(MouseEvent e) {
try {
listenvsftpd();
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
});
network.addMouseListener(new java.awt.event.MouseAdapter(){
public void mousePressed(MouseEvent e) {
try {
listennetwork();
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
});
}
public void runmet() throws IOException, InterruptedException{
ProcessBuilder builder = new ProcessBuilder("sudo" , "-s");
Process p = builder.start();
PrintStream out = new PrintStream(p.getOutputStream());
out.println("passwort");
out.flush();
out.close();
p.waitFor();
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String s;
while((s=in.readLine())!=null){
anzeige.setText("\n"+s);
System.out.println(s);
}
}
public void listenapache() throws IOException, InterruptedException{
ProcessBuilder builder = new ProcessBuilder("sudo", "/etc/init.d/apache2" , "restart");
Process p = builder.start();
PrintStream out = new PrintStream(p.getOutputStream());
out.println("passwort");
out.flush();
out.close();
p.waitFor();
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String s;
while((s=in.readLine())!=null){
anzeige.setText("\n"+s);
System.out.println(s);
}
}
public void listenvsftpd() throws IOException, InterruptedException{
// ProcessBuilder builder = new ProcessBuilder("sudo", "/etc/init.d/vsftpd" , "restart");
ProcessBuilder builder = new ProcessBuilder("/etc/init.d/vsftpd" , "restart");
Process p = builder.start();
PrintStream out = new PrintStream(p.getOutputStream());
out.println("passwort");
out.flush();
out.close();
p.waitFor();
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String s;
while((s=in.readLine())!=null){
anzeige.setText("\n"+s);
System.out.println(s);
}
}
public void listennetwork() throws IOException, InterruptedException{
ProcessBuilder builder = new ProcessBuilder("sudo", "/etc/init.d/networking" , "restart");
Process p = builder.start();
PrintStream out = new PrintStream(p.getOutputStream());
out.println("passwort");
out.flush();
out.close();
p.waitFor();
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String s;
while((s=in.readLine())!=null){
anzeige.setText("\n"+s);
System.out.println(s);
}
}
}
|
|
lupinix
Anmeldungsdatum: 21. Oktober 2007
Beiträge: 524
Wohnort: /dev/wohnung
|
Ich bin jetzt (noch) kein Javaexperte aber ich würde sowas eher mit einem Shellskript machen und für die Dialogfelder Zenity oder sowas nehmen, wenn Konsole langt Dialog. Frage aus reinem Interesse (da ich selbst in Kürze Java lernen werde): Gibt es einen besonderen Grund weshalb du Java verwendest? Viele Grüße lupinix
|
stmaassen
Anmeldungsdatum: 12. Juni 2008
Beiträge: 18
|
Moin! Auch wenn ich meinem Vorredner zustimmen muss und ich sowas bisher nicht gemacht hab in Java, würds ich vllt. über http://download.oracle.com/javase/6/docs/api/java/lang/System.html#console() und http://download.oracle.com/javase/6/docs/api/java/io/Console.html probieren. So in der Art 1 Zeile schreiben, eine Zeile lesen und abhängig vom Input dann wieder schreiben. Wegen der Shell, die gefordert wird, kannst Du ja einen (Gnome-)Starter auf den Desktop legen, bei dem dann anklickst, dass das ganze im Terminal starten soll oder Du machst ein Startskript, dann müsste darüber die Shell kriegen.
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Nun, Passwortübergabe geht nicht so einfach mit reinpipen. Die Passwortabhängigen Programme prüfen meist, ob ein Terminal dranhängt und/oder reset auf eEingabepuffer, sodass einfaches Scripting nicht weiterbringt. Oft wird dafür "expect" verwendet. Aber dein Problem mit den kleinen Starterlein lässt sich ja mit einfachen Bordmitteln lösen, wie es stmmmassen empfholen hat. Das Passwort kannst du umgehen, indem du sudo so konfigurierts, dass du beim Restart des Apache nicht nach dem Passwort gefragt wirst. Schau im Wiki unter 'sudo' was man die Datei /etc/sudoers eintragen muss.
|
fd
(Themenstarter)
Anmeldungsdatum: 3. Juni 2009
Beiträge: 175
|
das obere funktioniert ja bei mir, warum sollte ich es mit einem skript machen und mich nur an linux binden. Das Problem habe ich nur mit der Passworteingabe
|
John_W
Anmeldungsdatum: 10. Juli 2010
Beiträge: 571
|
Du bindest dich schon mit den Pfaden an Linux, mindestens an Unix-Systeme. Ein Shell-Skript ist da wirklich angebrachter, da sich die Pfade in Variablen verpacken lassen (jaja, geht auch in Java) und nicht neu kompiliert werden müssen, zumal Java für sowas zu lahm ist (meine Meinung). Nachteile? Bis auf das neuschreiben keine.
|
fd
(Themenstarter)
Anmeldungsdatum: 3. Juni 2009
Beiträge: 175
|
habe mein Problem schon mit gksu lösen können, habe aber jetzt ein neues bekommen und zwar geht meine konsole bei allen befehlen die nur informationen ausgeben wie z.B. "lshw", aber bei befehlen wie "ping google.de" bleibt es einfach hängen. hier der quellcode: 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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263 | import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.swing.*;
@SuppressWarnings("serial")
public class Oberflaeche extends JPanel implements KeyListener {
JButton apache = new JButton("apache neustarten");
JButton vsftpd = new JButton("vsftpd neustarten");
JButton network = new JButton("netzwerk neustarten");
JTextArea anzeige = new JTextArea(); /* "Print out" anzeige */
JTextField eingabe = new JTextField();
JScrollPane scrpane = new JScrollPane(anzeige);
JComboBox combo = new JComboBox();
String command1 = "gksu sudo /etc/init.d/apache2 restart",
command2 = "gksu sudo service vsftpd restart",
command3 = "gksu sudo /etc/init.d/networking restart",
gescommand = "", command = "", cache = "",
dateiName = "config.txt";
String commands[] = new String[1000];
FileOutputStream schreibeStrom;
public static void main(String[] args) throws IOException {
Oberflaeche dieOberflaeche = new Oberflaeche();
JFrame derRahmen = new JFrame("Oberflaeche");
derRahmen.getContentPane().add(dieOberflaeche);
derRahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
derRahmen.setVisible(true);
derRahmen.setExtendedState(JFrame.MAXIMIZED_BOTH);
// derRahmen.setSize(700, 700);
derRahmen.setVisible(true);
}
public Oberflaeche() throws IOException {
setBackground(Color.black);
setLayout(null);
add(apache);
apache.setBounds(10, 10, 200, 20);
add(vsftpd);
vsftpd.setBounds(10, 40, 200, 20);
add(network);
network.setBounds(10, 70, 200, 20);
add(scrpane);
scrpane.setBounds(10, 100, 1000, 400);
anzeige.setEditable(false);
anzeige.setBorder(null);
add(eingabe);
eingabe.setBounds(10, 500, 1000, 100);
eingabe.setFont(new Font("Arial", 0, 24));
add(combo);
combo.setBounds(10, 620, 300, 20);
lesedatei();
apache.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
listenapache();
}
});
vsftpd.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
listenvsftpd();
}
});
network.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
listennetwork();
}
});
eingabe.addKeyListener(this);
combo.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
String sel = combo.getSelectedItem().toString();
try {
selcom(sel);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
});
}
public void listenapache() {
try {
Process process = Runtime.getRuntime().exec(command1);
BufferedReader read = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String s;
while ((s = read.readLine()) != null) {
anzeige.append(s + "\n");
}
} catch (IOException e1) {
System.out.println(e1);
}
anzeige.append("\n");
}
public void listenvsftpd() {
try {
Process process = Runtime.getRuntime().exec(command2);
BufferedReader read = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String s;
while ((s = read.readLine()) != null) {
anzeige.append(s + "\n");
}
} catch (IOException e1) {
System.out.println(e1);
}
anzeige.append("\n");
}
public void listennetwork() {
try {
Process process = Runtime.getRuntime().exec(command3);
BufferedReader read = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String s;
while ((s = read.readLine()) != null) {
anzeige.append(s + "\n");
}
} catch (IOException e1) {
System.out.println(e1);
}
anzeige.append("\n");
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
try {
command ="gksu sudo "+ eingabe.getText();
if (command.length() != 0) {
Process process = Runtime.getRuntime().exec(command);
BufferedReader read = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String s;
while ((s = read.readLine()) != null) {
anzeige.append(s + "\n");
}
Stringprüfen();
} else {
anzeige.setText("Geben sie bitte etwas ein");
}
} catch (IOException e1) {
System.out.println(e1);
}
anzeige.append("\n");
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
public String gethome() {
return System.getProperty("user.home");
}
private void Stringprüfen() throws IOException {
boolean gleich = false;
int h = 0;
for (int i = 0; i < commands.length; i++) {
if (commands[i] != null) {
if (commands[i].equals(command)) {
gleich = true;
} else {
h = i;
}
}
}
if (gleich == false) {
commands[h + 1] = command;
combo.addItem(command);
} else {
gleich = false;
}
schreibedatei();
}
public void schreibedatei() throws IOException {
schreibeStrom = new FileOutputStream(dateiName);
for (int j = 0; j < commands.length; j++) {
if (commands[j] != null) {
cache = "\n" + commands[j];
for (int i = 0; i < cache.length(); i++) {
schreibeStrom.write((byte) cache.charAt(i));
}
}
}
schreibeStrom.close();
}
public void lesedatei() throws IOException {
int i = 0;
FileReader fr = new FileReader(dateiName);
BufferedReader br = new BufferedReader(fr);
while ((cache = br.readLine()) != null) {
combo.addItem(cache);
commands[i] = cache;
i++;
}
br.close();
}
public void selcom(String sel) throws IOException {
Process process = Runtime.getRuntime().exec(sel);
BufferedReader read = new BufferedReader(new InputStreamReader(process
.getInputStream()));
String s;
while ((s = read.readLine()) != null) {
anzeige.append(s + "\n");
}
}
}
|
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Jetzt machste doch umständlich mit Java weiter .... Du liest ja den Ausgabe-Stream des gestarteten Programmes mit einem BufferedReader zeilenweise. Das 'ping' hört aber nie auf und schließt nicht seinen Ausgabekanal.
Es läuft noch - oder hast du es mit einer Option '-c 1' aufgerufen? Dann müsste es gehen. Nach "Benutzung" eines Programmes, muss man auch alle Stream, die so ein Programm bietet (stdin, stdout, stderr) schließen, da Java ja nicht riechen kann, wann diese Dinger noch gebraucht werden.
Anderenfalls bleiben die Descriptoren im System als "offen" in Verwendung. So manche Java-Programme ernten dann ein
'too many open file descriptors" - was bei dir eher aber nicht der Fall sein wird, weil du nur wenige benutzt.
|
fd
(Themenstarter)
Anmeldungsdatum: 3. Juni 2009
Beiträge: 175
|
könntest du es mir vielleicht an einem beispiel erläutern wie man so einen stream schließt. Und dann bleicht noch immer die Frage offen was mache ich bei solchen Programmen wie "airodump" die laufend eine ausgabe machen und dessen ausgabe wollte ich ja eig im textarea anzeigen.
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Mit Stream schließen meine ich: wenn du mit dem gestarteten Programm fertig bist - also, wenn du alles gelesen hast, was du aus dessen Ausgabestream lesen wolltest, dann machst du danach ein close() auf diesen Stream. Mehr habe ich damit nicht gemeint. Wenn di zeilenweise lesen willst und die einzelnen Zeilen in eine TextArea einfügen willst... deine einzelnen Zeilen können in einem gewissen zeitlichen Abstand kommen. Wenn der Abstand größer ist, muss man sicherstellen, dass das Programm nicht in einer Lesemethode hängt und auf Bytes wartet. Der Anwender am GUI würde denken, das Programm taugt nix ☺ Falls es so sein sollte, dass der Anwender bis auf die letzte Zeile warten soll und sonst nix am GUI zu tun ist, könnte man eine Zeile lesen, dann update des TextArea etc. machen. Falls man parallele Abläufe benötigt, muss der Programmstart in einem eigenen Thread passieren. Wenn dort in diesem Thread dann eine Zeile gelesen wird, sollte man sie mit einer Update-Aktion in den Swing Worker-Thread einhängen damit das TextArea konfliktfrei um eine Zeile ergänzt werden kann.
|