當前位置:編程學習大全網 - 編程語言 - java ssh linux 編程

java ssh linux 編程

純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 root@192.168.1.5 ls -l " } ;

Process p = Runtime.getRuntime().exec(shell);

但是事情往往並不是我們想象的如此簡單,絕大部分的客戶是不能允許他們的Linux中還存在壹個不需要密碼就能執行任何命令的帳戶的。那麽,在Java中就沒有任何辦法通過ssh登錄來執行壹些命令嗎?

不慌,先來Google壹下,從壹些網上別人請教的代碼的蛛絲螞跡中,發現了JSch ( /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 AAAAB3NzaC1yc2EAAAABIwAAAQEAsoINy5sLnrzYCTKBh2UrsqHd62dnnimCZtvq8ojTYt7NcAjjtW2FqmFNO+5x/mTwyY+ssoP5SganxDYs3G016aPZDQdGVZMn/08IsB7QEIAXEVHtgGIGuLqsdMUBBIxV7KI6BK+OWVwv277tBOgqvPcgeEacviFZb2lZhWr8hvR2pTrPFBLr+UELejm/Nnf9qWDBjDj/d2o8+ReSwN8dzNJIiFyWdboyUCZfHhxNgiGANFx22gC4lM+Wk8gkASo/QYDvoUwLFrAJoMdsw0d4pn34bQ0mspaaWy4N0+zrNCPcl8D0Q1RrAjfYfOiZOSTnxabJ2DLijuq7UgFbn2ESMw==

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

  • 上一篇:樓宇自控弱電包括哪些方面及維護?
  • 下一篇:學習java語言基礎哪種書好,
  • copyright 2024編程學習大全網