使用Java processBuilder运行sudo命令

使用Java processBuilder运行sudo命令,java,java-8,iptables,processbuilder,Java,Java 8,Iptables,Processbuilder,我需要在java中运行sudo命令,并使用processbuilder或类似工具将输出重定向到文件 两个问题: 使用echo设置sudo密码是否可以按如下方式工作 尽管创建了该文件,但从未向其写入任何内容。你知道为什么吗 ProcessBuilder conntrack_process = new ProcessBuilder("/bin/bash", "-c", "echo '<passwordhere>' | sudo conntrack -L"); conntrack_proc

我需要在java中运行sudo命令,并使用processbuilder或类似工具将输出重定向到文件

两个问题:

  • 使用echo设置sudo密码是否可以按如下方式工作
  • 尽管创建了该文件,但从未向其写入任何内容。你知道为什么吗

    ProcessBuilder conntrack_process = new ProcessBuilder("/bin/bash", "-c", "echo '<passwordhere>' | sudo conntrack -L");
    conntrack_process.redirectOutput(new java.io.File("/home/<homedir>/conntrack_out.txt"));
    Process ct_process = conntrack_process.start();
    ct_process.waitFor();
    ct_process.destroy();
    
    ProcessBuilder conntrack\u process=newprocessbuilder(“/bin/bash”、“-c”、“echo”| sudo conntrack-L”);
    重定向输出(新的java.io.File(“/home//conntrack\u out.txt”);
    Process ct_Process=conntrack_Process.start();
    ct_进程。waitFor();
    ct_process.destroy();
    

  • 我正在使用Ubuntu 16.04。

    首先,您需要将
    -S
    sudo
    一起使用,以使其从其stdin读取密码。

    第二,您应该读取或重定向错误流到某个地方,以了解任何错误。

    旧问题,但您应该设置sudoers文件,只允许该命令,而不允许该用户使用密码

    myusername ALL=(root)NOPASSWD:/path/to/my/program


    从某个.sh文件运行java并使用setuid位并将root作为文件所有者,可以解决您的任务吗?只是问一下,因为你不需要为sudo操心。谢谢,我愿意接受Roman的回答,但是根据文档没有复选标记:“点击答案旁边的复选标记”。你知道为什么吗?那是因为这是一个评论,不是答案。现在我添加了一个答案。虽然通过
    echo
    进行管道传输可能会起作用,但强烈建议不要这样做,因为其他进程可以在进程运行时看到命令行,从而看到密码。由于Java
    进程
    API已经为您提供了一个管道,因此无需创建另一个管道。只需将
    sudo
    作为子进程运行,并使用
    process.getInput()。写入(/*密码为字节加\n*/)
    。@the.Legend-Setuid根脚本非常危险。