Netbeans 7.2を使用してJDK 1.7およびWindows 7を実行しています。PuTTY-keygenを使用してSSH秘密鍵と公開鍵のペア(SSH2-2048ビット)を生成しました。秘密鍵のパスワードがありません。 SFTPを使用してホストマシンの1つに接続しようとしています。しかし、秘密鍵(ppk)を渡してIdentityを設定すると、コードが無効な秘密鍵エラーを返します。 WinSCPで同じ秘密鍵を使用して同じホストに接続しましたが、正常に動作しています。エラーの解決にご協力ください。これが私のコードです:
JSch jsch = new JSch();
Session session = null;
try {
jsch.addIdentity("D:\\TEMP\\key.ppk");
session = jsch.getSession("tiabscp", "ssiw.support.qvalent.com", 22);
session.setConfig("StrictHostKeyChecking", "no");
//session.setPassword("");
session.connect();
Channel channel = session.openChannel("sftp");
System.out.println("Getting connected");
channel.connect();
System.out.println("connected successfully");
ChannelSftp sftpChannel = (ChannelSftp) channel;
sftpChannel.get("remotefile.txt", "localfile.txt");
sftpChannel.exit();
session.disconnect();
}catch (JSchException e) {
e.printStackTrace();
}catch (SftpException e) {
e.printStackTrace();
}
あなたの鍵はOpenSSH鍵ファイル形式ではないと思います。 JSchは、秘密鍵がOpenSSH形式であることを想定しています。
PuTTYgenを使用して、OpenSSHで動作するように秘密鍵を変換することができます ここ :
おそらくあなたのための解決策ではないかもしれませんが、私が問題を検索したときに私はこの質問を見つけました。
JSCHが秘密鍵ファイルを期待していたときに、誤って公開鍵ファイルへのパスを指定してしまいました。
次のサンプルコードが役立つ場合があります。
package ssh.control;
import Java.io.BufferedReader;
import Java.io.ByteArrayOutputStream;
import Java.io.InputStreamReader;
import Java.util.ArrayList;
import Java.util.List;
import Java.util.Properties;
import Android.util.Log;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class SSHConnections {
static String user="";
static String pass="";
static String ip="";
static Session session;
public static ChannelExec getChannelExec() throws Exception{
//System.out.println("connected");
//This class serves as a central configuration point, and as a factory for Session objects configured with these settings.
JSch jsch = new JSch();
//A Session represents a connection to a SSH server.
session = jsch.getSession(user, ip, 22);
//getSession() :- the session to which this channel belongs.
session.setPassword(pass);
// Avoid asking for key confirmation
//http://docs.Oracle.com/javase/1.4.2/docs/api/Java/util/Properties.html
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
//Sets multiple default configuration options at once.
session.setConfig(prop);
session.connect();
if(session.isConnected()) {
System.out.println("connected");
}
// SSH Channel
//Opens a new channel of some type over this connection.
ChannelExec channelssh = (ChannelExec) session.openChannel("exec");
return channelssh;
}
public static String[] executeRemoteCommand(String command) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ChannelExec channelssh = SSHConnections.getChannelExec();
channelssh.setOutputStream(baos);
// Execute command
channelssh.setCommand(command);//gedit tt
InputStreamReader isr = new InputStreamReader(channelssh.getInputStream());
BufferedReader bufred = new BufferedReader(isr);
channelssh.connect();
String s = bufred.readLine();
List<String> lines = new ArrayList<String>();
int count = 0;
while( s!=null ) {
//System.out.println(s);
lines.add(count,s);
// filesandfolders[count]=s;
// System.out.println(filesandfolders[count]);
s = bufred.readLine();
count++;
}
String filesandfolders[] = new String[count];
for(int i = 0; i<count;i++) {
filesandfolders[i] = lines.get(i);
Log.d("filesandfolders[i]", filesandfolders[i]);
}
//for(int j=0;j<filesandfolders.length;j++) {
//System.out.println(filesandfolders[j]);
//}
//System.out.println("lines is "+lines.get(0));
//int a;
//while((a = isr.read()) != -1)
//System.out.print((char)a);
//channelssh.disconnect();
//return baos.toString();
return filesandfolders;
}
public static List<String> executeRemoteCommand1(String command) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ChannelExec channelssh=SSHConnections.getChannelExec();
channelssh.setOutputStream(baos);
// Execute command
channelssh.setCommand(command);//gedit tt
InputStreamReader isr = new InputStreamReader(channelssh.getInputStream());
BufferedReader bufred = new BufferedReader(isr);
channelssh.connect();
String s = bufred.readLine();
List<String> lines = new ArrayList<String>();
int count=0;
while(s != null) {
//System.out.println(s);
lines.add(count, s);
// filesandfolders[count] = s;
// System.out.println(filesandfolders[count]);
s = bufred.readLine();
count++;
}
String filesandfolders[] = new String[count];
for(int i=0; i<count;i++) {
filesandfolders[i]=lines.get(i);
}
//for(int j=0;j<filesandfolders.length;j++) {
//System.out.println(filesandfolders[j]);
//}
//System.out.println("lines is "+lines.get(0));
//int a;
//while((a = isr.read()) != -1)
//System.out.print((char)a);
//channelssh.disconnect();
//return baos.toString();
return lines;
}
}
ディレクトリを作成するには:
SSHConnections.user = "username";
SSHConnections.ip = "192.168.1.102";
SSHConnections.pass = "mypassword";
ChannelExec channelssh = SSHConnections.getChannelExec();
String dirname = "sampledirectory";
try {
String[] str = SSHConnections.executeRemoteCommand("mkdir "+dirname);
} catch (Exception e) {
e.printStackTrace();
}
PEMWriterを使用して、秘密鍵をJSchで受け入れられるPEM形式に変換できます。
次の例は、Java KeyStore(JKS)から返されたキーを変換します
Key privateKey = KeyStore.getKey(privateKeyAlias, keyStorePassword);//get key from JKS
StringWriter stringWriter = new StringWriter();
PEMWriter pemWriter = new PEMWriter(stringWriter);
pemWriter.writeObject(privateKey);
pemWriter.close();
byte[] privateKeyPEM = stringWriter.toString().getBytes();