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:
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 a Socket
instance using the constructor overload with the localAddr:
public Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
(use 0 for the localPort
)
Then pass the factory to the Session.setSocketFactory() before calling the connect()
and you should be good.
I have implemented the solution , I added the following code before calling session.connect()
.
session.setSocketFactory(new SocketFactory()
{
InputStream in = null;
OutputStream out = null;
public InputStream getInputStream(Socket socket) throws IOException
{
if (in == null)
in = socket.getInputStream();
return in;
}
public OutputStream getOutputStream(Socket socket) throws IOException
{
if (out == null)
out = socket.getOutputStream();
return out;
}
public Socket createSocket(String host, int port) throws IOException, UnknownHostException
{
// The IP Addresses are changed ....
// using the original IP in my code
byte[] remoteIpAddr = new byte[] { (byte) 11,(byte) 11, 11, 11 };
byte[] localIpAddr = new byte[] { 55, 55, 55, 55 };
InetAddress remoteIp = InetAddress.getByAddress(remoteIpAddr);
InetAddress localIp = InetAddress.getByAddress(localIpAddr);
logger.debug("remoteIp >>" + remoteIp.toString());
logger.debug("localIp >>" + localIp.toString());
Socket socket = new Socket(remoteIp, 22, localIp, 0);
logger.debug("socket created >> " + socket.toString());
return socket;
}
});
And its creating the socket : checked the log file for >>
logger.debug("socket created >> " + socket.toString());
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
ssh-rsa AXTYU....
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 :
-----BEGIN RSA PRIVATE KEY-----
KIOPU.....
-----END RSA PRIVATE KEY-----
Am i missing something , please suggest...
This will allow you to bind to a specific address (and port, should to need to): https://stackoverflow.com/a/56120718/11173046