使用java运行linux复制和重命名命令

使用java运行linux复制和重命名命令,java,linux,Java,Linux,我正在尝试复制主文件,并希望根据用户ID重命名。代码没有显示任何错误,但我在指定的文件夹中没有看到任何文件。我尝试使用sudoroot命令,即使它没有复制和重命名文件。我应该怎么做才能从java程序中成功运行copy和rename命令 您没有读取进程的标准错误。因此,如果您的cp和mv命令报告错误,您将看不到它们 可以读取进程的标准错误,但如果使用Runtime.getRuntime.exec,则这很复杂,因为从标准错误读取与从标准输出读取需要在单独的线程中完成 Java 5引入了一个用于运行外

我正在尝试复制主文件,并希望根据用户ID重命名。代码没有显示任何错误,但我在指定的文件夹中没有看到任何文件。我尝试使用sudoroot命令,即使它没有复制和重命名文件。我应该怎么做才能从java程序中成功运行copy和rename命令

您没有读取进程的标准错误。因此,如果您的cp和mv命令报告错误,您将看不到它们

可以读取进程的标准错误,但如果使用Runtime.getRuntime.exec,则这很复杂,因为从标准错误读取与从标准输出读取需要在单独的线程中完成

Java 5引入了一个用于运行外部进程的新类:。在我看来,ProcessBuilder的一个最大优点是可以将流程的标准错误重定向到其标准输出中。这样就只剩下一个流可供读取,因此不需要单独的线程

我建议您更换Runtime.getRuntime.exec。。。以下是:

File wd = new File("/bin");
Process proc = null;
try {
    proc = Runtime.getRuntime().exec("/bin/bash", null, wd);
} catch (IOException e) {
    logger.info(e);
    e.printStackTrace();
}
if (proc != null) {
    BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
    //out.println("su - root");
    out.println("cp /usr/rock/Masterfile.xls /usr/rock/generatedfile/");
    out.println("mv /usr/rock/generatedfile/Masterfile.xls /usr/rock/generatedfile/userid.xls");

    try {
        String line;
        while ((line = in.readLine()) != null) {
            logger.info(line);
        }
        proc.waitFor();
        in.close();
        out.close();
        proc.destroy();
    } catch (Exception e) {
        logger.info(e);
        e.printStackTrace();
    }
}

如果文件没有被复制,那么cp和mv很可能报告错误。做这个改变应该希望你能看到被报告的错误。

也许你应该通过进程运行CP和mv命令,而不是把BASH放在中间。我尝试了进程进程MyPrime= RunTime.GeTrutMe.ExcCMD;但是还是一样。你把输出流刷新到bash了吗?刷新没有做任何相同的事情…02-03-2012 15:24:12[http-8080-11]INFO-UtilServices:119-cp:无法创建常规文件/usr/yash/cool/flash/MainTemplate.xls”:权限被拒绝02-03-2012 15:24:12[http-8080-11]INFO-UtilServices:119-mv:cannot stat/usr/yash/cool/flash/MainTemplate.xls':我没有收到上述错误的文件或目录。拒绝许可。如何授予权限?@user451872:我猜您运行Java代码的用户没有权限在flash目录中创建文件,或者可能没有对路径中任何目录的读取权限。由于无法使用你的机器,我真的不知道。你能试着起诉那个用户并运行cp和mv命令吗?@user451872:以root用户身份运行cp和mv????你真的在开玩笑吗?完全不必要地使用root,比如这是一个完全pwnage的配方,我当然不会帮你。另外,你没听说过吗?我有个错误苏:一定是从终端运行的。如何运行su命令。@user451872:除非从终端运行,否则不能运行su,这是出于一个很好的原因:安全性。我强烈建议您停止以root用户身份运行cp和mv命令。
    ProcessBuilder builder = new ProcessBuilder("/bin/bash");
    builder.directory(wd);
    builder.redirectErrorStream(true);
    proc = builder.start();