uwsgi正在以root用户身份运行我的应用程序,但不应该b

2024-06-10 16:05:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Flask应用程序通过uwsgi运行,由nginx提供服务,全部由supervisord控制

我已将/etc/supervisor.conf中的user参数设置为user=webdev

../myapp/uwsgi_app.ini和{}中,我设置了uid=webdev和{}

问题是,我的应用程序有权限问题。在我的一个视图中使用以下print语句,我发现应用程序正在以root的形式运行。这会导致需要创建目录的函数调用出现问题。在

以下所有print语句都位于Flask视图中。在

print 'group!! {}'.format(os.getegid())
print 'user id!! {}'.format(os.getuid())
print 'user!! {}'.format(os.path.expanduser('~'))

结果。。。在

^{pr2}$

编辑:我添加了以下打印语句:

from subprocess import call
print 'here is user',
call('echo $USER', shell=True)
print 'here is home',
call('echo $HOME', shell=True)

这个指纹

here is user root
here is home /root

在服务器上的终端中,输入$ id,得到uid=1000(webdev) gid=1000(webdev) groups=1000(webdev)

这是$ getent group的输出

root:x:0:
...
webdev:x:1000:
...
www-data:x:1001:nginx
nginx:x:996:nginx
...

以下是/etc/passwd中的一些行

webdev:x:1000:1000::/home/webdev:/bin/bash

Tags: 应用程序formatflaskhomehereisosnginx
1条回答
网友
1楼 · 发布于 2024-06-10 16:05:13

这很奇怪,因为通常您在以root身份运行时不会出现任何权限问题(实际上相反,在这种情况下,您拥有的权限可能会超过所需的权限)。在

我觉得您可能是以webdev的身份运行进程,而不是{}。你能试着叫os.getuid()而不是os.expanduser()吗?在

当没有为用户设置主目录时,/root目录通常用作默认目录。您还可以检查您的/etc/passwd/中的webdev条目,查看主目录设置为什么。在

如果您不是以root身份运行,那么您的权限问题可能与其他问题有关(可能webdev不是您正在写入的目录的所有者?)。在

编辑:如果希望用户webdev有一个正确的主目录,请以root的形式运行以下命令:

mkdir -p /home/webdev
usermod -m -d /home/webdev webdev

之后,os.expanduser()应该显示正确的主目录。 在

编辑2:我错误地假设webdev不是一个普通用户,而是一个配置最少的服务用户名,比如您使用的www。我的错误。在

无论如何,正如我在评论中提到的,重要的是你的uid值。您没有以root用户身份运行,因为您的uid不是0。在UNIX术语中,其他的都不重要。在

但我想我已经想好了。当您指定uid&;gid选项时,uWSGI的工作方式是,它最初仍然以root的形式运行,但立即调用setuid()放弃其特权并切换到您提供的uid和{}。这将解释您看到的行为:环境仍然是为root配置的,即使uWSGI现在以webdev的形式运行,$USER和{}必须仍然指向root。在

您可以尝试通过在烧瓶视图中添加以下行来测试:

^{pr2}$

这将在webdev的主目录中创建一个空文件。现在以webdev身份登录,转到/home/webdev并执行ls -l。如果testfile的所有者是webdev,那么您将以webdev的身份运行。在

如果您可以建立它,那么您所要做的就是编写所有代码,假设$HOME和{}设置错误。我不确定它将如何影响您的代码,但请尝试,例如,避免相对路径(可能假设默认目标是错误的主目录)。在

相关问题 更多 >