777 文件的权限被拒绝

777 文件的权限被拒绝

我有一个Django应用程序,配置为将数据库查询写入/tmp/db.log文件。

        "debug_console_to_file": {
            "level": "DEBUG",
            "filters": ["require_debug_true"],
            "class": "logging.FileHandler",
            "filename": "/tmp/db.log",
        },

应用程序通常以用户身份从uwsgi服务器启动www-data。但是,有时我会python manage.py通过我的用户手动运行它(使用)tvelichkov

问题是,当我尝试从我的用户启动它时,我收到一个权限被拒绝错误,/tmp/db.log因为www-data已经创建了它(删除该文件可以暂时解决问题,但服务器将收到相同的错误,因为现在我的用户拥有该文件)。

    PermissionError: [Errno 13] Permission denied: '/tmp/db.log'

我尝试将我的用户添加到www-data

    $ members www-data
    www-data tvelichkov

我也尝试授予777该文件文件权限。

    $ ls -l /tmp/db.log 
    -rwxrwsrwx 1 www-data www-data 22102 юли 30 15:25 /tmp/db.log

但我仍然不断收到此Permission denied错误。如能提供任何帮助,我将不胜感激。

注意:我以前在 Ubuntu 18.04 中使用此设置没有任何问题,但现在我在 Ubuntu 20.04 中遇到了这个问题。

更新:这是文件夹的权限/tmp/,但请注意,这是在我运行之后chown root:root /tmp,并且chmod 777 /tmp按照@adrian vera 的建议,顺便说一句,此更改后似乎chmod 777 /tmp/db.log有效,因为我不再收到权限被拒绝的错误。Ubuntu 是否可能/tmp/在版本 18.04 和 20.04 之间对文件夹进行了某些更改?因为我很确定在遇到此问题之前我没有对此文件夹进行任何更改?

    $ ls -l / | grep tmp
    drwxrwxrwx  24 root root       4096 авг  3 10:19 tmp

注 2:我还有一台安装了全新 Ubuntu 20.04 的机器,也遇到了这个问题,我回家后也会仔细检查那里的权限。

UPDATE2:因此在干净的 Ubuntu 20.04 安装中,该文件夹的权限/tmp/是:

    $ ls -l / | grep tmp
    drwxrwxrwt  23 root root      12288 авг  3 16:41 tmp

/tmp/db.log看起来是这样的:

    $ ls -l /tmp/db.log 
    -rw-r--r-- 1 www-data www-data 0 авг  3 16:54 /tmp/db.log

    $ sudo chmod 777 /tmp/db.log 
    $ ls -l /tmp/db.log 
    -rwxrwxrwx 1 www-data www-data 0 авг  3 16:54 /tmp/db.log

    $ lsattr /tmp/db.log 
    --------------e----- /tmp/db.log

    $ whoami
    tvelichkov

    $ getent group www-data
    www-data:x:33:tvelichkov

    $ python manage.py test --settings=cs.settings.test
    Traceback (most recent call last):
      File "/home/tvelichkov/.pyenv/versions/3.6.10/lib/python3.6/logging/config.py", line 565, in configure
        handler = self.configure_handler(handlers[name])
      File "/home/tvelichkov/.pyenv/versions/3.6.10/lib/python3.6/logging/config.py", line 738, in configure_handler
        result = factory(**kwargs)
      File "/home/tvelichkov/.pyenv/versions/3.6.10/lib/python3.6/logging/__init__.py", line 1032, in __init__
        StreamHandler.__init__(self, self._open())
      File "/home/tvelichkov/.pyenv/versions/3.6.10/lib/python3.6/logging/__init__.py", line 1061, in _open
        return open(self.baseFilename, self.mode, encoding=self.encoding)
    PermissionError: [Errno 13] Permission denied: '/tmp/db.log'

答案1

在这种情况下,可能比处理权限更好的想法是以用户身份执行脚本www-data。这是我们用来运行某些 Web 应用程序(如 NextClud、MediaWiki 等)维护脚本的标准方法。您可以借助以下命令执行此操作sudo

sudo -u www-data python manage.py

答案2

看起来您已将特定用户 ID 设置为文件的组所有权。(请参阅读写权限文件权限详细信息。)这就是您使用 tvelichkov 用户名时权限被拒绝的原因。您需要关闭用户 ID 并在文件所有权中设置组 ID。

sudo chown g-s www-data: /tmp/db.log

我建议你使用同一个用户来运行和测试应用程序。这样可以避免此类问题。

相关内容