У меня есть приложение 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
.
Проблема в том, что когда я пытаюсь запустить его от своего пользователя, я получаю ошибку Permission denied to /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
работает, потому что я больше не получаю ошибку Permission denied.Возможно ли, что Ubuntu изменил что-то для папки / tmp /
между версиями 18.04 и 20.04? Поскольку я почти уверен, что ничего не менял в этой папке, прежде чем столкнулся с этой проблемой?
$ ls -l / | grep tmp
drwxrwxrwx 24 root root 4096 авг 3 10:19 tmp
Примечание 2: у меня есть еще одна машина с чистой установкой Ubuntu 20.04, где у меня тоже есть эта проблема, я дважды проверю разрешения там тоже однажды я вернулся домой.
ОБНОВЛЕНИЕ 2: Итак, на чистой 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'
Возможно, вместо того, чтобы разбираться с разрешениями, в этом случае лучше выполнить скрипт как www-данные
пользователь. Это стандартный подход, который мы используем для запуска сценариев обслуживания некоторых веб-приложений, таких как NextClud, MediaWiki и т. д. Вы можете сделать это с помощью команды sudo
:
sudo -u www-data python manage.py
Похоже, вы установили определенный идентификатор пользователя в качестве группового владельца файла. (См. s в rwxrwsrwx подробностях прав доступа к файлам.) Вот почему вы получаете отказ в разрешении с именем пользователя tvelichkov. Вам нужно отключить идентификатор пользователя и установить идентификатор группы во владении файлом.
sudo chown g-s www-data: /tmp/db.log
Я бы посоветовал вам использовать одного и того же пользователя для запуска и тестирования приложения. Это позволит избежать подобных проблем.