やりたいこと
Java6でコンパイルした自作アプリから別マシンにSSH接続することです。
環境
接続先
- Ubuntu 16.04 LTS
- OpenSSH 7.2p2
クライアント
- Windows 8.1
- 自作アプリ
- JSch
問題概要
JSchのAPIを呼び出して別マシンへのSSH接続を実行すると、JSch内で例外が発生します。
問題詳細
今さらJava6?
と思われるかもしれませんが、使わなければいけない事情がありましたので。
JavaでSSH接続となると、JCraftのJSchライブラリが使用されることが多いようです。
Mevanリポジトリにも登録されていますし、JCraftのサイトからもダウンロードできます。
そんなわけで、早速、使用してみました。
コードはシンプルに以下のような感じです。
package sample.sshconnect;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
public class MainClass {
private static final String USER = "user_sample";
private static final String HOST = "111.222.333.444";
private static final String PASSWORD = "password_sample";
private static final int PORT = 22;
public static void main(String[] args) {
// サーバーへの接続と切断
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession(USER, HOST, PORT);
} catch (JSchException e) {
e.printStackTrace();
return;
}
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(PASSWORD);
try {
session.connect();
} catch (JSchException e) {
e.printStackTrace();
return;
}
session.disconnect();
}
}
pom.xml
ではmaven-compiler-plugin
に1.6
を指定します。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SampleSshConnect</groupId>
<artifactId>SampleSshConnect</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
</dependencies>
</project>
実行してみると、コンソールに以下のような情報が出力されます。
com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stream Read
at com.jcraft.jsch.Session.connect(Session.java:565)
at com.jcraft.jsch.Session.connect(Session.java:183)
at sample.sshconnect.MainClass.main(MainClass.java:27)
どうやら、session.connect();
の中で例外が発生しているようです。
そこで、pom.xml
を修正して、maven-compiler-plugin
に指定するバージョンを1.7
にしてみます。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SampleSshConnect</groupId>
<artifactId>SampleSshConnect</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
</dependencies>
</project>
実行してみると、コンソールには何も表示されません。
ということは、Java7でコンパイルすると正常にSSH接続が実行され、
Java6でコンパイルするとSSH接続時に例外が発生するということになります。
解決策
例外発生を回避する手段はまだ見つけられていません。
何とかならないものかと。