【问题标题】:Giving file permissions(rwx) using shell command java使用 shell 命令 java 授予文件权限(rwx)
【发布时间】:2016-10-16 15:40:04
【问题描述】:

我在 linux 中有一个 xml 文件,它最初只有读取权限。我需要更新文件内容。所以我试图通过java赋予文件权限(wx)。

代码如下:

File pomFile = new File(wsPath + "pom.xml");

logger.info("Before change: Is Execute allow : " + pomFile.canExecute());  //false
logger.info("Before change: Is Write allow : " + pomFile.canWrite());   //false
logger.info("Before change: Is Read allow : " + pomFile.canRead());   //true

String command = "sudo chmod -R ugo+wx " + wsPath + "pom.xml";
Process p = Runtime.getRuntime().exec(command);

logger.info("After change: Is Execute allow : " + pomFile.canExecute());  //false
logger.info("After change: Is Write allow : " + pomFile.canWrite());   //false
logger.info("After change: Is Read allow : " + pomFile.canRead());   //true

InputStream inputStream = getClass().getResourceAsStream("/output-pom.xml");
String packageName=AppConstants.PACKAGE_DEFAULT+"."+client+"."+projectName;
String pomContent=IOUtils.toString(inputStream);
pomContent=pomContent.replace("<groupId>PACKAGE_NAME</groupId>","<groupId>"+packageName+"</groupId>");
pomContent=pomContent.replace("PROJECT_NAME", projectName);

FileWriter writer = new FileWriter(pomFile, false);
writer.write(pomContent);
writer.close();

设置权限后,pomFile.canWrite() 和 pomFile.canExecute() 显示为 false。 FileWriter 也抛出异常。有什么办法可以解决这个问题?

java.io.FileNotFoundException: wsPath/pom.xml (Permission denied)
        at java.io.FileOutputStream.open0(Native Method) ~[na:1.8.0_45]
        at java.io.FileOutputStream.open(FileOutputStream.java:270) ~[na:1.8.0_45]
        at java.io.FileOutputStream.<init>(FileOutputStream.java:213) ~[na:1.8.0_45]
        at java.io.FileWriter.<init>(FileWriter.java:107) ~[na:1.8.0_45]
        at com.apptium.eportal.servlet.CreateProjectServlet.doPost(CreateProjectServlet.java:179) ~[classes/:na]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) [servlet-api.jar:na]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [servlet-api.jar:na]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) [catalina.jar:8.0.32]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.32]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.32]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.32]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.32]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) [catalina.jar:8.0.32]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [catalina.jar:8.0.32]
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) [catalina.jar:8.0.32]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) [catalina.jar:8.0.32]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.32]
        at ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:189) [logback-access-1.1.2.jar:na]
        at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:676) [catalina.jar:8.0.32]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.32]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) [catalina.jar:8.0.32]
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095) [tomcat-coyote.jar:8.0.32]
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) [tomcat-coyote.jar:8.0.32]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) [tomcat-coyote.jar:8.0.32]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) [tomcat-coyote.jar:8.0.32]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_45]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_45]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.32]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]

【问题讨论】:

  • 你检查p的退出码了吗?它说什么?您需要父目录的执行权限才能更改文件的权限。

标签: java file shell permissions command


【解决方案1】:

试试下面的

pomFile.setWritable(true);
pomFile.setExecutable(false);
pomFile.setReadable(false);

您也可以试试这个,因为 Java IO 类没有现成的方法

Runtime.getRuntime().exec("chmod 777 file");

如果你使用的是Java7,那么你可以使用

setPosixFilePermissions(Path path, Set perms)

// Example code 

Set<PosixFilePermission> perms = new HashSet<PosixFilePermission>();
//add owners permission
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_WRITE);
perms.add(PosixFilePermission.OWNER_EXECUTE);
//add group permissions
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_EXECUTE);
//add others permissions
perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_WRITE);
perms.add(PosixFilePermission.OTHERS_EXECUTE);

Files.setPosixFilePermissions(Paths.get(wsPath + "pom.xml"), perms);

【讨论】:

  • 或者,更简洁地说,Set&lt;PosixFilePermission&gt; perms = PosixFilePermissions.fromString("rwxrwxrwx"); 甚至是Set&lt;PosixFilePermission&gt; perms = EnumSet.allOf(PosixFilePermission.class);
猜你喜欢
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 2021-08-30
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多