我将在Linux服务器上的web3j web-server(Ubuntu 16.04)上的servlet中使用Tomcat8库。
我需要从servlet中读取文件。 servlet中的代码是:
Credentials credentials = null;
String password = "secretPassword";
String pathToWalletFile = "/home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00";
File file = new File(pathToWalletFile);
try {
credentials = WalletUtils.loadCredentials(
password,
file
);
} catch (CipherException e) {
e.printStackTrace();
}
该文件具有权限:644(-rw-r - r--)Tomcat8使用' sudo apt install tomcat8'安装默认设置在Ubuntu 16.04上(用户:tomcat8)
如果我调用servlet,我会收到以下错误:
HTTP Status 500 - /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00 (Permission denied)
type Exception report
message /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00 (Permission denied)
description The server encountered an internal error that prevented it from fulfilling this request.
exception
java.io.FileNotFoundException: /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00 (Permission denied)
java.io.FileInputStream.open0(Native Method)
java.io.FileInputStream.open(FileInputStream.java:195)
java.io.FileInputStream.<init>(FileInputStream.java:138)
com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:756)
com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2740)
org.web3j.crypto.WalletUtils.loadCredentials(WalletUtils.java:76)
net.cryptonomica.tomcatweb3j.TestServlet.doGet(TestServlet.java:75)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/8.0.32 (Ubuntu) logs.
Apache Tomcat/8.0.32 (Ubuntu)
如果我把文件放在WEB-INF中,它就可以了。如何允许在tomcat(或jetty)中访问WEB-INF外的文件?
UPD: 用户tomcat8可以读取/home/ubuntu/.ethereum/,但无法读取/home/ubuntu/.ethereum/testnet/目录
$ sudo -u tomcat8 ls /home/ubuntu/.ethereum/testnet/
返回:
ls: cannot access '/home/ubuntu/.ethereum/testnet/': Permission denied
即使我添加&#39; tomcat8&#39;用户来自&ubuntu&#39;小组
$members ubuntu
现在返回:
ubuntu tomcat8
和
$ ls -l /home/ubuntu/.ethereum/testnet/
返回:
total 8
drwxr--r-- 5 ubuntu ubuntu 4096 Jun 17 17:33 geth
srw------- 1 ubuntu ubuntu 0 Jun 18 14:08 geth.ipc
drwxr--r-- 2 ubuntu ubuntu 4096 Jun 18 03:11 keystore
但tomcat8仍然无法读取/home/ubuntu/.ethereum/testnet/
将文件移动到另一个目录(用户&#39; tomcat8&#39;有权访问)解决了问题。但我仍然不明白问题出在哪里。一般来说,我希望能够从servlet对文件/home/ubuntu/.ethereum/testnet/进行读取访问
答案 0 :(得分:1)
检查路径中所有目录的权限。
特别检查/home/ubuntu/
尝试此操作以检查文件是否可读。
File f = new File("/home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00");
if (f.canRead()) {
System.out.println("is Readable");
}
答案 1 :(得分:1)
这是一个基本的许可问题。
看起来好像这个文件位于ubuntu
用户的主目录下。在这种情况下更改权限是一个坏主意。更好的选择是将这些文件的存储移到任何特定用户的主目录之外,或者更好的是,将它们移动到tomcat用户的主目录(如果该目录仅用于您管理的事物。服务器)
否则,您需要做的是找出运行tomcat进程的用户,然后相应地授予权限:
sudo chown tomcat:tomcat /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00
#OR
sudo chmod a+r /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00
#OR grant folder access if files are dynamically generated
sudo chmod -R a+r /home/ubuntu/.ethereum/testnet/keystore/
上面的代码假设运行tomcat的用户名为tomcat
。