37

How can I connect to an SSH server in Java? I don't need/want a shell. I just want to connect to the SSH server and get the content of, say, file.txt. How can I do that?

2
  • Java doesn't support that natively, but you can use a library like JSch to do it Commented Jun 18, 2010 at 17:21
  • Maybe my solution would be useful - stackoverflow.com/a/59289769/4567218 Commented Dec 11, 2019 at 16:07

3 Answers 3

51

Use JSch

import com.jcraft.jsch.*;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 * @author World
 */
public class SSHReadFile {

    public static void main(String args[]) {
        String user = "john";
        String password = "mypassword";
        String host = "192.168.100.23";
        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.");

            InputStream inputStream = sftpChannel.get(remoteFile);

            try (Scanner scanner = new Scanner(new InputStreamReader(inputStream))) {
                while (scanner.hasNextLine()) {
                    String line = scanner.nextLine();
                    System.out.println(line);
                }
            }
        } catch (JSchException | SftpException e) {
            e.printStackTrace();
        }
    }
}

output:

Establishing Connection...
Connection established.
Crating SFTP Channel.
SFTP Channel created.
This is content from file /home/john/test.txt
Sign up to request clarification or add additional context in comments.

3 Comments

Great answer worked for me but just make sure to close everything you open. session.disconnect and sftpChannel.quit .
When invoking the constructor the following exception is thrown: GRAVE: JSF1073: se ha interceptado javax.faces.event.AbortProcessingException durante el procesamiento de INVOKE_APPLICATION 5 : UIComponent-ClientId=tipoMovimientoGrid:j_idt15, Mensaje=java.lang.ClassCircularityError: com/jcraft/jsch/JSchException java.lang.ClassCircularityError: com/jcraft/jsch/JSchException at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:178)
getting the error while trying to connect windows server: com.jcraft.jsch.JSchException: java.net.ConnectException: Connection refused: connect
-2

Not 100% sure but I believe that the sockets have a great deal to do with ssh connections unless you are attempting to do a pre-installed command manipulation application. There are numerous outside packages that you can use to achieve this goal, but if you want to do your own socket creation, it's going to take a large amount of reading and deciphering/encrypting to get this done.

Also creating your own socket is dangerous if not done correctly with the right protocols and security specifications, so be wary about doing so until you are 100% sure you're capable of committing to learning enough.

5 Comments

I don't see how this answers the question.
Late reply, but this comment helps with why not use something other than ssh, for server security...it's easier than getting into trouble for something as easy as sharing a file via an API, and/or cdn. The ssh route is a very specific protocol that requires validation/verification/credentials sharing, and has a footprint when being connected to.
"for server security" The first "S" in SSH literary stands for "secure".
"and has a footprint when being connected to." I don't see how that is relevant.
OP asked how to get a file via SSH and didn't ask for opinion on alternatives.
-4

I used this and worked for me

ChannelExec channel=(ChannelExec)session.openChannel("exec");
String command = "Your Command here";
channel.setCommand(command);

InputStream in=channel.getInputStream();
channel.setErrStream(System.err);
channel.connect();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.