如何使用 Java ProcessBuilder 在 linux 中执行 ./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");
没有任何输出。
有没有人有什么问题?
我可以 运行 sudo ./test.out 从终端运行正常。
我正在使用日食顺便说一句。
非常感谢。
我想从进程中获取错误流可能有助于调试问题。
这应该有所帮助,请考虑以下 bash 脚本,我们将其称为您的可执行文件。我们还假设它具有所有适当的权限:
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
。这并不是将密码发送到 sudo 的最佳方式,但我认为这不是重点。 -S
到 sudo 将提示输入密码,该密码已写入标准输出并通过管道传输到 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
我目前正在使用 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");
没有任何输出。
有没有人有什么问题?
我可以 运行 sudo ./test.out 从终端运行正常。 我正在使用日食顺便说一句。 非常感谢。
我想从进程中获取错误流可能有助于调试问题。
这应该有所帮助,请考虑以下 bash 脚本,我们将其称为您的可执行文件。我们还假设它具有所有适当的权限:
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
。这并不是将密码发送到 sudo 的最佳方式,但我认为这不是重点。 -S
到 sudo 将提示输入密码,该密码已写入标准输出并通过管道传输到 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