基于開源ssh Ganymed 的ssh遠程連接工具(共同討論版)
本工具模仿putty 實現了簡單的ssh 遠程交互功能。本工具可嵌入到集群管理工具
目前尚在探索,錯誤之處歡迎指正
主干代碼如下 轉載注明:http://www.aygfsteel.com/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 也歡迎指導,本文僅供參考,不足之處多有諒解,轉帖請注明地址。


附件下載地址
posted on 2012-08-12 18:34 scorpio小蝎 閱讀(5504) 評論(4) 編輯 收藏 所屬分類: java