我正在尝试使用此
从控制台运行一个简单的命令public void execute(File file, String... command){
Process p = null;
ProcessBuilder builder = new ProcessBuilder("ls");
builder.directory(file.getAbsoluteFile());
builder.redirectErrorStream(true);
try {
p = builder.start();
} catch (IOException e) {
LOGGER.error("", e);
}
}
但它一直说我不能运行ls,许可被拒绝。这里有缺失的步骤吗?
由于
答案 0 :(得分:1)
这取决于以下几点: 1)运行java的用户(您的进程将以该用户身份运行) 2)JAR或类所在的目录。
如果java用户与您登录的用户不同,请确保您的帐户具有适当的权限。
答案 1 :(得分:1)
您应该使用命令和标志分别传递给ProcessBuilder
的构造函数(根据the docs):
public void execute(File file, String... command) {
ProcessBuilder builder = new ProcessBuilder("ls", "-l");
builder.directory(file.getAbsoluteFile());
builder.redirectErrorStream(true);
try {
Process p = builder.start();
} catch (IOException e) {
LOGGER.error("", e);
}
}
但是,您似乎想要执行command
。为此,您可以将command
传递给ProcessBuilder
的构造函数。
public void execute(File file, String... command) {
ProcessBuilder builder = new ProcessBuilder(command);
builder.directory(file.getAbsoluteFile());
builder.redirectErrorStream(true);
try {
Process p = builder.start();
} catch (IOException e) {
LOGGER.error("", e);
}
}
这里是工作代码的ideone
您会注意到when I run it with "ls -l",执行命令时出现问题。这是因为第一个参数被视为要执行的命令,其余参数被视为标志。
要更改EC2实例中bash
命令的权限,请执行
chmod u+x /home/admin/ec2-api-tools-*/bin/*
答案 2 :(得分:1)
ProcessBuilder builder = new ProcessBuilder("ls -l");
没有名为" ls -l"的流程。您想使用名为" ls"使用参数" -l",为此你需要:
ProcessBuilder builder = new ProcessBuilder("ls", "-l");