简单的Java SSH客户端

可以使用jcabi-ssh在Java中通过几行代码通过SSH执行shell命令:

String hello = new Shell.Plain(
  new SSH(
    "ssh.example.com", 22,
    "yegor", "-----BEGIN RSA PRIVATE KEY-----..."
  )
).exec("echo 'Hello, world!'");

jcabi-sshJSch的便捷包装, JSch是SSH2的著名纯Java实现。

这是一个更复杂的场景,其中我通过SSH上传文件,然后读回其grepped的内容:

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)
);

实现接口Shell SSH类只有一种方法exec 。 此方法接受四个参数:

interface Shell {
  int exec(
    String cmd, InputStream stdin,
    OutputStream stdout, OutputStream stderr
  );
}

我认为这些论点是显而易见的。

还有一些方便的修饰器,使使用简单命令更容易操作。

壳牌安全

Shell.Safe装饰Shell一个实例,并且如果exec退出代码不等于零,则引发异常。 当您要确保命令成功执行但又不想在代码的很多地方重复if/throw不重复时,这可能非常有用。

Shell ssh = new Shell.Safe(
  new SSH(
    "ssh.example.com", 22,
    "yegor", "-----BEGIN RSA PRIVATE KEY-----..."
  )
);

壳牌

Shell.Verbose装饰Shell一个实例,并将stdoutstderr复制到slf4j日志记录工具(使用jcabi-log )。 当然,您可以组合装饰器,例如:

Shell ssh = new Shell.Verbose(
  new Shell.Safe(
    new SSH(
      "ssh.example.com", 22,
      "yegor", "-----BEGIN RSA PRIVATE KEY-----..."
    )
  )
);

壳牌

Shell.PlainShell的包装,它引入了一个仅具有一个参数(执行命令)的新exec方法。 它还不返回退出代码,而是返回stdout 。 当您想执行一个简单命令并仅获取其输出时,这应该非常方便(为了安全Shell.Safe ,我将其与Shell.Safe结合使用):

String login = new Shell.Plain(new Shell.Safe(ssh)).exec("whoami");

下载

您在Maven项目中需要一个依赖项jcabi-ssh.jar (在Maven Central中获取最新版本):

<dependency>
  <groupId>com.jcabi</groupId>
  <artifactId>jcabi-ssh</artifactId>
</dependency>
  • 该项目在Github中 。 如果您有任何问题,只需提交一个问题。 我会尽力的。

相关文章

您可能还会发现以下有趣的帖子:

翻译自: https://www.javacodegeeks.com/2014/09/simple-java-ssh-client.html