gpt4 book ai didi

java - 如何在java中运行shell脚本.sh文件

转载 作者:太空宇宙 更新时间:2023-11-04 06:04:02 25 4
gpt4 key购买 nike

目标

我编写了一个简单的 java 程序,我想在其中重命名一个文件,然后只是想运行我的 permission.sh 文件。

问题陈述

我的文件名已成功更改,但permission.sh 文件未执行,这是怎么回事。卡住了需要帮助!

以下是我的代码。

package nl.ggmd.file.Permission;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.synapse.MessageContext;
import org.apache.synapse.mediators.AbstractMediator;

public class FilePermission extends AbstractMediator
{

public boolean mediate(MessageContext context) {
try {
File oldfile =new File("/ggmd/files/uploads/FIle contract1.csv");
File newfile =new File("/ggmd/files/uploads/contract1.csv");

if(oldfile.renameTo(newfile)){
System.out.println("Rename succesful");
}else{
System.out.println("Rename failed");
}


Process proc = Runtime.getRuntime().exec("/opt/file/contracts/tst/permissions.sh");
BufferedReader read = new BufferedReader(new InputStreamReader(
proc.getInputStream()));
try {
proc.waitFor();
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
while (read.ready()) {
System.out.println(read.readLine());
}
} catch (IOException e) {
System.out.println(e.getMessage());
}


return true;
}
}

编辑

此 java 代码是 WSO2 ESB 的自定义类中介器,并且 wso2 不显示 java 中介器的日志,因此我无法调试该问题。

以下是我的permission.sh代码。

#!/bin/bash
cd /ggmd/files/uploads/
file=contract1.csv

if [ ! -a $file ]
then
sudo chmod 664 $file && echo "The file is now writable"
else
echo "The file is already writable"
fi

最佳答案

建议使用 Process Builder 。它确实是为此类任务而构建的。

您的程序 permissions.sh 不是 Java 理解的可执行文件,即使操作系统将其理解为可执行文件。

您需要通知 Java 需要 bash shell(或其他一些 shell)来执行您的命令。例如。/bin/bash 是可以运行或执行脚本的程序的路径。话虽如此,您可以按照下面的代码片段来修复它,使其正常工作。

public class FilePermission extends AbstractMediator
{

public boolean mediate(MessageContext context) {
try {
File oldfile =new File("/ggmd/files/uploads/FIle contract1.csv");
File newfile =new File("/ggmd/files/uploads/contract1.csv");

if(oldfile.renameTo(newfile)){
System.out.println("Rename succesful");
}else{
System.out.println("Rename failed");
}

private final String commandPath = "/bin/bash";

private final String scriptPath = "/opt/file/contracts/tst/permissions.sh";


try {
Process execCommand = new ProcessBuilder(commandPath, scriptPath).start();
execCommand.waitFor();
} catch (IOException e) {
// handle exceptions
System.out.println(e.getMessage());
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}


return true;
}
}

请注意,上述代码可能需要一些修改,特别是如果您的脚本(permissions.sh)可能依赖于当前工作目录。上面使用的是java代码的工作目录。

但可以通过调用进程对象上的directory(文件目录)方法来更改。然后将新的工作目录路径传递给它。在这种情况下

Process execCommand = new ProcessBuilder(commandPath, scriptPath).directory(new File("/some/directory/to/be/used/")).start();

您还可以根据需要调用 execCommand.getErrorStream();execCommand.getInputStream();

关于java - 如何在java中运行shell脚本.sh文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49065069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com