0

我在我的服务器中使用 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:必须从终端运行

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

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

编辑:我需要做一些解释以使事情清楚......

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

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

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

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

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

4

1 回答 1

1

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

Python-ey 解决问题的方法:

  • 如果您有权限,您可以使用os.setuid(x),(其中 x 是数字用户 ID)来更改您的有效用户 ID。但是,这将要求您的脚本以 root 身份运行。查看os 模块文档

  • 如果你有权限,你也可以尝试su -c <command>代替sudo。su -c将要求您在标准输入上提供密码(您可以使用pexpect库)

Unix-ey 解决问题的方法:

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

    $ chmod g+s script
    

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

[编辑]:修改后的问题

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

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

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

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

于 2012-03-28T12:16:57.390 回答