1

I need the functionality like that of the rsync linux tool in my Java program. For that, I chose the rsync4j library.

Using their documentation, I wrote the following program:

import com.github.fracpete.processoutput4j.output.ConsoleOutputProcessOutput;
import com.github.fracpete.rsync4j.RSync;

public class MainClass {

    public static void main(String [] args) {

        System.out.println("Started");//check

        RSync rsync = new RSync()
            .source("/home/arth/DataSourceFolder/a.txt")
            .destination("/home/arth/DataDestinationFolder/")
            .recursive(true);
            // or if you prefer using commandline options:
            // rsync.setOptions(new String[]{"-r", "/one/place/", "/other/place/"});
            CollectingProcessOutput output = null;
            try {
                    System.out.println("Inside try");
                    output = rsync.execute();
                    System.out.println("End of try");
            } catch (Exception e) {
                    e.printStackTrace();
            }
            System.out.println(output.getStdOut());
            System.out.println("Exit code: " + output.getExitCode());
            if (output.getExitCode() > 0)
                System.err.println(output.getStdErr());
      }
}

In the snippet, in out local machine, a file a.txt is copied from one location to another. This works perfectly. The file is successfully copied when I run it and here is the output:

Started

Inside try

End of try

Exit code: 0

But my need is to sync a local directory with a directory lying at a remote host/machine. When I tried to do it using a simple rsync command from a terminal using the following command

rsync remoteUserName@23.24.25.244:/home/beth/remoteFolder/a.png /home/arth/DataSourceFolder

it works like a charm. a.png IS copied to local machine at path specified, although a password of remote machine is asked first.

But the problem when I use the above Java program to do the same operation, by replacing line # 11 and 12 by:

.source("remoteUserName@23.24.25.244:/home/beth/remoteFolder/a.png")
.destination("/home/arth/DataDestinationFolder/")

the program gets stuck after printing Started in the console. Neither an exception is thrown nor does the program proceed.

The question is that how do I fix this problem?

Shy
  • 542
  • 8
  • 20

1 Answers1

1

(old post, I know, but here it goes...) The rsync4j library does not allow interaction. In your case, the underlying rysnc binary prompts for a password in the process that the Java library created, but never receives one.

Starting with release 3.2.3-7, you can supply an instance of the sshpass wrapper to feed in the password (see this comment for an example).

fracpete
  • 2,448
  • 2
  • 12
  • 17