在pythonshell中更改用户

在pythonshell中更改用户,python,subprocess,user-permissions,Python,Subprocess,User Permissions,我在我的服务器上使用ubuntu 我有两个用户,分别是user1和user2 每个用户都有自己的项目文件夹,并根据需要设置权限。但是user1需要运行另一个用户的项目文件夹中的python脚本。为此,我使用subprocess.Popen。python文件具有所需的访问权限,因此我在调用该脚本时没有问题。但是日志文件(具有用户2权限)会导致权限被拒绝错误(因为它们属于其他用户,而不是我需要使用的用户) 所以我试着用 Popen("exit", shell=True, stdin=sp.PIPE,

我在我的服务器上使用ubuntu

我有两个用户,分别是user1user2

每个用户都有自己的项目文件夹,并根据需要设置权限。但是user1需要运行另一个用户的项目文件夹中的python脚本。为此,我使用
subprocess.Popen
。python文件具有所需的访问权限,因此我在调用该脚本时没有问题。但是日志文件(具有用户2权限)会导致权限被拒绝错误(因为它们属于其他用户,而不是我需要使用的用户)

所以我试着用

Popen("exit", shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) #exit from current user, and be root again
Popen(["sudo", "user2"], shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
Popen("/usr/bin/python /some/file/directory/somefile.py param1 param2 param3", shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
但是第二个
Popen
失败

苏:必须从终点站运行

在pythonshell中是否有任何方法可以更改用户

PS:由于某些原因,我无法更改有关日志文件的用户权限。我需要找到一种方法切换到其他用户

编辑:我需要做一些解释,把事情弄清楚

我有两个不同的django项目正在运行。每个项目都有一个用户,有自己的用户文件夹,每个项目代码和日志都保存在其中

现在,在某些情况下,我需要将一些数据从project1传输到projet2。在我看来,最简单的方法是编写一个python脚本,它接受参数并在第二个项目上执行相关的工作[数据插入]

因此,当在project1中调用某些函数时,我希望调用project2项目文件夹中的py脚本,以便在第二个项目上更新数据

但是,由于我在project1中调用了
Popen
,所以当前用户是user1。但是我的脚本(在project2中)有一些日志文件,因为访问权限而拒绝了我


所以,不知何故,我需要从user1切换到user2,这样我就不会有权限问题,并调用我的python文件。或者,一定要找到另一种方法来做到这一点。

通常,如果没有root权限或不知道第二个用户的登录详细信息,就无法伪装成另一个用户。这是出于设计,任何python都无法绕过它

解决问题的方法:

  • 如果您有权限,可以使用
    os.setuid(x)
    ,(其中x是数字用户id)更改有效用户id。但是,这将要求您的脚本以root用户身份运行。看一看这张照片

  • 如果您有权限,您也可以尝试
    su-c
    而不是sudo
    su-c
    将要求您在stdin上提供密码(您可以使用该库)

解决问题的方法:

  • 对脚本设置组可执行权限,并使两个用户位于同一组中
  • 在脚本上添加setuid位,以便user1可以作为user2有效地运行它:

    $ chmod g+s script
    
    这将允许组成员以user2身份运行脚本。(对“所有人”也可以这样做,但这可能不是一个好主意……)

[编辑]:修订的问题

答案是你太乱了。项目A和项目B可能不应该通过
Popen
ing对方的脚本与对方的文件相互干扰。相反,干净的解决方案是在项目a上有一个web界面,它为您提供所需的功能,并从项目B调用它。这样,如果将来您想在不同的主机上移动a,这不是问题

如果您坚持,您可以通过在shell中运行sudo来欺骗sudo(如果您有权限的话)。例如,有一个脚本:

#!/bin/sh
sudo my/problematic/script.sh

然后chmod它+x并从python执行它。这将解决无法在终端外运行sudo的问题。

我要补充的是,如果在两个用户之间授予了适当的权限,通过编程实现的一种方便方法是将另一个用户的ssh公钥放在授权密钥文件中,并通过ssh调用另一个脚本。user1和user2都没有这样做的权限。所以我必须先成为root…@jsbueno实际上这是个不错的主意。“我们在工作中经常使用这个。”法伦纳格尔:没错。这是nix安全模型。@brice使用os.setgid(x)可能会阻止对目标文件权限进行任何更改,如您所说。Popen运行python进程子进程下指定的命令。我想这是你第一次误会。