使用jcabi-ssh在java中操作ssh命令

使用jcabi-ssh在java中操作ssh命令

如果我们想在java代码中远程连接ssh,并且执行一些shell命令,可以使用jcabi-ssh这个小框架,纯java编写,很方便。这里介绍一下如何使用。

依赖

java框架,依赖的包肯定是jar文件了,jar包地址http://repo1.maven.org/maven2/com/jcabi/jcabi-ssh/1.1/jcabi-ssh-1.1.jar,如果使用maven管理,可以添加依赖:

    <dependency>
        <groupId>com.jcabi</groupId>
        <artifactId>jcabi-ssh</artifactId>
        <version>1.1</version>
    </dependency>

2.0版本,作者没有正式发布

    <repositories>
        <repository>
            <id>oss.sonatype.org</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>com.jcabi</groupId>
            <artifactId>jcabi-ssh</artifactId>
            <version>2.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

代码示例

代码很简单,示例如下:

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

注意,私钥是本机的私钥串,linux的话在/home/yourname/.ssh中的id_rsa文件中,将里面的内容全部copy到方法中,包括—–BEGIN RSA PRIVATE KEY—–,—–END RSA PRIVATE KEY—–这两行。

想实现本机私钥登录,还得把本机的公钥复制到目标机器上,公钥在.ssh文件夹中的id_rsa.pub文件中,将里面的文本全部复制到目标机器/home/yourname/.ssh/authorized_keys文件中,这样就可以实现本机免密码ssh登录目标机器。

下面是个更复杂的场景,使用ssh上传一个文件到服务器,然后grep其中的内容来显示。

    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 'hello' d.txt",
        new FileInputStream(file),
        Logger.stream(Level.INFO, this),
        Logger.stream(Level.WARNING, this)
    );

SSH这个类实现了Shell接口,这个接口其实就一个方法exec,exec方法接收四个参数:

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

Shell.Safe

Shell.Safe对原生的Shell对象做了一些封装,如果exec方法返回值不是0,就会抛出异常。根据返回值可以确认shell命令是否成功执行。

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

Shell.Verbose

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.Plain

Shell.Plain也是封装了Shell,并且重写了exec方法,它只接受一个参数(要执行的shell命令),并且它不返回shell命令的执行结果(0或者其他),而是将stdout输出出来。当我们想查看某条命令的输出内容时,Shell.Plain就很方便了。当然也可以组合使用:

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

当然还有其他的开源框架,之前在淘测试中看到淘宝自己封装了Orion-ssh2形成自己的工具,叫RCT,它支持用户名、密码登陆。具体http://www.taobaotest.com/blogs/2542.

发表评论

电子邮件地址不会被公开。 必填项已用*标注

(Spamcheck Enabled)