在python sh中更改用户

2024-05-29 01:59:03 发布

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

我正在服务器上使用ubuntu。

我有两个用户,让他们成为user1user2

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

所以我试着用

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失败

su: must be run from a terminal

有没有办法在python shell中更改用户?

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

编辑:我需要解释清楚。。。

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

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

因此,当在project1中调用某些特定函数时,我希望调用project2项目文件夹中的py脚本,这样我就可以在第二个项目上进行数据更新。

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

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


Tags: 文件项目用户脚本文件夹true权限stdin
1条回答
网友
1楼 · 发布于 2024-05-29 01:59:03

通常,如果没有根用户权限或不知道第二个用户的登录详细信息,就无法伪装成另一个用户。这是设计出来的,再多的python也绕不过去。

Python ey解决问题的方法:

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

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

Unix解决问题的主要方法:

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

    $ chmod g+s script
    

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

[编辑]:修订问题

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

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

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

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

相关问题 更多 >

    热门问题