在 python shell 中更改用户
Posted
技术标签:
【中文标题】在 python shell 中更改用户【英文标题】:Changing user within python shell 【发布时间】:2012-03-28 12:13:39 【问题描述】:我在我的服务器上使用 ubuntu。
我有两个用户,让他们分别是 user1 和 user2
每个用户都有自己的项目文件夹,并根据他们的需要设置权限。但是 user1 需要运行另一个用户项目文件夹中的 python 脚本。我为此使用subprocess.Popen
。 python 文件具有所需的访问权限,所以我在调用该脚本时没有问题。但是日志文件(对 user2 具有权限)会导致 permision denied 错误(因为它们属于其他用户,而不是我需要使用的用户)。
所以我尝试用
改变用户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:必须从终端运行
有没有办法?
PS:由于某些原因,我无法更改有关日志文件的用户权限。我需要想办法切换到其他用户...
编辑:我需要做一些解释以使事情清楚......
我有两个不同的 django 项目正在运行。每个项目都有一个用户,有自己的用户文件夹,每个项目代码和日志都保存在其中。
现在,在某些情况下,我需要将一些数据从 project1 传输到 projet2。在我看来,最简单的方法是编写一个接受参数并在第二个项目上执行相关工作 [数据插入] 的 python 脚本。
所以,当在 project1 中调用某些特定函数时,我希望调用 project2 项目文件夹中的 py 脚本,这样我就可以在第二个项目上进行数据更新。
但是,由于我在 project1 中调用 Popen
,因此当前用户是 user1。但是我的脚本(在 project2 中)有一些日志文件,由于访问权限而拒绝了我......
所以,不知何故,我需要从 user1 切换到 user2,这样我就不会遇到权限问题,并调用我的 python 文件。或者,确实找到另一种方法来做到这一点..
【问题讨论】:
Popen 运行python进程的子进程下指定的命令。我想这是你的第一个误解。 【参考方案1】:通常,如果没有 root 权限或不知道第二个用户的登录详细信息,就无法伪装成另一个用户。这是设计使然,再多的 python 也无法绕过它。
Python-ey 解决问题的方法:
如果您有权限,您可以使用os.setuid(x)
,(其中x 是数字用户ID)来更改您的有效用户ID。但是,这将要求您的脚本以 root 身份运行。看看os module documentation。
如果你有权限,你也可以试试su -c <command>
而不是sudo。 su -c
将要求您在标准输入上提供密码(您可以使用 pexpect 库)
Unix-ey 解决问题的方法:
在脚本上设置组可执行权限,让两个用户在同一个组中。在脚本中添加 setuid 位,以便 user1 可以作为 user2 有效运行:
$ chmod g+s script
这将允许组成员以 user2 身份运行脚本。 (“所有”也可以这样做,但这可能不是一个好主意……)
[编辑]:修改后的问题
答案是你太滥交了。项目 A 和项目 B 可能不应该通过 Popen
ing 彼此的脚本将彼此的文件搁浅来进行交互。相反,干净的解决方案是在项目 A 上有一个 Web 界面,它为您提供所需的功能并从项目 B 调用它。这样,如果将来您想将 A 移动到不同的主机上,这不是问题.
如果你坚持,你也许可以通过在 shell 中运行 sudo(如果你有权限)来欺骗它。例如,有一个脚本:
#!/bin/sh
sudo my/problematic/script.sh
然后 chmod it +x 并从 python 执行它。这将解决无法在终端外运行 sudo 的问题。
【讨论】:
我要补充一点,如果在两个用户之间都授予了适当的权限,那么以编程方式执行此操作的一种便捷方法是在 authorized_keys 文件中拥有另一个用户的 ssh 公钥,然后通过 ssh 调用另一个脚本. user1 和 user2 都没有这样做的权限。所以我必须先成为根... @jsbueno 实际上不是一个坏主意。我们在工作中经常使用它。 @FallenAngel:准确地说。这是 nix 安全模型。 @brice 使用 os.setgid(x) 可能会阻止您对目标文件权限进行任何更改。以上是关于在 python shell 中更改用户的主要内容,如果未能解决你的问题,请参考以下文章
在 shell 脚本中与非 root 用户连接后更改 root