chmod在java中的exec中不起作用

RYN*_*RYN 1 java linux file-permissions exec chmod

我正在使用以下代码更改文件权限:

Runtime.getRuntime().exec("chmod 600 '/home/user/Desktop/file'");
Run Code Online (Sandbox Code Playgroud)

但它没有效果!代码执行ls -l /home/user/Desktop/file报告之前和之后:

-rw-rw-r-- 1 evir evir 7928 Jul 31 14:54 file
Run Code Online (Sandbox Code Playgroud)

问题是什么?

And*_*yle 5

您提出的问题非常适合您的系统和环境.

所以我会回答更广泛的问题 - 并教导一个人钓鱼 - 指出你应该查看输出以确定发生了什么(或没有).

首先,您应该将Process返回的实例分配给exec变量.当它发挥作用时,"即发即忘"是很好的,但如果它不起作用,你绝对无法确定发生了什么.

第一站是调用process.waitFor()- 等待进程完成,并返回其退出代码.如果这不是零则不能正常运行; 并且根据过程,这甚至可以告诉您遇到了什么类型的错误.

如果这不足以解决您的问题,您将需要查看输出到stdout和的内容stderr.您可以通过分别调用process.getInputStream()和获取句柄来读取这些流process.getErrorStream().一旦有了这些流,只需正常读取它们中的字节.

(注意,你真的应该从这些流中读取,无论你是否打算处理数据.编写足够的输出以填充缓冲区的进程可能会阻塞,直到"另一端"(你!)有读一些它.用你的chmod例子虽然这不太可能是问题.)


现在您可以访问退出状态,stdout和stderr流 - 实际上,如果您在控制台中运行该进程,您将获得所有内容.现在剩下的就是用这些信息来解决你的具体问题......

  • 引号实际上是一个特定于shell的构造,以帮助它将命令标记为参数.Java不会像这样解析命令行,因此字面上会引用引号.使用带有字符串*array*的`exec`版本可能会更好.数组的每个元素都是一个参数(不用担心空格或转义),所以即使路径中有空格也可以,但是当前的解决方法不会. (2认同)