我正在尝试创建一个Apache httpd模块。我在读取文件时遇到麻烦,每当尝试读取文件时,都会收到“没有这样的文件或目录”错误消息。在某些情况下,我可以读取文件,例如可以读取/ etc / passwd文件。我认为可能会有一些chroot发生,但是我不确定。是否有一种方法可以从文件系统读取任何文件。 下面是我的钩子函数:
static int subscription_cookie_check_auth(request_rec *r)
{
r->user = "user";
int result;
unsigned char key[MAX_KEY_LEN] = { 0 };
apr_status_t rv;
apr_file_t* key_fd = NULL;
rv = apr_file_open(&key_fd, pubkey_file, APR_FOPEN_READ, APR_FPROT_OS_DEFAULT, r->pool);
if(rv!=APR_SUCCESS){
char error_buf[50];
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(55503)
"Unable to open the file %s: %s", pubkey_file, apr_strerror(rv, error_buf, 50));
return HTTP_MOVED_TEMPORARILY;
}
apr_size_t key_len;
rv = apr_file_read_full(key_fd, key, 10, &key_len);
if(rv!=APR_SUCCESS && rv!=APR_EOF){
char error_buf[50];
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(55504)
"Error while reading the file %s: %s", pubkey_file, apr_strerror(rv, error_buf, 50));
return HTTP_MOVED_TEMPORARILY;
}
apr_file_close(key_fd);
return OK;
}
const char *set_pubkey(cmd_parms *cmd, void *cfg, const char *arg)
{
pubkey_file = arg;
return NULL;
}
static const command_rec authn_anon_cmds[] =
{
AP_INIT_TAKE1("SignaturePublicKeyFile", set_pubkey, NULL, OR_LIMIT, "The path to public key"),
{NULL}
};
static void register_hooks(apr_pool_t *p)
{
ap_hook_check_authn(subscription_cookie_check_auth, NULL, NULL, APR_HOOK_MIDDLE,
AP_AUTH_INTERNAL_PER_CONF);
}
正如我前面提到的,/ etc / passwd可以正常工作,但是在尝试其他文件(例如/ tmp / test)时,我的日志中出现以下错误:
[Sat Mar 02 14:13:32.621300 2019] [auth_subscription:error] [pid 11840:tid 140056870254336] [client 127.0.0.1:45288] AH55503: Unable to open the file /tmp/test: No such file or directory
我尝试读取的文件存在(甚至具有所有权限只是为了确保):
$ ls -la /tmp/test
-rwxrwxrwx 1 root root 12 mars 2 13:10 /tmp/test
任何帮助将不胜感激。