I am facing problem to create a session to a remote SFTP server by JSch:
The command i use to connect the sftp server through shell is:
sftp -o BindAddress=SOME_IP_ADDRRESS myUserName@HOST_IP_ADDR
and its working fine, but when I am trying with Java (JSch) then I am getting a timeout exception. The Java code is
/* KEY_FILE_NAME = is a file with rsa public key */
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource(KEY_FILE_NAME).getFile());
JSch jsch = new JSch();
jsch.addIdentity(file.getAbsolutePath());
Properties hash = new Properties();
hash.put("StrictHostKeyChecking", "no");
logger.debug("SSh Server Host name >>" + SSH_SERVER_HOST_NAME + " || User Name >>" + SSH_SERVER_USER_NAME);
session = jsch.getSession(SSH_SERVER_USER_NAME, SSH_SERVER_HOST_NAME);
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
session.setConfig(hash);
session.setPort(22);
session.setTimeout(45000);
session.connect();
The exception I am getting is :
com.jcraft.jsch.JSchException: timeout: socket is not established
I guess its coming as I am not setting the BindAddress
with -o
option which I am using while I am using the shell command. If that is the case then how to set the -o BindAddress
parameter in JSch? Or am I doing something wrong, please suggest.
I have implemented the solution , I added the following code before calling
session.connect()
.And its creating the socket : checked the log file for >>
But now I am getting an exception :
Auth cancel
What may be the cause , The key which I have is a id_rsa.pub file, which starts with
and I have created the private key file from this file through keygen which I am using in my
session.addIdentity()
method, the format of the private key is :Am i missing something , please suggest...
I do not think there's an explicit support for selecting a network interface to connect from in JSch.
But you can implement a
SocketFactory
interface, such as that it creates aSocket
instance using the constructor overload with thelocalAddr
:(use 0 for the
localPort
)Then pass the factory to the
Session.setSocketFactory()
before calling theconnect()
and you should be good.This will allow you to bind to a specific address (and port, should to need to): https://stackoverflow.com/a/56120718/11173046