java调用linux命令(避坑)

idea调用linux命令

实现

有一个小功能的需求,需要用idea调用datax的python脚本,执行数据的迁移。

maven依赖

<dependency>
	<groupId>ch.ethz.ganymed</groupId>
    <artifactId>ganymed-ssh2</artifactId>
    <version>262</version>
</dependency>

实现代码:


import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * java 远程执行linux命令
 */
public class JavaExecLinuxCommandRemote {
    public static void main(String[] args) throws IOException {
        String remoteCommand = "python /opt/module/datax/bin/datax.py /opt/module/datax/job/mysql2hdfs.json";
        RemoteSubmitCommand(remoteCommand);

    }

    /**
     * 远程执行 linux 命令
     */
    private static void RemoteSubmitCommand(String command) {
        // 设置主机IP地址
        Connection c = new Connection("hadoop102");
        Session ssh = null;
        StringBuilder buffer = new StringBuilder();
        try {
            c.connect();
            // 设置登录名称和登录密码
            boolean flag = c.authenticateWithPassword("root", "root");
            if(!flag){
                System.out.println("用户名或密码不正确!!!");
            }else{
                System.out.println("已经连接,ok!!!");
                ssh = c.openSession();
                ssh.execCommand(command);

                InputStream is = new StreamGobbler(ssh.getStdout());
                BufferedReader brs = new BufferedReader(new InputStreamReader(is));
                while(true){
                    String line = brs.readLine();
                    if(line==null){
                        break;
                    }
                    System.out.println(line);
                }
            }
            ssh.close();
            c.close();
            System.out.println("end");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

最后数据能够给正常的打印,

"C:\Program Files\Java\jdk1.8.0_331\bin\java.exe" "-javaagent:D:\1_software\JetBrains\IntelliJ IDEA                | 1                  | 1                  | 0.010s             | 0.010s             | 0.010s         
start 
...

2022-07-01 16:53:22.535 [job-0] INFO  JobContainer - PerfTrace not enable!
2022-07-01 16:53:22.535 [job-0] INFO  StandAloneJobContainerCommunicator - Total 3 records, 30 bytes | Speed 3B/s, 0 records/s | Error 0 records, 0 bytes |  All Task WaitWriterTime 0.000s |  All Task WaitReaderTime 0.000s | Percentage 100.00%
2022-07-01 16:53:22.538 [job-0] INFO  JobContainer - 
任务启动时刻                    : 2022-07-01 16:53:09
任务结束时刻                    : 2022-07-01 16:53:22
任务总计耗时                    :                 12s
任务平均流量                    :                3B/s
记录写入速度                    :              0rec/s
读出记录总数                    :                   3
读写失败总数                    :                   0

end

踩坑点

这里重要的不是方法的实现,网上有很多方法。而是在这个过程中踩了一个坑,浪费了很多时间,所以才写下来,最开始的使用连接服务器的使用的是非root账目,

// 设置登录名称和登录密码
boolean flag = c.authenticateWithPassword("hadoop", "root");

也就是这里,采用非root账户的时候,idea的控制台没有输出,而且我的python脚本没有执行结果,这个问题导致我搞了1天多,我丢,好浪费时间,所以大家在调用的时候注意一下这里,我猜测是非root账户的一些权限问题,但没有去深究。有知道的小伙伴也可以说一下,就这样吧。

posted @   一闪而过的不同  阅读(1347)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示