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账户的一些权限问题,但没有去深究。有知道的小伙伴也可以说一下,就这样吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)