Make an SSH connection with a remote server using Java

Sometimes, we might need to connect to a different machine to execute a few commands or transfer files to it. This article will discuss how to connect to a remote machine/server using Java.

Note: We have also attached a video at the end of this article. In case you are more comfortable with the video version, then please feel free to have a look.

Adding dependencies

We will use the JSch library to connect to the remote server. So, we will add its dependency here –

1
2
3
4
5
6
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

Now, we will attempt to connect to a remote server. There are typically two methods for doing so –

Let’s see both of them one by one.

Making an SSH connection with Jsch using a password

So, let us see what we need to connect to a remote server. Well, there are only a few things-

  • Remote server IP
  • Remote server port ( The port on which you want to connect, say, 33000 )
  • Username
  • Password

Below is the sample code to connect with your server using the password –

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.JSchException;
 
public class Codekru {
 
    public static void main(String[] args) {
         
        try {
            JSch jsch = new JSch();
            String username = "codekru"; // your username
            String host = "127.0.0.1"; // your remote server address
            int port = 33000; // your remote server port
            String password = "root"; // your username's password
 
            Session session = jsch.getSession(username, host, port);
            session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
            session.setPassword(password);
            session.setTimeout(15000);
            session.connect();
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }
 
}

This is how you can establish an SSH connection using a password. Let’s now move on to creating a connection using a key.

Making an SSH connection using key

We will store the private key named “codekru.pem” in the “/Users/codekru/key” directory and use it to establish an SSH connection with the remote server.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.JSchException;
 
public class Codekru {
    public static void main(String[] args) {
        try {
 
            JSch jsch = new JSch();
            String user = "codekru"; // your username
            String host = "127.0.0.1"; // your remote server address
            int port = 33000; // your remote server port
            String yourKeyName = "/Users/codekru/key/codekru.pem";
              
            jsch.addIdentity(yourKeyName);
            Session session = jsch.getSession(user, host, port);
            session.setTimeout(15000);
            session.connect();
 
        } catch (JSchException e) {
            e.printStackTrace();
        }
 
    }
}

You will probably get the below error –

Exception in thread "main" java.lang.RuntimeException: com.jcraft.jsch.JSchException: UnknownHostKey: 127.0.0.1. 

This is because SSH isn’t able to validate the identity of the remote server. So, how do we fix it?

Well, there are 2 ways –

  • One is to bypass the checking of identity by setting the “StrictHostKeyChecking” value as “no” ( not recommended )
  • And second is by using the known_hosts file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.JSchException;
 
public class Codekru {
    public static void main(String[] args) {
        try {
 
            JSch jsch = new JSch();
            String user = "codekru"; // your username
            String host = "127.0.0.1"; // your remote server address
            int port = 33000; // your remote server port
            String yourKeyName = "/Users/codekru/key/codekru.pem";
              
            jsch.addIdentity(yourKeyName);
             
            Session session = jsch.getSession(user, host, port);
            session.setConfig("StrictHostKeyChecking","no");
            session.setTimeout(15000);
            session.connect();
 
        } catch (JSchException e) {
            e.printStackTrace();
        }
 
    }
}

Now, we should be able to connect with the server, but this way is not recommended. Because it poses various security concerns and is more prone to man-in-the-middle attacks. So, let’s see the other way now.

Run the below commands in your terminal –

ssh-keyscan -t rsa <Remote_Machine_IP> >> ~/.ssh/known_hosts

This command retrieves the RSA key from the remote machine and appends it to the known_hosts file.

Then, we can tell our program the path of the known_hosts file so that the server’s identity can be validated using the known_hosts file.

jSch.setKnownHosts("/.ssh/known_hosts");

Whole code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.JSchException;
 
public class Codekru {
    public static void main(String[] args) {
        try {
 
            JSch jsch = new JSch();
            String user = "codekru"; // your username
            String host = "127.0.0.1"; // your remote server address
            int port = 33000; // your remote server port
            String yourKeyName = "/Users/codekru/key/codekru.pem";
              
            jsch.addIdentity(yourKeyName);
            jSch.setKnownHosts("/.ssh/known_hosts");
 
            Session session = jsch.getSession(user, host, port);
            session.setTimeout(15000);
            session.connect();
 
        } catch (JSchException e) {
            e.printStackTrace();
        }
 
    }
}

And again, we would be able to make an SSH connection with the remote machine.

Here is the video showing how to connect to a remote machine using Java.

We will get an invalid privatekey JSchException.

com.jcraft.jsch.JSchException: invalid privatekey: [B@1b2c6ec2
	at com.jcraft.jsch.KeyPair.load(KeyPair.java:948)
	at com.jcraft.jsch.KeyPair.load(KeyPair.java:561)
	at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:40)
	at com.jcraft.jsch.JSch.addIdentity(JSch.java:406)
	at com.jcraft.jsch.JSch.addIdentity(JSch.java:366)

Here, we will get an Auth fail JSchException.

com.jcraft.jsch.JSchException: Auth fail
	at com.jcraft.jsch.Session.connect(Session.java:519)
	at com.jcraft.jsch.Session.connect(Session.java:183)
Related Articles –

I hope you liked this article. If you found anything wrong or have any doubts, please feel free to write us in the comments or mail us at admin@codekru.com.

Liked the article? Share this on

Leave a Comment

Your email address will not be published. Required fields are marked *