純Java通過SSH執行Linux命令的方法及代碼

 注:此ssh非彼SSH(Struts+Spring+Hibernate) 


在Java中,我們可以通過Runtime去執行一些OS的命令,如: 

String[] shell = new String[] { " /bin/sh " , " -c " , " ls -l " } ; 
Process p = Runtime.getRuntime().exec(shell); 
通過在Linux上執行 ssh --help命令, 
usage: ssh [-1246AaCfgKkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec] 
[-D [bind_address:]port] [-e escape_char] [-F configfile] 
[-i identity_file] [-L [bind_address:]port:host:hostport] 
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] 
[-R [bind_address:]port:host:hostport] [-S ctl_path] 
[-w local_tun[:remote_tun]] [user@]hostname [command] 
不難發現,ssh命令中並不能帶密碼。 

如果不需要登錄時,我們可以用這樣的方式來執行: 

String[] shell = new String[] { " /bin/sh " , " -c " , " ssh [email protected] ls -l " } ; 
Process p = Runtime.getRuntime().exec(shell); 
但是事情往往並不是我們想象的如此簡單,絕大部分的客戶是不能允許他們的Linux中還存在一個不需要密碼就能執行任何命令的帳戶的。那麼,在Java中就沒有任何辦法通過ssh登錄來執行一些命令嗎? 

不慌,先來Google一下,從一些網上別人請教的代碼的蛛絲螞跡中,發現了JSch (http://www.jcraft.com/jsch/) ,這東東還真是不錯,來,我們先看看其官方的簡介: 

JSch is a pure Java implementation of SSH2. 
JSch allows you to connect to an sshd server and use port forwarding, X11 forwarding, file transfer, etc., and you can integrate its functionality into your own Java programs. JSch is licensed under BSD style license. 
這東東支持像telnet一樣的ssh的session,SFTP,SCP等。 

下面,就讓我們來看一個執行ssh命令的通用方法: 
public static String sshExecute(String host, String user, String pwd, 
String command) { 
String osName = System.getProperty("os.name"); 
// ps -ef|grep tomcat|grep -v grep|awk '{print $2}' 
StringBuffer sb = new StringBuffer(); 
try { 
JSch jsch = new JSch(); 
if (osName.toUpperCase().indexOf("WINDOWS") > -1) { 
jsch.setKnownHosts("c:\\known_hosts"); 
} else { 
jsch.setKnownHosts("/root/.ssh/known_hosts"); 

Session session = jsch.getSession(user, host, 22); 
session.setPassword(pwd); 
session.connect(); 
Channel channel = session.openChannel("exec"); 
((ChannelExec) channel).setCommand(command); 
InputStream in = channel.getInputStream(); 
channel.connect(); 
int nextChar; 
while (true) { 
while ((nextChar = in.read()) != -1) { 
sb.append((char) nextChar); 

if (channel.isClosed()) { 
System.out.println("exit-status: " 
+ channel.getExitStatus()); 
break; 

try { 
Thread.sleep(1000); 
} catch (Exception ee) { 


channel.disconnect(); 
session.disconnect(); 
} catch (Exception e) { 
e.printStackTrace(); 

return sb.toString(); 


看看,是不是挺簡單了。 

別忘了,由於這是Pure Java program,還有一個優點就是,這樣的程序不依賴於OS,可以直接在Windows或者其它OS上運行。 

對了,執行這個需要RSA的Key文件,示例如下: 
192.168.1.4 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsoINy5sLnrzYCTKBh2UrsqHd62dnnim

CZtvq8ojTYt7NcAjjtW2FqmFNO+5x/mTwyY+ssoP5SganxDYs3G016aPZDQdGVZMn/08Is

B7QEIAXEVHtgGIGuLqsdMUBBIxV7KI6BK+OWVwv277tBOgqvPcgeEacviFZb2lZhWr8hv

R2pTrPFBLr+UELejm/Nnf9qWDBjDj/d2o8+ReSwN8dzNJIiFyWdboyUCZfHhxNgiGANFx22

gC4lM+Wk8gkASo/QYDvoUwLFrAJoMdsw0d4pn34bQ0mspaaWy4N0+zrNCPcl8D0Q1R

rAjfYfOiZOSTnxabJ2DLijuq7UgFbn2ESMw== 
附:產生此文件的簡單方法:可以在Linux中用ssh命令登錄一次,這樣便在/root/.ssh(假如使用root用戶登錄到Linux)目錄下生成known_hosts文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章