繁体   English   中英

如何在Linux中使用Java ProcessBuilder执行./filename

[英]How to use Java ProcessBuilder to execute ./filename in linux

我目前正在使用ProcessBuilder运行一些文件,如test.out。 这是我的一些代码

ArrayList cmd = new ArrayList();
cmd.add("sudo");
cmd.add("./test.out");
String s = "";
try{
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.directory(new File("/myPath"));
pb.redircErrorStream(true);
Process p = pb.start();
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferReader br = new BufferReader(isr);
String line = "";
  while((line = br.readLine()) !=null)
  {
  s+=line;
  }
System.out.println(s);
}

我输出正确的路径(“ / myPath”)。 当我删除线

`cmd.add("sudo")`

输出将给我一个字符串:

oneoflib:must be root. Did you forgot sudo?

但是一旦我添加

cmd.add( “命令”);

没有任何输出。

有人有什么问题吗?

我可以从终端正常运行sudo ./test.out。 我正在使用Eclipse BTW。 非常感谢你。

我猜想从流程中获取错误流可能有助于调试问题。

这应该有所帮助,考虑以下bash脚本,将其称为yourExecutable。 我们还假设它具有所有适当的权限:

if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi
echo "You are running as root"

在没有sudo情况下运行时,它会打印"Please run as root"否则会在屏幕上显示"You are running as root"

该命令(即列表中的第一个参数)应该是bash ,如果那是您正在使用的shell。 第一个参数应为-c以便从以下字符串读取命令。 字符串应为echo <password> | sudo -S ./yourExecutable echo <password> | sudo -S ./yourExecutable 这并不是将密码发送到sudo的最佳方法,但我认为这不是重点。 到sudo的-S将提示输入密码,该密码将写入stdout并通过管道传递到sudo。

public static void main(String[] args) throws IOException {
    Process process = new ProcessBuilder("bash", "-c", "echo <password> | sudo -S ./yourExecutable").start();

    BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    String string;
    while((string = errorReader.readLine()) != null){
        System.out.println(string);
    }

    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    while((string = reader.readLine()) != null){
        System.out.println(string);
    }
}

我的机器上的输出看起来像:

Password:
You are running as root

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM