【问题标题】:Supervisor / Unix Permission Denied to write in directory [closed]主管/Unix权限被拒绝写入目录[关闭]
【发布时间】:2015-09-23 07:13:42
【问题描述】:

当我运行我的程序并尝试创建文件时,我收到以下错误:

IOError: [Errno 13] Permission denied: '/home/giri26/couponmonk_project/user_15_qr.png'

我使用supervisor 运行我的程序,这是config 文件:

[program:gunicorn-couponmonk]
directory = /home/giri26/couponmonk_project
command = /home/giri26/venv/py2.7/bin/python /home/giri26/venv/py2.7/bin/gunicorn --worker-class socketio.sgunicorn.GeventSocketIOWorker __init__:app 
stdout_logfile = /var/log/gunicorn/couponmonk-std.log
stderr_logfile = /var/log/gunicorn/couponmonk-err.log
user = newuser

我以为error 指的是permissionsnewuser,所以我将newuser 添加到group giri26

运行groups newuser 会导致:

newuser : giri26

ls -ld couponmonk_project/的结果是:

drwxrwxr-x 3 giri26 giri26 4096 Jun 27 22:34 couponmonk_project/

我认为newusergiri26 组的一部分并且group 具有rwx 权限,那么我将能够writecreate 文件夹中的create 文件。

我看对了吗?

感谢您的帮助。

注意

上面的文件夹有以下permissions

drwxr-xr-x 10 giri26 giri26 4096 Jun 27 22:52 ../

这可能需要改变吗?

更新

如下所示,我使用curl 运行strace,但output 不包含EACESS 的任何实例。 output 文件中有 400 多行,所以不能在这里全部发布。还有什么我需要注意的吗? ATM,我真的不知道什么是相关的。

这些行出现很多:

762   access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
762   open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY) = 3
762   read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\r\0\0\0\0\0\0"..., 832) = 832
762   fstat(3, {st_mode=S_IFREG|0644, st_size=14768, ...}) = 0
762   mmap(NULL, 2109696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa0d731f000
762   mprotect(0x7fa0d7321000, 2097152, PROT_NONE) = 0
762   mmap(0x7fa0d7521000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fa0d7521000
762   close(3) 

这也出现在输出的末尾:

recvfrom(3, "HTTP/1.1 500 INTERNAL SERVER ERR"..., 16384, 0, NULL, NULL) = 10510

【问题讨论】:

  • 您在更改组后是否重新启动了主管?他们之前不会申请。
  • @KlausD。是的,我已经尝试过了,但仍然遇到同样的问题。
  • 文件是否已经存在?如果有,它的权限是什么?
  • @AndrewHenle 该文件不存在。出错时即将创建。
  • @Giri - 你的操作系统是什么?如果是 Linux,请尝试在 strace -f -o /your/output/file/name your command 下运行该进程并查找返回 EACCESS 的系统调用。这将告诉您失败的确切系统调用,这比您现在拥有的数据更多。

标签: python unix file-permissions supervisord


【解决方案1】:

gunicorn 配置文件中的行

user = newuser

似乎确实是核心问题。正如

所示
$ id
uid=1001(msw) gid=1001(msw) groups=1001(msw),4(adm),8(mail) …

一个用户有一个uid和一个gid。列出的所有其他组都是您所属但不是您的 gid 的组。要更改 gid,您必须明确要求将其切换为:

$ newgrp mail
$ id
uid=1001(msw) gid=8(mail) groups=1001(msw),4(adm),8(mail) …

确实将我的 gid 更改为我的其他组之一。不幸的是 newuser 现在可能看起来像:

 $ id
 uid=22(newuser) gid=22(newuser) groups=22(newuser), 455(giri26) …

而且由于 newuser 可能永远不会登录到 shell,甚至没有密码,所以没有运行 newgrp 的好地方。

要修复它,你应该通过修改/etc/passwd使 giri26 成为 newuser 的 gid

newuser:x:22:22: …

变成:

newuser:x:22:455: …

这可能会影响 newuser 的其他文件和目录,请小心。

【讨论】:

  • 谢谢@msw。我在您的回复中运行了命令,得到了newuser 的以下内容:uid=1001(newuser) gid=1000(giri26) groups=1000(giri26)
【解决方案2】:

您应该在更改文件权限后尝试重新启动实际机器。

如果您在远程服务器上运行此程序,请通过 Web 主机控制面板发出命令以重新启动实际机器。

这应该有望解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多