注:此ssh非彼SSH(Struts+Spring+Hibernate) shell
在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 root@192.168.1.5 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 AAAAB3NzaC1yc2EAAAABIwAAAQEAsoINy5sLnrzYCTKBh2UrsqHd62dnnimtomcat
CZtvq8ojTYt7NcAjjtW2FqmFNO+5x/mTwyY+ssoP5SganxDYs3G016aPZDQdGVZMn/08Issession
B7QEIAXEVHtgGIGuLqsdMUBBIxV7KI6BK+OWVwv277tBOgqvPcgeEacviFZb2lZhWr8hvapp
R2pTrPFBLr+UELejm/Nnf9qWDBjDj/d2o8+ReSwN8dzNJIiFyWdboyUCZfHhxNgiGANFx22ssh
gC4lM+Wk8gkASo/QYDvoUwLFrAJoMdsw0d4pn34bQ0mspaaWy4N0+zrNCPcl8D0Q1Ride
rAjfYfOiZOSTnxabJ2DLijuq7UgFbn2ESMw==
附:產生此文件的簡單方法:能夠在Linux中用ssh命令登陸一次,這樣便在/root/.ssh(假如使用root用戶登陸到Linux)目錄下生成known_hosts文件。spa