Telnet.java
上传用户:sxqicai
上传日期:2021-04-19
资源大小:4k
文件大小:16k
源码类别:

Telnet服务器

开发平台:

Java

  1. package telnet;
  2. import java.io.InputStream;
  3. import java.io.PrintStream;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Calendar;
  6. import java.util.Date;
  7. import org.apache.commons.net.telnet.TelnetClient;
  8. import web.domain.NetElement;
  9. public class Telnet extends Thread {
  10. public boolean needLog = false;
  11. public boolean isFinished = false;
  12. public TelnetLog telnetLog;
  13. public String operator_id;
  14. public Date operating_date;
  15. public Long serial = System.currentTimeMillis();
  16. public TelnetClient telnet = new TelnetClient();
  17. public BackupProgress backupProgress = new BackupProgress();
  18. public InputStream in;
  19. public InputStream in2;
  20. public PrintStream out;
  21. public StringBuffer out_sb = new StringBuffer();
  22. public String error_msg = "";
  23. public int result = 0;
  24. public String host;
  25. public String port;
  26. public String user;
  27. public String password;
  28. public NetElement ne;
  29. //
  30. // 提示符,具体telnet到相应主机查看
  31. public char prompt;
  32. public Telnet(String host, String port, String password, NetElement ne) {
  33. try {
  34. telnet.connect(host, Integer.parseInt(port));
  35. in = telnet.getInputStream();
  36. out = new PrintStream(telnet.getOutputStream());
  37. TelnetCommand command = null;
  38. // 登录
  39. waitForOutput("Password: ");
  40. command = new TelnetCommand(password, ">");
  41. sendCommand(command);
  42. // 再次登录到指定设备
  43. command = new TelnetCommand("telnet " + ne.getIp(), "login: ");
  44. sendCommand(command);
  45. command = new TelnetCommand(ne.getUser_name(), "Password: ");
  46. sendCommand(command);
  47. command = new TelnetCommand(ne.getPassword(), ">");
  48. sendCommand(command);
  49. } catch (TelnetException e) {
  50. e.printStackTrace();
  51. this.error_msg = "用户名、密码认证失败";
  52. this.result = 0;
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. this.error_msg = "无法连接目标主机";
  56. this.result = 0;
  57. }
  58. this.ne = ne;
  59. }
  60. /**
  61.  * 需要通过host来中转一下请求,然后telnet到Network Element上。
  62.  * 
  63.  * @param host
  64.  * @param port
  65.  * @param user
  66.  * @param password
  67.  * @param ne
  68.  */
  69. public Telnet(String host, String port, String user, String password,
  70. NetElement ne) {
  71. try {
  72. telnet.connect(host, Integer.parseInt(port));
  73. in = telnet.getInputStream();
  74. out = new PrintStream(telnet.getOutputStream());
  75. TelnetCommand command = null;
  76. // 登录
  77. waitForOutput("login: ");
  78. command = new TelnetCommand(user, "Password: ");
  79. // log(command.commandText);
  80. sendCommand(command);
  81. command = new TelnetCommand(password, ">");
  82. sendCommand(command);
  83. // 再次登录到指定设备
  84. command = new TelnetCommand("telnet " + ne.getIp(), "login: ");
  85. sendCommand(command);
  86. command = new TelnetCommand(ne.getUser_name(), "Password: ");
  87. sendCommand(command);
  88. command = new TelnetCommand(ne.getPassword(), ">");
  89. sendCommand(command);
  90. } catch (TelnetException e) {
  91. e.printStackTrace();
  92. this.error_msg = "用户名、密码认证失败";
  93. this.result = 0;
  94. } catch (Exception e) {
  95. e.printStackTrace();
  96. this.error_msg = "无法连接目标主机";
  97. this.result = 0;
  98. }
  99. this.ne = ne;
  100. }
  101. /**
  102.  * 直接在内网环境中telnet到网元上进行后续操作
  103.  * 
  104.  * @param ne
  105.  */
  106. public Telnet(NetElement ne, String operator_id, Date operating_date) {
  107. this.ne = ne;
  108. this.host = ne.getIp();
  109. this.port = "23";
  110. this.user = ne.getUser_name();
  111. this.password = ne.getPassword();
  112. this.operating_date = operating_date;
  113. this.operator_id = operator_id;
  114. this.needLog = true;
  115. }
  116. public Telnet(String host, String port, String password) {
  117. this.host = host;
  118. this.port = port;
  119. this.password = password;
  120. }
  121. public Telnet(String host, String port, String password,String user) {
  122. this.host = host;
  123. this.port = port;
  124. this.user = user;
  125. this.password = password;
  126. }
  127. public Telnet(NetElement ne, String operator_id, Date operating_date,
  128. boolean flag) {
  129. this.ne = ne;
  130. this.host = ne.getIp_1();
  131. this.port = "23";
  132. this.user = ne.getUser_name_1();
  133. this.password = ne.getPassword_1();
  134. this.operating_date = operating_date;
  135. this.operator_id = operator_id;
  136. this.needLog = false;
  137. }
  138. public int logon() {
  139. try {
  140. telnet.connect(host, Integer.parseInt(port));
  141. System.out.println("host:" + host);
  142. System.out.println("user:" + user);
  143. System.out.println("password:" + password);
  144. in = telnet.getInputStream();
  145. out = new PrintStream(telnet.getOutputStream());
  146. TelnetCommand command = null;
  147. out_sb.append("Connected to the Host Successfully...... n");
  148. // 登录
  149. waitForOutput("login: ");
  150. command = new TelnetCommand(user, "Password: ");
  151. sendCommand(command, 5);
  152. command = new TelnetCommand(password, ">");
  153. sendCommand(command, 10);
  154. out_sb.append("nTelnet Logon Successfully...... n");
  155. this.backupProgress.setLog(out_sb.toString());
  156. this.backupProgress.setSerial(this.serial);
  157. }
  158. catch (TelnetException e) {
  159. // TODO Auto-generated catch block
  160. e.printStackTrace();
  161. this.error_msg = "用户名、密码认证失败";
  162. this.result = 0;
  163. this.backupProgress.setEnd(true);
  164. this.backupProgress.setError(error_msg);
  165. this.backupProgress.setProgress(0);
  166. this.out_sb.append(error_msg);
  167. if (needLog) {
  168. telnetLog.log();
  169. }
  170. return -2;
  171. } catch (Exception e) {
  172. e.printStackTrace();
  173. this.error_msg = "无法连接目标主机:" + this.host;
  174. this.result = 0;
  175. this.backupProgress.setEnd(true);
  176. this.backupProgress.setError(error_msg);
  177. this.backupProgress.setProgress(0);
  178. this.out_sb.append(error_msg);
  179. if (needLog) {
  180. telnetLog.log();
  181. }
  182. return -1;
  183. }
  184. return 1;
  185. }
  186. public int logon1() {
  187. try {
  188. telnet.connect(host, Integer.parseInt(port));
  189. System.out.println("host:" + host);
  190. System.out.println("user:" + user);
  191. System.out.println("password:" + password);
  192. in = telnet.getInputStream();
  193. out = new PrintStream(telnet.getOutputStream());
  194. TelnetCommand command = null;
  195. out_sb.append("Connected to the Host Successfully...... n");
  196. System.out.println("Connected to the Host Successfully...... n");
  197. // 登录
  198. waitForOutput("Password:");
  199. command = new TelnetCommand(password, ">");
  200. sendCommand(command, 5);
  201. out_sb.append("nTelnet Logon Successfully...... n");
  202. System.out.println("nTelnet Logon Successfully...... n");
  203. this.backupProgress.setLog(out_sb.toString());
  204. this.backupProgress.setSerial(this.serial);
  205. }
  206. catch (TelnetException e) {
  207. // TODO Auto-generated catch block
  208. e.printStackTrace();
  209. this.error_msg = "用户名、密码认证失败";
  210. this.result = 0;
  211. this.backupProgress.setEnd(true);
  212. this.backupProgress.setError(error_msg);
  213. this.backupProgress.setProgress(0);
  214. this.out_sb.append(error_msg);
  215. if (needLog) {
  216. telnetLog.log();
  217. }
  218. return -2;
  219. } catch (Exception e) {
  220. e.printStackTrace();
  221. this.error_msg = "无法连接目标主机:" + this.host;
  222. this.result = 0;
  223. this.backupProgress.setEnd(true);
  224. this.backupProgress.setError(error_msg);
  225. this.backupProgress.setProgress(0);
  226. this.out_sb.append(error_msg);
  227. if (needLog) {
  228. telnetLog.log();
  229. }
  230. return -1;
  231. }
  232. return 1;
  233. }
  234. public int logon2() {
  235. try {
  236. telnet.connect(host, Integer.parseInt(port));
  237. System.out.println("host:" + host);
  238. System.out.println("user:" + user);
  239. System.out.println("password:" + password);
  240. in = telnet.getInputStream();
  241. out = new PrintStream(telnet.getOutputStream());
  242. TelnetCommand command = null;
  243. out_sb.append("Connected to the Host Successfully...... n");
  244. // 登录
  245. waitForOutput("name:");
  246. command = new TelnetCommand(user, "password:");
  247. sendCommand(command);
  248. command = new TelnetCommand(password, ">");
  249. sendCommand(command);
  250. //command = new TelnetCommand(password, ":");
  251. //sendCommand(command);
  252. //command = new TelnetCommand("nr", ">");
  253. //sendCommand(command);
  254. out_sb.append("nTelnet Logon Successfully...... n");
  255. this.backupProgress.setLog(out_sb.toString());
  256. this.backupProgress.setSerial(this.serial);
  257. }
  258. catch (TelnetException e) {
  259. // TODO Auto-generated catch block
  260. e.printStackTrace();
  261. this.error_msg = "用户名、密码认证失败";
  262. this.result = 0;
  263. this.backupProgress.setEnd(true);
  264. this.backupProgress.setError(error_msg);
  265. this.backupProgress.setProgress(0);
  266. this.out_sb.append(error_msg);
  267. if (needLog) {
  268. telnetLog.log();
  269. }
  270. return -2;
  271. } catch (Exception e) {
  272. e.printStackTrace();
  273. this.error_msg = "无法连接目标主机:" + this.host;
  274. this.result = 0;
  275. this.backupProgress.setEnd(true);
  276. this.backupProgress.setError(error_msg);
  277. this.backupProgress.setProgress(0);
  278. this.out_sb.append(error_msg);
  279. if (needLog) {
  280. telnetLog.log();
  281. }
  282. return -1;
  283. }
  284. return 1;
  285. }
  286. public String waitForOutput(String output, int minutes)
  287. throws TelnetException {
  288. return waitForOutput(output, minutes, "指令执行超时");
  289. }
  290. /**
  291.  * 等待输出结果为 output
  292.  * 
  293.  * @param pattern
  294.  * @return 完整的输出字符串
  295.  */
  296. public String waitForOutput(String output, int minutes, String error_msg)
  297. throws TelnetException {
  298. StringBuffer sb = new StringBuffer();
  299. StringBuffer sb2 = new StringBuffer();
  300. StringBuffer sb_new = new StringBuffer();
  301. boolean is_doing = true;
  302. char ch = '';
  303. Calendar c1 = Calendar.getInstance();
  304. c1.setTime(new Date());
  305. Calendar c2 = null;
  306. long diff_min = 0;
  307. byte[] buff = new byte[1];
  308. int ret_read = 0;
  309. do {
  310. c2 = Calendar.getInstance();
  311. c2.setTime(new Date());
  312. diff_min = (c2.getTimeInMillis() - c1.getTimeInMillis())
  313. / (1000 * 30);
  314. if (diff_min >= minutes) {
  315. is_doing = false;
  316. throw new TelnetException(-1, error_msg);
  317. }
  318. try {
  319. if (in.available() > 0) {
  320. ret_read = in.read(buff);
  321. // System.out.print(new String(buff, 0, ret_read));
  322. // 如果是回车,换行,则忽略(用与输出比较)
  323. ch = (char) buff[0];
  324. sb.append(ch);
  325. out_sb.append(ch);
  326. if (ch != 'r' && ch != 'n')
  327. sb2.append(ch);
  328. if (!output.toUpperCase().equals("END")) {
  329. if (sb2.toString().toUpperCase().endsWith(
  330. output.toUpperCase())) {
  331. System.out.print(sb.toString());
  332. return sb.toString();
  333. }
  334. } else // OUTPUT以END结尾
  335. {
  336. if (sb2.toString().toUpperCase().endsWith(
  337. output.toUpperCase())
  338. && !sb2.toString().toUpperCase().endsWith(
  339. "SUSPEND")) {
  340. System.out.print(sb.toString());
  341. return sb.toString();
  342. }
  343. }
  344. }
  345. Thread.sleep(20);
  346. } catch (Exception e) {
  347. e.printStackTrace();
  348. }
  349. } while (is_doing);
  350. return null;
  351. }
  352. public String waitForOutput(TelnetCommand command) throws Exception {
  353. String output = command.commandOutput;
  354. int minutes = command.commandTimeLimit;
  355. String error_msg = command.error_msg;
  356. return waitForOutput(output, minutes, error_msg);
  357. }
  358. public void waitForOutput2(TelnetCommand command, StringBuffer sb)
  359. throws Exception {
  360. String output = command.commandOutput;
  361. int minutes = command.commandTimeLimit;
  362. String error_msg = command.error_msg;
  363. waitForOutput2(output, minutes, error_msg, sb);
  364. }
  365. /**
  366.  * 等待输出结果为 output
  367.  * 
  368.  * @param pattern
  369.  * @return 完整的输出字符串
  370.  */
  371. public synchronized void waitForOutput2(String output, int minutes,
  372. String error_msg, StringBuffer sb) throws TelnetException {
  373. StringBuffer sb2 = new StringBuffer();
  374. StringBuffer sb_new = new StringBuffer();
  375. boolean is_doing = true;
  376. char ch = '';
  377. Calendar c1 = Calendar.getInstance();
  378. c1.setTime(new Date());
  379. Calendar c2 = null;
  380. long diff_min = 0;
  381. byte[] buff = new byte[1];
  382. int ret_read = 0;
  383. do {
  384. c2 = Calendar.getInstance();
  385. c2.setTime(new Date());
  386. diff_min = (c2.getTimeInMillis() - c1.getTimeInMillis())
  387. / (1000 * 30);
  388. if (diff_min >= minutes) {
  389. is_doing = false;
  390. throw new TelnetException(-1, error_msg);
  391. }
  392. try {
  393. if (in.available() > 0) {
  394. ret_read = in.read(buff);
  395. // System.out.print(new String(buff, 0, ret_read));
  396. // 如果是回车,换行,则忽略(用与输出比较)
  397. ch = (char) buff[0];
  398. sb.append(ch);
  399. System.out.print(ch);
  400. out_sb.append(ch);
  401. if (ch != 'r' && ch != 'n')
  402. sb2.append(ch);
  403. if (!output.toUpperCase().equals("END")) {
  404. if (sb2.toString().toUpperCase().endsWith(
  405. output.toUpperCase())) {
  406. return;
  407. }
  408. } else // OUTPUT以END结尾
  409. {
  410. if (sb2.toString().toUpperCase().endsWith(
  411. output.toUpperCase())
  412. && !sb2.toString().toUpperCase().endsWith(
  413. "SUSPEND")) {
  414. return;
  415. }
  416. }
  417. if (sb.toString().endsWith("---- More ----")) {
  418. TelnetCommand command = new TelnetCommand("r", "]");
  419. sendCommand2(command, sb);
  420. }
  421. }
  422. // Thread.sleep(20);
  423. } catch (Exception e) {
  424. e.printStackTrace();
  425. }
  426. } while (is_doing);
  427. }
  428. /**
  429.  * 等待输出结果,默认是1分钟
  430.  * 
  431.  * @param pattern
  432.  * @return
  433.  */
  434. public String waitForOutput(String output) throws TelnetException {
  435. return waitForOutput(output, 1);
  436. }
  437. public String sendCommand(TelnetCommand command) throws TelnetException {
  438. String result = null;
  439. for (int i = 0; i < command.redoTimes; i++) {
  440. try {
  441. out.println(command.commandText);
  442. out.flush();
  443. result = null;
  444. result = waitForOutput(command);
  445. if (result != null)
  446. return result;
  447. } catch (TelnetException ex) {
  448. log(command.commandText + "->" + "超时..");
  449. out.println("nr");
  450. out.flush();
  451. } catch (Exception ex) {
  452. // 插入到备份日志表中(开发人员)
  453. log(ex.toString());
  454. }
  455. // 重做之前,线程休眠2秒钟
  456. try {
  457. Thread.sleep(1000 * 2);
  458. } catch (InterruptedException e) {
  459. e.printStackTrace();
  460. }
  461. }
  462. if (result == null) {
  463. // 将error_msg最后写入到数据库中
  464. this.error_msg = "指令" + command.commandText + ""
  465. + command.error_msg;
  466. this.error_msg += "n指令未正确执行,退出备份作业。";
  467. this.out_sb.append(this.error_msg);
  468. throw new TelnetException(0, this.error_msg);
  469. }
  470. return result;
  471. }
  472. public void sendCommand2(TelnetCommand command, StringBuffer sb)
  473. throws TelnetException {
  474. String result = null;
  475. for (int i = 0; i < command.redoTimes; i++) {
  476. try {
  477. out.println(command.commandText);
  478. out.flush();
  479. result = null;
  480. waitForOutput2(command, sb);
  481. if (sb.toString().length() > 0)
  482. return;
  483. } catch (TelnetException ex) {
  484. log(command.commandText + "->" + "超时..");
  485. out.println("nr");
  486. out.flush();
  487. break;
  488. } catch (Exception ex) {
  489. // 插入到备份日志表中(开发人员)
  490. log(ex.toString());
  491. }
  492. // 重做之前,线程休眠2秒钟
  493. try {
  494. Thread.sleep(1000 * 2);
  495. } catch (InterruptedException e) {
  496. e.printStackTrace();
  497. }
  498. }
  499. if (result == null) {
  500. // 将error_msg最后写入到数据库中
  501. this.error_msg = "指令" + command.commandText + ""
  502. + command.error_msg;
  503. this.error_msg += "n指令未正确执行,退出备份作业。";
  504. this.out_sb.append(this.error_msg);
  505. throw new TelnetException(0, this.error_msg);
  506. }
  507. }
  508. /**
  509.  * 关闭连接
  510.  * 
  511.  */
  512. public void disconnect() {
  513. try {
  514. telnet.disconnect();
  515. isFinished = true;
  516. log("退出Telnet");
  517. } catch (Exception e) {
  518. e.printStackTrace();
  519. }
  520. }
  521. public void log(String log) {
  522. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  523. System.out.println("n" + "【" + format.format(new Date()) + "】" + log);
  524. }
  525. public Long getSerial() {
  526. return serial;
  527. }
  528. public BackupProgress getBackupProgress() {
  529. return backupProgress;
  530. }
  531. public void setBackupProgress(BackupProgress backupProgress) {
  532. this.backupProgress = backupProgress;
  533. }
  534. public String sendCommand(TelnetCommand command, int progress)
  535. throws TelnetException {
  536. String out = sendCommand(command);
  537. backupProgress.setLog(out_sb.toString());
  538. backupProgress.setProgress(progress);
  539. return out;
  540. }
  541. public int backup() {
  542. return 1;
  543. }
  544. public void run() {
  545. result = backup();
  546. if (needLog) {
  547. System.out.println("写入日志内容....");
  548. // 写入日志内容
  549. telnetLog.log();
  550. }
  551. }
  552. public static void main(String[] args) {
  553. // Telnet telnet=new Telnet ( "20.33.113","23","user", "password");
  554. }
  555. }