`
runfeel
  • 浏览: 905438 次
文章分类
社区版块
存档分类
最新评论

SSH与Java

 
阅读更多

[原文地址:http://andrius.miasnikovas.lt/2009/07/ssh-with-java/]

最近,我需要做一些基于SSH-2协议操纵服务器的Java客户端程序。有相当多Java的SSH库可以选择。通常我喜欢尽可能使用BSD许可,所以我想我将会用Ganymed的SSH-2作为尝试。它很简单易用。下面是一个简短的例子如何连接到服务器使用的私钥,并执行一些命令。

importjava.io.*;
importch.ethz.ssh2.*;

publicclassExample{
publicstaticvoidmain(String[]args)throwsIOException{
Connectionconn=newConnection("hostname");
conn.connect();
FilepemKeyFile=newFile("privKey.pem");
booleanisAuth=conn.authenticateWithPublicKey("user", pemKeyFile,"keyPwd");
if(isAuth==false){
thrownewIOException("Authentication failed.");
}

Session sess=conn.openSession();
sess.execCommand("netstat -nl | egrep ':80' | wc -l");
InputStreaminp=sess.getStdout();
InputStreamReaderreader=newInputStreamReader(inp);
BufferedReaderbr=newBufferedReader(reader);
Stringline=br.readLine();

sess.close();
conn.close();
}
}

如果你不熟悉通过SSH公钥/私钥认证,请参阅下面的链接或谷歌搜索“无密码的ssh登录”。

http://ariadne.mse.uiuc.edu/Cluster/ssh_log_through.html

http://www.debian-administration.org/articles/152

大多数教程不会提到的一件事是,你的宿主目录应该有权限755。通过反复试验,我发现一些用户的主目录有777权限,只是不让你登陆一个私钥。

另一件事,我需要做的是复制一个文件到服务器。现在,这给了我一些意想不到的问题。虽然API似乎很简单,但是下面的代码没有任何效果。

Stringdata="sample data";
SFTPv3Client client=newSFTPv3Client(conn);
SFTPv3FileHandle handle=client.createFile("test_file.txt");

byte[]arr=data.getBytes();
client.write(handle,0, arr,0, arr.length);
client.closeFile(handle);
client.close();

在这里,conn对象是用于获取SSH连接,如第一段代码块所示。这看起来很简单,在服务器上创建一个文件,写一些字节,然后关闭,但是运行的结果只是在服务器上创建文件,但它始终是0字节的长度。我花了一段时间来弄清楚是什么错。现在是时候提到我用的是他们的网页上提供的“最新版本”Ganymed - build210。这让我很苦恼,代码没有按我希望的正常运行让我很沮丧,我开始查看Ganymed源码,我发现在SFTPv3Client类中的write(...)方法有一个不可满足的条件语句。我解决了这个问题,重新编译Ganymed的类库并可以运行。再后来我发现,实际上已经有一个Ganymed build211版,但他们又改了库名为trilead。在这个MAVEN2存储库中,你可以找到它(http://maven.ch.cam.ac.uk/m2repo/com/trilead/ssh2/build211/)。

编辑:2011-10-17

我已经创建了一个Maven项目,一个非常简单的类通过SSH使用Trilead库实现执行shell命令。Maven配置包含所需的库和依赖编译这个类的标签。只需使用MVN包里面提取的目录或创建你的IDE的项目文件。如果您需要更多的帮助与Maven入门指南这是一个很好的开始。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics