java远程执行linux命令?

笔者之前用java写了一个远程连接执行Linux命令的工具,之前的命令都可以正常执行,最近公司搭建了一个hadoop环境,但是当我
去执行hadoop命令的时候它却告诉我说:bash: hadoop: command not found
(但是xshell工具是可以执行的),报了这个错我就在网上百度了,我按照网上说的检查了etc\profile文件,没有问题,后来我又修改了一hadoop的配置文件,最后结果还是这样的,所以我觉得是我写的代码里面可能是却什么东西,代码如下:
package com.qykj.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
/**

  • @类功能说明:
  • @类修改者:
  • @修改日期:
  • @修改说明:
  • @公司名称:青云科技
  • @作者:wxj
  • @Email:18772118541@163.com
  • @TEL:18772118541
  • @创建时间:2017-12-22 下午5:25:12
  • @版本:V1.0
    */
    public class XshellUtil {

    // 代码执行-远程shell,8
    /**

    • @方法说明:对获取的linux控制台上的数据进行解析,封装
    • @方法名称:urlCharset
    • @作者:wxj
    • @param str
    • @return
    • @创建时间:2017-12-23 下午2:48:16 */ public static List dataAnalysis(String str) { List list = new ArrayList(); String[] split = str.split("\n");//将字符串用回车符给分割成字符串数组 for (String string : split) { if (string.contains("+ ERROR: /")) {//判断是不是错误信息,如果里面包含+ ERROR: /就是错误信息 int start = string.indexOf("+ ERROR: /") + "+ ERROR: /".length(); String substring = string.substring(start, start + 1); //返回的错误信息里面有的没有任务价值的错误信息,这里我们通过判断+ ERROR: / //后面的一个字符是不是空格,如果是,那么这就是一条没用价值的,如果不是,我们就给它用一个list集合装进来,返回去 if (!substring.equals(" ")) { int end = string.indexOf("returned");//在这条错误信息的有一段是没有用的信息,我们需要把那一段给它截掉 //而它的分割点就是returned 前面的就是我们真正所需要的错误信息 substring = string.substring(start, end); if(!list.contains(substring)){ list.add(substring.trim()); } } } } return list; }

    /**

    • @方法说明:通过一个连接,用户名,密码,nikto的命令,获取这个命令在linuxdos窗口里面打印出来的东西
    • 用一个String 类型的东西返回去
    • @方法名称:getCommondMsg
    • @作者:wxj
    • @param conn
    • @param username
    • @param password
    • @param commond
    • @return
    • @throws IOException
    • @创建时间:2017-12-23 下午12:17:02
      */
      public static String getCommondMsg(Connection conn,String commond,boolean isAuthenticated) throws IOException {
      StringBuffer sb = new StringBuffer("");

      if (isAuthenticated == false)
      throw new IOException("Authentication failed.");
      // 创建一个session
      Session sess = conn.openSession();
      // 执行linux命令
      sess.execCommand(commond);
      // 建立一个输入流
      InputStream stdout = new StreamGobbler(sess.getStdout());
      // 建立一个字节流
      BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
      while (true) {
      String line = br.readLine();
      if (line == null)
      break;
      sb.append(line.trim() + "\n");
      }
      br.close();
      stdout.close();
      // 关闭session
      sess.close();
      return sb.toString();
      }

    /**

    • @方法说明:创建一个linux的连接
    • @方法名称:getLinuxConnect
    • @作者:wxj
    • @param hostname
    • @return
    • @创建时间:2017-12-23 下午2:46:26 */ public static Connection getLinuxConnect(String hostname) { Connection conn = new Connection(hostname); return conn; } }

知道问题的麻烦告知。谢谢!

很多命令都用不到,常用的也就那么几种

应该是环境变量的问题,讲白了还是profile,你应该是配置了错误的路径

赞同楼上,PATH环境变量的可能性很大,你可以尝试传参数的时候,带上完整路径-fullpath,看看是否仍旧出错,排除一下。

另外配置完记得用source /etc/profile使配置文件在当前tty立即生效

远程执行很容易出这种问题。你最好在执行命令之前code里面设置一下环境变量。

应该不是代码的问题 看下环境配置错了没

可以加上etc/bin/命令 试试

package com.qykj.util; 改成ask.csdn.net.com

使用jsch这个框架,然后远程登陆,执行shell .和你用xshell是一样的

应该是java的环境变量设的不对,可以用绝对路径的试一下,然后修改一下环境变量设置

登录到linux机器,手动运行hadoop命令,看是否存在该命令,若不存在,就是环境变量的原因了