我有一个Rake,服务器使用FileUtils.mv将处理后的文件从一个文件夹移动到另一个文件夹,如下所示:
FileUtils.mv('/path-to-upload-folder/'+filename, '/path-to-imported-folder/'+filename) if File.exist?('/path-to-upload-folder/'+filename)
如果我从rails服务器中运行此命令(我的操作是rake任务的副本,只是为了控制器内的调试简单),一切都很顺利(可能是因为我以root权限运行服务器)与rvmsudo)。 从Rake任务运行时,我收到一个权限被拒绝的错误,如此
Errno::EACCES: Permission denied @ sys_fail2 -
源文件夹称为上载,目标文件夹是导入的文件夹。遵循权限以及文件夹的用户和组
drwxr-xr-x 2 malatini malatini 4096 lug 14 14:26 imported/
drwxr-xr-x 2 www-data www-data 135168 lug 14 14:26 uploads/
malatini是我当前的用户。 我知道从两个文件夹运行原始mv我需要成为一个sudo用户,但为什么我可以在Rails服务器中运行相同的命令而没有任何问题?
我还尝试更改目标文件夹的权限和所有者/组,但没有运气。
阅读here我认为问题是正在运行rake任务的用户。如果我手动运行rake任务,或者如果它作为cron作业运行,则会发生同样的问题。
我在
下运行Debian 3.16.7-ckt11-1 (2015-05-24) x86_64 GNU/Linux
有什么建议吗?
修改
正如@Nic Nilov建议我尝试更改源和目标foleders的所有者和组,实际上我设法执行mv,因此rake任务,将两个文件夹的所有者和组更改为malatini
drwxr-xr-x 2 malatini malatini 4096 lug 14 14:26 imported/
drwxr-xr-x 2 malatini malatini 135168 lug 14 14:26 uploads/
但是这样,apache(负责将文件移动到上传文件夹)无法写入uploads文件夹。没有其他配置正常工作(不仅是上传文件夹组,也不是777到导入文件夹)。
答案 0 :(得分:1)
你基本上回答了自己的问题。这是一个权限问题,与尝试移动操作的OS用户有关。它可以在Rails中运行,因为正如您所说,您使用rvmsudo
运行它。
两种方法是从特权用户运行rake任务或在两个文件夹上设置所有权,以便允许您运行rake
下的当前用户执行mv
。
在您的文件夹中,用户和组都设置为相同。您可以将其组设置为运行rake
的用户组,例如:
chgrp malatini ./uploads
这会使malatini
组成为两个文件夹的所有者:
drwxr-xr-x 2 malatini malatini 4096 lug 14 14:26 imported/
drwxr-xr-x 2 www-data malatini 135168 lug 14 14:26 uploads/
哪个应允许mv
操作。
<强>更新强>
在特权用户下运行rake
并从cron
执行此操作时,为避免将密码存储在任何位置,您可以使用NOPASSWD
指令。
有关详情,请参阅this askubuntu answer。