代码之家  ›  专栏  ›  技术社区  ›  Tukaram Bhosale

在UNIX上工作但不从Java代码工作的SUDO命令

  •  0
  • Tukaram Bhosale  · 技术社区  · 7 年前

    我在unix sudo命令下运行,它在那里工作得很好。
    苏多-U XFBCFT-I
    问题是,当我尝试同样的Java进程生成器的东西时,我在UNIX上得到了许可被拒绝的异常。

    public class Test {
    public static void main(String args[]){
        System.out.println("Going to execute:");
        runUnixComand();
    }
    
    private static void runUnixComand() {
        Process p;
        StringBuffer output = new StringBuffer();
    
        try {
            String [] cmdArray ={"sudo -u xfbcft -i ","cftping -v","exit"};
    
            ProcessBuilder builder = new ProcessBuilder(cmdArray);
            builder.redirectErrorStream(true);
            //builder.redirectOutput();
            Process process = builder.start();
            InputStream is = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    
            String line = null;
            while ((line = reader.readLine()) != null) {
                System.out.println("op:"+line);
            }
        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }
    }}
    

    下面是我在Unix终端上得到的异常行。

    java.io.IOException: Cannot run program "sudo -u xfbcft -i ": error=13, Permission denied
    java.io.IOException: Cannot run program "sudo -u xfbcft -i ": error=13, Permission denied
            at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
            at JdbcTest.runUnixComand(JdbcTest.java:23)
            at JdbcTest.main(JdbcTest.java:8)
    Caused by: java.io.IOException: error=13, Permission denied
            at java.lang.UNIXProcess.forkAndExec(Native Method)
            at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
            at java.lang.ProcessImpl.start(ProcessImpl.java:134)
            at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    

    注意:我在sudoers文件中有一些条目,在Unix上个别命令运行良好。此外,用户运行此Java程序和个别命令是相同的。请指导。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Tukaram Bhosale    7 年前

    我把我的代码改了如下,它很有魅力。

    ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", "sudo -H -u xfbcft -i");
                builder.redirectErrorStream(true);
    

    所以重要的是从bin/sh执行它