SSHThread.java
9.77 KB
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
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
package com.sitech.ismp.check.util;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.oro.text.regex.MalformedPatternException;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelShell;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;
import com.sitech.ismp.check.interfaces.InterfacePro;
import expect4j.Closure;
import expect4j.Expect4j;
import expect4j.ExpectState;
import expect4j.matches.EofMatch;
import expect4j.matches.Match;
import expect4j.matches.RegExpMatch;
import expect4j.matches.TimeoutMatch;
public class SSHThread implements RemoteController {
private String host_ip;
private int port;
private String login_id;
private String password;
private static final long defaultTimeOut = 1000;
String RPCCMD = "";
// 存放命令执行结果
private StringBuffer result = new StringBuffer();
Session session;
Channel channel;
public static String[] errorMsg = new String[] { "could not acquire the config lock " };
private Logger logger = Logger.getLogger("COLL");
public static final int COMMAND_EXECUTION_SUCCESS_OPCODE = -2;
private static Expect4j expect = null;
// 正则匹配,用于处理服务器返回的结果
public static String[] linuxPromptRegEx = new String[] { "~]#", "~#", "#", "$", ":~#", "/$", ">" };
InputStream inputStream;
OutputStream outputStream;
public void setRPCCMD(String rpccmd) {
RPCCMD = rpccmd;
}
/**
* 构造函数
*
* @param host_ip
* @param port
* @param login_id
* @param password
*/
public SSHThread(String host_ip, int port, String login_id, String password) {
this.host_ip = host_ip;
this.port = port;
this.login_id = login_id;
// this.password = DES3.decrypt(password);
this.password = password;
expect = getExpect();
}
// 获得Expect4j对象,该对用可以往SSH发送命令请求
private Expect4j getExpect() {
try {
logger.debug(String.format("Start logging to %s@%s:%s", this.login_id, this.host_ip, port));
JSch jsch = new JSch();
session = jsch.getSession(this.login_id, this.host_ip, port);
session.setPassword(password);
Hashtable<String, String> config = new Hashtable<String, String>();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
localUserInfo ui = new localUserInfo();
session.setUserInfo(ui);
session.connect();
channel = (ChannelShell) session.openChannel("shell");
Expect4j expect = new Expect4j(channel.getInputStream(), channel.getOutputStream());
expect.setDefaultTimeout(1000);
channel.connect();
logger.debug(String.format("Logging to %s@%s:%s successfully!", this.login_id, this.host_ip, port));
return expect;
} catch (Exception ex) {
logger.error("Connect to " + this.host_ip + ":" + port + "failed,please check your username and password!");
ex.printStackTrace();
}
return null;
}
// 登入SSH时的控制信息
// 设置不提示输入密码、不显示登入信息等
public static class localUserInfo implements UserInfo {
String passwd;
public String getPassword() {
return passwd;
}
public boolean promptYesNo(String str) {
return true;
}
public String getPassphrase() {
return null;
}
public boolean promptPassphrase(String message) {
return true;
}
public boolean promptPassword(String message) {
return true;
}
public void showMessage(String message) {
}
}
public void run() {
// super.run();
}
/**
* 关闭连接
*/
public void close() {
try {
// if(channel!=null&&channel.isConnected()){
// channel.disconnect();
// }
if (session != null && session.isConnected()) {
session.disconnect();
System.out.println("Disonnection successed!");
logger.info("Disconnect ip=" + this.host_ip);
} else {
logger.info("Disconnect ip=has exception before" + this.host_ip);
}
if (channel != null) {
channel.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
logger.error(e);
logger.info("ERROR Disconnect ip=" + this.host_ip);
}
}
/**
*
*/
public void doCommand(String command) {
}
/**
*
*/
public String getResultAsStr(String command) {
this.result = new StringBuffer();
Closure closure = new Closure() {
public void run(ExpectState expectState) throws Exception {
result.append(expectState.getBuffer());
expectState.exp_continue();
}
};
List<Match> lstPattern = new ArrayList<Match>();
String[] regEx = linuxPromptRegEx;
if (regEx != null && regEx.length > 0) {
synchronized (regEx) {
for (String regexElement : regEx) {
try {
RegExpMatch mat = new RegExpMatch(regexElement, closure);
lstPattern.add(mat);
} catch (MalformedPatternException e) {
logger.error("RegExpMatch error", e);
} catch (Exception e) {
logger.error("RegExpMatch exec error", e);
}
}
lstPattern.add(new EofMatch(new Closure() {
public void run(ExpectState state) {
}
}));
lstPattern.add(new TimeoutMatch(defaultTimeOut, new Closure() {
public void run(ExpectState state) {
}
}));
}
}
try {
boolean isSuccess = true;
isSuccess = isSuccess(lstPattern, command);
// 防止最后一个命令执行不了
isSuccess = !checkResult(expect.expect(lstPattern));
// 找不到错误信息标示成功
String response = result.toString().toLowerCase();
for (String msg : errorMsg) {
if (response.indexOf(msg) > -1) {
logger.info(msg);
}
}
} catch (Exception ex) {
logger.error("RegExpMatch exec error", ex);
}
return formatNVT(getResponse(),command);
}
// 检查执行是否成功
private boolean isSuccess(List<Match> objPattern, String strCommandPattern) {
try {
boolean isFailed = checkResult(expect.expect(objPattern));
if (!isFailed) {
expect.send(strCommandPattern);
expect.send("\n");
expect.getLastState();
return true;
}
return false;
} catch (MalformedPatternException ex) {
return false;
} catch (Exception ex) {
return false;
}
}
// 检查执行返回的状态
private boolean checkResult(int intRetVal) {
if (intRetVal == COMMAND_EXECUTION_SUCCESS_OPCODE) {
return true;
}
return false;
}
public String getResult() {
return null;
}
public void initial() throws Exception {
// try {
// JSch jsch = new JSch();
// session = jsch.getSession(login_id, host_ip, port);
// logger.info("into the step 11111" + login_id + "--" + host_ip + "--" + port + "--" + password);
// if (session != null) {
// session.setPassword(this.password);
// session.setConfig("StrictHostKeyChecking", this.keyChecking);
// session.connect(30000);
// this.autorized = true;
// logger.info("ssh connect successfuly!!! ip= " + this.host_ip);
// if (session != null && !session.isConnected()) {
// this.autorized = false;
// this.close();
// }
// }
// } catch (Exception e) {
// System.out.println("ssh创建session失败");
// e.printStackTrace();
// logger.error(e);
// logger.error("ssh connect fail ip=" + this.host_ip);
// throw new Exception(e);
// }
}
public boolean getResultAsString(String targetString) {
try {
InputStream in = channel.getInputStream();
int nextChar;
while (true) {
while ((nextChar = in.read()) != -1) {
result.append((char) nextChar);
if (this.result.toString().indexOf(targetString) != -1) {
return true;
}
}
if (channel.isClosed() || channel.isEOF()) {
// System.out.println(" exit-status: "
// + channel.getExitStatus());
in.close();
break;
}
try {
Thread.sleep(500);
} catch (Exception ee) {
ee.printStackTrace();
return false;
}
}
} catch (Exception e) {
this.result = new StringBuffer();
e.printStackTrace();
return false;
}
if (this.result.toString().indexOf(targetString) != -1) {
return true;
} else {
return false;
}
}
private String formatNVT(String str,String command){
String nvt_start = InterfacePro.nvt_start;
String nvt_end = InterfacePro.nvt_end;
// str = Pattern.compile("\\[0[^\\[0]*m", Pattern.DOTALL).matcher(str).replaceAll("");
// str = Pattern.compile(nvt_start+"[^"+nvt_start+"]*"+nvt_end, Pattern.DOTALL).matcher(str).replaceAll("");
str = str.replace(nvt_start, "");
str = str.replace(nvt_end, "");
String[] s = str.split("\n");
String result = "";
if(s.length>0){
for(int i=0;i<s.length-1;i++){
if(s[i].indexOf(command)>=0||s[i].indexOf("Last login:")>=0)
continue;
else
result += s[i]+"\n";
}
}
return result;
}
/**
* 获取服务器返回的信息
*
* @return 服务端的执行结果
*/
public String getResponse() {
return result.toString();
}
/**
* @param args
*/
public static void main(String[] args) {
String str = "";
if (true) {
try {
SSHThread ssh = new SSHThread("172.21.1.100", 22, "bnmsapp4", "bnmsapp4");
String cmd = "var=0\r\ndf -k /bnmsapp4/basd | grep \"/\" | grep \"%\" | awk '{print $4}' | while read lll\r\ndo\r\nvar=${lll}\r\necho 'var='$var\r\ndone";
str = ssh.getResultAsStr(cmd);
System.out.println("======================");
System.out.println(str);
System.out.println("======================");
ssh.close();
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("please use : java com.sitech.ismp.coll.centercoll.SSHThread <ip> <username> <password>");
}
// String nvt_start = "123";
// String nvt_end = "456";
// str = str.replace("[01;34", "");
// str = str.replace("[0m", "");
//// str = Pattern.compile(nvt_start+"[^"+nvt_start+"]*"+nvt_end, Pattern.DOTALL).matcher(str).replaceAll("");
// str = Pattern.compile("123[^123]*456", Pattern.DOTALL).matcher(str).replaceAll("");
// System.out.println(str);
}
}