本Blog所有內容不得隨意轉載,版權屬于作者所有。如需轉載請與作者聯系(
fastzch@163.com
)。
未經許可的轉載,本人保留一切法律權益。
注:此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 (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?AAAAB3NzaC1yc2EAAAABIwAAAQEAsoINy5sLnrzYCTKBh2UrsqHd62dnnimCZtvq8ojTYt7NcAjjtW2FqmFNO+5x/mTwyY+ssoP5SganxDYs3G016aPZDQdGVZMn/08IsB7QEIAXEVHtgGIGuLqsdMUBBIxV7KI6BK+OWVwv277tBOgqvPcgeEacviFZb2lZhWr8hvR2pTrPFBLr+UELejm/Nnf9qWDBjDj/d2o8+ReSwN8dzNJIiFyWdboyUCZfHhxNgiGANFx22gC4lM+Wk8gkASo/QYDvoUwLFrAJoMdsw0d4pn34bQ0mspaaWy4N0+zrNCPcl8D0Q1RrAjfYfOiZOSTnxabJ2DLijuq7UgFbn2ESMw==

附:產生此文件的簡單方法:可以在Linux中用ssh命令登錄一次,這樣便在/root/.ssh(假如使用root用戶登錄到Linux)目錄下生成known_hosts文件。
posted on 2008-07-08 23:47
Robin's Programming World 閱讀(15784)
評論(4) 編輯 收藏 所屬分類:
Java