JSCH librairy with signed publickkey - java

I use a public key signed by my client to connect to SFTP. In command line all functions properly.
On the other hand via JSCH Librairy, I have a message error: "Auth fail".
My code is working correctly on another server or the public key is not signed
the jsch version used is the : 0.1.55
my connection setup looks like this
JSch jsch = new JSch();
jsch.addIdentity(sftpSetting.getPrivateKey());
session = jsch.getSession(sftpSetting.getUser(), sftpSetting.getServer(), sftpSetting.getPort());
session.setConfig("StrictHostKeyChecking", "no");
session.setConfig("PreferredAuthentications", "publickey");
session.connect(sftpSetting.getConnectionTimeout());
// Initializing a channel
Channel channel = session.openChannel("sftp");
channel.connect(sftpSetting.getConnectionTimeout());
channelSftp = (ChannelSftp) channel;

Related

Algorithm negotiation fail error while connecting to solaris server through jsch

I am trying to connect to remote sftp server over ssh with JSch (0.1.52) but during session.connect(); I am getting Algorithm negotiation fail exception:
code snippet which I tried given below:
log.info("trying to connect to ssh");
JSch.setLogger(new MyLogger());
JSch jsch = new JSch();
String host = "abcd";
int port =22;
String success;
Session session = jsch.getSession(username,host, port);
log.info("Recieved the username>>>>>>>>>>>>>"+ username);
session.setPassword(password);
log.info("Recieved the password>>>>>>>>>>>>>"+ password);
Properties config = new Properties();
config.put("kex", "curve25519-sha256,curve25519-sha256#libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256");
config.put("CheckKexes", "diffie-hellman-group-exchange-sha256");//diffie-hellman-group-exchange-sha256
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
ConfigRepository configRepository =
com.jcraft.jsch.OpenSSHConfig.parseFile("/abc/config_file.txt");
jsch.setConfigRepository(configRepository);
log.info("Establishing connection to host...");
log.info("Session.................."+session);
session.connect();
Channel channel=session.openChannel("sftp");
channel.connect();
I tried updating the jsch latest jar,jdk 1.8 in java & corrected the checkkexes & ciphers in server and client but getting the same Algorithm negotiation fail. Please provide your suggestions to resolve this error, Thank you

How to provide sftp password through Java

I am using JSCH API to invoke shell commands from java. I am trying to invoke sftp command like this :
Channel channel = (ChannelShell)getSession().openChannel("shell");
channel.connect();
PrintStream out = new PrintStream(channel.getOutputStream());
out.println("#!/bin/bash");
out.println("sftp akumar#sindh");
out.flush();
On Java console i see that it is connecting to this sindh server and then it asks for password.
Connecting to sindh...
akuamr#sindh's password:
How do i provide password to it. I tried
out.println("sftp akumar#sindh");
out.println("password123")
But this dosen't work out. Thanks in advance.
You need to set the password in the Session before connecting:
JSch jsch=new JSch();
Session session = jsch.getSession("akumar", "sindh");
session.setPort(22);
session.setPassword("password123");
session.connect();
ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
And then you can use the channel to execute sftp commands.

Using JSCH Java [duplicate]

This question already has answers here:
Skipping Kerberos authentication prompts with JSch [duplicate]
(2 answers)
Closed 7 years ago.
I am trying to use JsCH for connecting to a remote server and then manipulate PostgreSQL.
Everything going fine if I use PUTTY and also with JSCH.
My only problem is the JsCH only accepts username and password from the Eclipse console even if I set these properties.
public void connect() {
//
int assigned_port;
final int local_port=5432;
// Remote host and port
final int remote_port=5432;
final String remote_host="myserver011";
try {
JSch jsch = new JSch();
// Create SSH session. Port 22 is your SSH port which
// is open in your firewall setup.
Session session = jsch.getSession("companyusername", remote_host, 22);
session.setPassword("password");
// Additional SSH options. See your ssh_config manual for
// more options. Set options according to your requirements.
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
config.put("Compression", "yes");
config.put("ConnectionAttempts","2");
session.setConfig(config);
// Connect
session.connect();
// Create the tunnel through port forwarding.
// This is basically instructing jsch session to send
// data received from local_port in the local machine to
// remote_port of the remote_host
// assigned_port is the port assigned by jsch for use,
// it may not always be the same as
// local_port.
assigned_port = session.setPortForwardingL(local_port,
remote_host, remote_port);
System.out.println("SSH Connection succes!");
} catch (JSchException e) {
e.printStackTrace();
LOGGER.log(Level.SEVERE, e.getMessage()); return;
}
if (assigned_port == 0) {
LOGGER.log(Level.SEVERE, "Port forwarding failed !");
return;
}
}
But the console still needs the username and password.
Kerberos username [myusername]: companyusername <---- here I set again the username
Kerberos password for companyusername : password <---- and the password
SSH Connection succes!
Opened database successfully
And then everything works. But I don't want to set these again, and I cant find anywhere the source of this "bug"?! I don't know, maybe it's a server config parameter to force the user to manually give the input?
Any advice or hint would be great.
//this works pretty well for me.
Session session;
ssh = new JSch();
session = ssh.getSession(username,hostname,port);
session.setConfig(config);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking","no");
session.connect();

How to run a command requiring a password through SSH with Jsch

I am trying to use JSch to run a command on a target host, and I wish to be able to indicate a passphrase, for example: "sudo echo hello" and then enter the password for the current user.
I don't understand how to properly interact with the prompt. The code below shows two ways I tried to provide the password, they all fail with message:
sudo: no tty present and no askpass program specified
I am working with this:
JSch jsch=new JSch();
String host="192.168.0.17";
String user="xxx";
String passwd="xxx";
Session session=jsch.getSession(user, host, 22);
session.setPassword(passwd);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
ChannelExec channel=(ChannelExec)session.openChannel("exec");
channel.setCommand("sudo echo hello");
channel.setErrStream(System.err);
channel.connect();
int id = 1;
// must write on output stream?
if(id==0){
channel.getOutputStream().write(passwd.getBytes());
}
// must read on input stream?
else if(id==1){
channel.getInputStream().read(passwd.getBytes());
}
channel.disconnect();
Thanks for your suggestions!
How about trying http://www.jcraft.com/jsch/examples/Sudo.java.html ?

SSH Connection Java

Is it possible to make a ssh connection to a server with java?
Yes, I used http://sourceforge.net/projects/sshtools/ in a Java application to connect to a UNIX server over SSH, it worked quite well.
jsch and sshJ are both good clients. I'd personally use sshJ as the code is documented much more thoroughly.
jsch has widespread use, including in eclipse and apache ant. I've also had issues with jsch and AES encrypted private keys, which required re-encrypting in 3DES, but that could just be me.
Yes, it is possible. You can try the following code:
package mypackage;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.io.*;
public class SSHReadFile
{
public static void main(String args[])
{
String user = "user";
String password = "password";
String host = "yourhostname";
int port=22;
String remoteFile="/home/john/test.txt";
try
{
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
System.out.println("Establishing Connection...");
session.connect();
System.out.println("Connection established.");
System.out.println("Crating SFTP Channel.");
ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
sftpChannel.connect();
System.out.println("SFTP Channel created.");
}
catch(Exception e){System.err.print(e);}
}
}
To make connection to Java servers, you need an implementation of SSHD (ssh client is not enough). You can try Apache SSHD,
http://mina.apache.org/sshd/
Because sshd is already running on most systems, an easier alternative is to connect to the server through a SSH tunnel.

Categories

Resources