如何在没有密码的情况下使JSch API登录到Unix服务器?

时间:2011-05-10 09:10:52

标签: java ssh jsch

我正在尝试使用JSch API创建一个在远程Unix服务器上执行shell脚本的Java应用程序。

我想知道是否可以在没有密码的情况下登录服务器。如果是这样 - 怎么样?我应该在服务器上生成一对身份验证密钥,然后让应用程序从密钥文件中读取信息吗?

Java应用程序位于Windows工作站上。

4 个答案:

答案 0 :(得分:4)

由于它需要一段时间才能发挥作用,这里有一个完整的修改示例:

JSch jsch=new JSch();
Session session=jsch.getSession("my_username", "my_host", my_port);
session.setConfig("PreferredAuthentications", "publickey");
jsch.setKnownHosts("~/.ssh/known_hosts");
jsch.addIdentity("~/.ssh/id_rsa");
session.setConfig("StrictHostKeyChecking", "no");
session.connect(30000);
Channel channel=session.openChannel("shell");
channel.setInputStream(System.in);
channel.setOutputStream(System.out);
channel.connect(3*1000);

请注意您是否已将rsa或dsa密钥复制到服务器并在addIdentity行添加相应的标识 - id_rsa或id_dsa。

(cat .ssh / id_rsa.pub | ssh me @ servername'cat>> .ssh /)。

答案 1 :(得分:3)

这当然可行。看看jsch提供的examples目录。

UserAuthPubKey.java展示了如何使用公钥进行身份验证,并且KeyGen.java正在如何创建公钥和私钥。

答案 2 :(得分:3)

完成钥匙整理后,只需一行即可使用密钥而不是密码进行连接:

JSch jsch = new JSch();
jsch.addIdentity(".ssh/privateKey.pem");

addIdentity方法接受一个指向您计算机上私钥文件位置的参数。

答案 3 :(得分:1)

正如jlliagre所说,这是可能的。

为您的应用程序生成密钥对,使服务器知道公钥(通常将其置于~/.ssh/authorized_keys是一种好方法),并将give both keys作为文件提供给客户端JSch对象或者作为byte []。您可能还想更改PreferredAuthentications选项以仅允许公钥验证,以避免要求输入密码或尝试其他内容。

注意:如果您将应用程序交付给不受您控制的主机,则任何可以访问该应用程序文件的人都可以使用该私钥登录您的服务器。

因此,您应确保帐户无法执行任何有害操作,或者客户端计算机(您的帐户和任何特权计算机)位于您的(或仅限已知的友情)总控制之下。 (如果密码与程序一起分发,则使用密码加密私钥无效。也不会将其放入程序的jar文件中。)

相关问题