java通過ssh連接服務器執行shell命令:JSch 是SSH2的一個純Java實現。它允許你連接到一個sshd 服務器,使用端口轉發,X11轉發,文件傳輸等等。你可以將它的功能集成到你自己的 程序中。同時該項目也提供一個J2ME版本用來在手機上直連SSHD服務器。
SSH是Secure Shell的縮寫,一種建立在應用層和傳輸層基礎上的安全協議。SSH在連接和傳送過程中會加密所有數據,可以用來在不同系統或者服務器之間進行安全連接。SSH提供兩種的安全驗證方式:基于密碼的認證和基于密匙的認證。其中,基于密碼的認證比較簡單,只要知道遠程主機的用戶名和密碼,就可以進行登錄。基于密匙的認證比較麻煩,而且連接比較耗時,這里不詳細介紹。
有很多基于SSH協議的客戶端,例如:PuTTY、OpenSSH、Xshell 4等,可以遠程連接幾乎所有UNIX平臺。同時,可以通過Linux命令行ssh uername@host連接到某主機。
在項目中,如何利用代碼實現SSH,遠程執行Shell腳本呢?JSch是Java Secure Channel的縮寫,是一個SSH2功能的純Java實現,具體信息可以參考JSch官網。它允許你連接到一個SSH服務器,并且可以使用端口轉發,X11轉發,文件傳輸等,同時你也可以集成它的功能到你自己的應用程序。在使用前,需要下載并導入JSch包:jsch-0.1.50.jar。
示例程序
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
|
package com.stormma.demo; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; public class Shell { //遠程主機的ip地址 private String ip; //遠程主機登錄用戶名 private String username; //遠程主機的登錄密碼 private String password; //設置ssh連接的遠程端口 public static final int DEFAULT_SSH_PORT = 22 ; //保存輸出內容的容器 private ArrayList<string> stdout; /** * 初始化登錄信息 * @param ip * @param username * @param password */ public Shell( final String ip, final String username, final String password) { this .ip = ip; this .username = username; this .password = password; stdout = new ArrayList<string>(); } /** * 執行shell命令 * @param command * @return */ public int execute( final String command) { int returnCode = 0 ; JSch jsch = new JSch(); MyUserInfo userInfo = new MyUserInfo(); try { //創建session并且打開連接,因為創建session之后要主動打開連接 Session session = jsch.getSession(username, ip, DEFAULT_SSH_PORT); session.setPassword(password); session.setUserInfo(userInfo); session.connect(); //打開通道,設置通道類型,和執行的命令 Channel channel = session.openChannel( "exec" ); ChannelExec channelExec = (ChannelExec)channel; channelExec.setCommand(command); channelExec.setInputStream( null ); BufferedReader input = new BufferedReader( new InputStreamReader (channelExec.getInputStream())); channelExec.connect(); System.out.println( "The remote command is :" + command); //接收遠程服務器執行命令的結果 String line; while ((line = input.readLine()) != null ) { stdout.add(line); } input.close(); // 得到returnCode if (channelExec.isClosed()) { returnCode = channelExec.getExitStatus(); } // 關閉通道 channelExec.disconnect(); //關閉session session.disconnect(); } catch (JSchException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return returnCode; } /** * get stdout * @return */ public ArrayList<string> getStandardOutput() { return stdout; } public static void main( final String [] args) { Shell shell = new Shell( "xxx.xxx.xxx.xxx" , "username" , "password" ); shell.execute( "uname -s -r -v" ); ArrayList<string> stdout = shell.getStandardOutput(); for (String str : stdout) { System.out.println(str); } } } |
MyUserInfo
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
|
package com.stormma.demo; import com.jcraft.jsch.UserInfo; public class MyUserInfo implements UserInfo { @Override public String getPassphrase() { // TODO Auto-generated method stub System.out.println( "MyUserInfo.getPassphrase()" ); return null ; } @Override public String getPassword() { // TODO Auto-generated method stub System.out.println( "MyUserInfo.getPassword()" ); return null ; } @Override public boolean promptPassphrase(String arg0) { // TODO Auto-generated method stub System.out.println( "MyUserInfo.promptPassphrase()" ); System.out.println(arg0); return false ; } @Override public boolean promptPassword(String arg0) { // TODO Auto-generated method stub System.out.println( "MyUserInfo.promptPassword()" ); System.out.println(arg0); return false ; } @Override public boolean promptYesNo(String arg0) { // TODO Auto-generated method stub' System.out.println( "MyUserInfo.promptYesNo()" ); System.out.println(arg0); if (arg0.contains( "The authenticity of host" )) { return true ; } return true ; } @Override public void showMessage(String arg0) { // TODO Auto-generated method stub System.out.println( "MyUserInfo.showMessage()" ); } } |
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://www.2cto.com/kf/201701/587879.html