Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

jcabi-ssh: The Simplest Java SSH Client

DZone's Guide to

jcabi-ssh: The Simplest Java SSH Client

· IoT Zone
Free Resource

Discover why Bluetooth mesh is the next evolution of IoT solutions. Download the mesh overview.

A few of the applications I was working on recently, had to connect to server nodes via SSH. I've spent some time to understand how this connection should work and decided to turn my knowledge into an open source library. Now, an execution of a shell command via SSH can be done in  Java, in just a few lines, using  jcabi-ssh :
String hello = new Shell.Plain(
  new SSH(
    "ssh.example.com", 22,
    "yegor", "-----BEGIN RSA PRIVATE KEY-----..."
  )
).exec("echo 'Hello, world!'");
jcabi-ssh is  a convenient wrapper of  JSch a well-known pure Java implementation of SSH2.  Here is a more complex scenario, where I upload a file via SSH  and then read back its grepped content:
Shell shell = new SSH(
  "ssh.example.com", 22,
  "yegor", "-----BEGIN RSA PRIVATE KEY-----..."
);
File file = new File("/tmp/data.txt");
new Shell.Safe(shell).exec(
  "cat > d.txt && grep 'some text' d.txt",
  new FileInputStream(file),
  Logger.stream(Level.INFO, this),
  Logger.stream(Level.WARNING, this)
);
Class SSH, which implements interface Shell, has only one method, exec().  This method accepts four arguments:
interface Shell {
  int exec(
    String cmd, InputStream stdin,
    OutputStream stdout, OutputStream stderr
  );
}
I think it's obvious what these arguments are about.  There are also a few convenient decorators that make it easier to operate with  simple commands.
Shell.Safe decorates an instance of Shell and throws an exception  if the exec() exit code is not equal to zero. This may be very useful when  you want to make sure that your command executed successfully, but don't  want to duplicate if/throw in many places of your code.
Shell ssh = new Shell.Safe(
  new SSH(
    "ssh.example.com", 22,
    "yegor", "-----BEGIN RSA PRIVATE KEY-----..."
  )
);
Shell.Verbose decorates an instance of `Shell` and copies  stdout and stderr to the slf4j logging facility (using  jcabi-log ). Of course, you can combine  decorators, for example:
Shell ssh = new Shell.Verbose(
  new Shell.Safe(
    new SSH(
      "ssh.example.com", 22,
      "yegor", "-----BEGIN RSA PRIVATE KEY-----..."
    )
  )
);
Shell.Plain is a wrapper of Shell that introduces a new exec() method  with only one argument, a command to execute. It also doesn't return an  exit code, but stdout instead. This should be very convenient when you want  to execute a simple command and just get its output  (I'm combining it with Shell.Safe for safety):
String login = new Shell.Plain(new Shell.Safe(ssh)).exec("whoami");
The project is in  Github  If you have any problems, just submit an issue. I'll try to help. Originally, the library was announced on my blog in this article:  Simple Java SSH Client .

Take a deep dive into Bluetooth mesh. Read the tech overview and discover new IoT innovations.

Topics:

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}