基于开源ssh Ganymed 的ssh远程连接工具(共同讨论版)
本工具模仿putty 实现了简单的ssh 远程交互功能。本工具可嵌入到集群管理工具
目前尚在探索,错误之处欢迎指正
主干代码如下 转载注明:http://www.blogjava.net/roymoro/archive/2012/08/12/385318.html
1
package
cn.edu.neu.neuInfo.until.shell;
2![]()
3
import
java.io.BufferedReader;
4
import
java.io.IOException;
5
import
java.io.InputStream;
6
import
java.io.InputStreamReader;
7
import
java.io.OutputStream;
8
import
java.io.OutputStreamWriter;
9
import
java.io.PrintStream;
10
import
java.io.PrintWriter;
11
import
java.io.UnsupportedEncodingException;
12
import
java.util.Scanner;
13![]()
14
import
javax.swing.JTextArea;
15![]()
16![]()
17![]()
18
import
ch.ethz.ssh2.ChannelCondition;
19
import
ch.ethz.ssh2.Connection;
20
import
ch.ethz.ssh2.ConnectionInfo;
21
import
ch.ethz.ssh2.Session;
22![]()
23![]()
public
class
LinuxFSTool
{
24
private static Connection con;
25
private static Session session;
26
private static PrintWriter out;
27
static ReadThread rt;
28
static ReadThread rt2;
29
static OutputStream outStream;
30
private static String address,username,password;
31
private static NeuInfoConfigration neuInfoConfig=NeuInfoConfigration.getInstance("linuxTool.properties");
32
33![]()
public static boolean setConnect(String username,String password,String address) throws IOException
{
34
LinuxFSTool.address=address;
35
LinuxFSTool.username=username;
36
LinuxFSTool.password=password;
37
return connectFS();
38
}
39
public static boolean isconnected()
40![]()
{
41
if(con==null) return false;
42
return true;
43
}
44![]()
public static boolean connectFS() throws IOException
{
45
if(address==null||address.equals(""))
46
address=neuInfoConfig.getvalue(Parameters.Linux_ADDRESS.name);
47
if(username==null||username.equals(""))
48
username=neuInfoConfig.getvalue(Parameters.Linux_USERNAME.name);
49
if(password==null||password.equals(""))
50
password=neuInfoConfig.getvalue(Parameters.Linux_PASSWORD.name);
51
System.out.println(address+":"+username+":"+password);
52
con = new Connection(address);
53
ConnectionInfo info = con.connect();
54
//System.out.println(info.serverHostKey);
55
boolean result = con.authenticateWithPassword(username, password);
56![]()
if(result==false)
{ con.close();con=null;}
57
return result;
58
}
59![]()
public static void disconnectFS() throws IOException
{
60![]()
if(rt.isAlive())
{
61
rt.stopThread();
62
}
63![]()
if(rt2.isAlive())
{
64
rt2.stopThread();
65
}
66
session.close();
67
con.close();
68
session=null;
69
con=null;
70
}
71![]()
private static void shellRun(OutputStream outStream,JTextArea jta)
{
72
LinuxFSTool.outStream=outStream;
73![]()
try
{
74
if(con==null) connectFS();//如果未连接 则连接
75
session = con.openSession();
76
session.requestPTY("bash");
77
session.startShell();
78
InputStream in=session.getStdout();
79
rt=new ReadThread(in,new PrintStream(outStream),jta);
80
rt2=new ReadThread(session.getStderr(),new PrintStream(outStream),jta);
81
rt.start();
82
rt2.start();
83
out = new PrintWriter(new OutputStreamWriter(session.getStdin(),"UTF-8"));
84![]()
} catch (Exception ex)
{
85
System.out.println(ex.getLocalizedMessage());
86
ex.printStackTrace();
87
}
88
}
89![]()
public static void executeCommand(String command)
{
90
executeCommand(command,System.out,null);
91
}
92![]()
/** *//**
93
* use these instead of {@link LinuxFSTool#executeCommand(String)}
94
* @param command
95
* @param outStream
96
*/
97![]()
public static void executeCommand(String command,OutputStream outStream,JTextArea jta)
{
98
99
if(session==null)
100
shellRun(outStream,jta);
101![]()
if(!command.equals(""))
{
102
out.println(command);}
103
out.flush();
104![]()
if(command.endsWith("bye"))
{
105
closeShell();
106
}
107
108
// System.out.println(session.getExitStatus());
109
110
}
111![]()
private static void closeShell()
{
112
session.close();
113
session.waitForCondition(ChannelCondition.CLOSED | ChannelCondition.EOF | ChannelCondition.EXIT_STATUS, 30000);
114
//StringBuilder sb=new StringBuilder();\
115
System.out.println("byebye");
116
}
117![]()
/** *//**
118
* test
119
* @param args
120
* @throws IOException
121
*/
122![]()
public static void main(String[] args) throws IOException
{
123
Scanner scan=new Scanner(System.in);
124![]()
while(scan.hasNext())
{
125
LinuxFSTool.executeCommand(scan.nextLine(), System.out,null);
126
}
127
128
}
129
}
130![]()
131![]()
class
ReadThread
extends
Thread
{
132
private InputStream in;//输入流
133
private PrintStream out;
134
private String charset;
135
private JTextArea jta;
136
private boolean flag=true;
137![]()
public void stopThread()
{
138
flag=false;
139
}
140![]()
public ReadThread(InputStream in,PrintStream out,String charset)
{
141
this.out=out;
142
this.in = in;
143
this.charset=charset;
144
}
145![]()
public ReadThread(InputStream in,PrintStream out,JTextArea jta,String charset)
{
146
this.out=out;
147
this.jta=jta;
148
this.in = in;
149
this.charset=charset;
150
}
151![]()
public ReadThread(InputStream in,PrintStream out,JTextArea jta)
{
152
this(in, out, jta, "utf-8");
153
}
154![]()
public ReadThread(InputStream in,PrintStream out)
{
155
this(in,out,"utf-8");
156
157
}
158![]()
public ReadThread(InputStream in,String charset)
{
159
this(in,System.out,charset);
160
161
}
162
163![]()
public ReadThread(InputStream in)
{
164
this(in, "utf-8");
165
}
166
167
@Override
168![]()
public void run()
{
169
BufferedReader br;
170![]()
try
{
171
br = new BufferedReader(new InputStreamReader(in,charset));
172
173
String temp;
174
175![]()
while((temp=br.readLine())!=null&&flag==true)
{
176
// while(br.ready()&&flag==true){//
177
// temp=br.readLine();
178
if(out!=null)
179![]()
{ out.println(temp);
180
out.flush();}
181![]()
if(jta!=null)
{
182
jta.setText(jta.getText()+temp+"\n");
183
}
184
}
185
186![]()
} catch (UnsupportedEncodingException e1)
{
187
// TODO Auto-generated catch block
188
e1.printStackTrace();
189![]()
} catch (IOException e)
{
190
// TODO Auto-generated catch block
191
e.printStackTrace();
192
}}
193
194
}
195
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
目前本工具存在如下问题:
当输入例如 rm wenjian时 ,由于正常的ssh 会返回是否删除确认,初步分析 由于Ganymed 对返回消息的阻塞,本程序 是否删除某文件显示不出来。只有在下一次命令输入时才返回 是否删除某文件 ?新打入的命令。eclipse项目包,见附件。望大神,大叔,大婶指导。
其余bug 也欢迎指导,本文仅供参考,不足之处多有谅解,转帖请注明地址。
附件下载地址