我在服务器中使用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:必须从终端
运行
有没有办法在python shell中更改用户?
PS:由于某些原因,我无法更改有关日志文件的用户权限。我需要找到一种方法来切换到其他用户...
编辑:我需要做一些explenaiton以使事情清楚......
我有两个不同的django项目正在运行。每个项目都有一个用户,拥有自己的用户文件夹,每个项目代码和日志都保存在其中。
现在,在某些情况下,我需要将一些数据从project1传输到projet2。最简单的方法就是编写一个接受参数的python脚本,并在第二个项目中执行相关的作业[数据插入]。
因此,当在project1中调用某些特定函数时,我希望调用project2项目文件夹中的py脚本,这样我就可以在第二个项目上进行数据更新。
但是,因为我在project1中调用了Popen
,所以currnt用户是user1。但我的脚本(在project2中)有一些日志文件,由于访问权限而拒绝了我...
所以,不知何故,我需要从user1切换到user2所以我不会有权限问题,并调用我的python文件。或者,找到另一种方法来做到这一点..
答案 0 :(得分:1)
通常,没有root权限或知道第二个用户的登录详细信息,就无法伪装成另一个用户。这是设计的,没有任何数量的python会绕过它。
Python-ey解决问题的方法:
如果您拥有该权限,则可以使用os.setuid(x)
(其中x是数字用户ID)来更改您的有效用户ID。但是,这将要求您的脚本以root身份运行。请查看os module documentation。
如果您有权限,也可以尝试su -c <command>
而不是sudo。 su -c
将要求您在stdin上提供密码(您可以使用pexpect库)
Unix-ey解决问题的方法:
在脚本上添加setuid位,以便user1可以作为user2有效地运行它:
$ chmod g+s script
这将允许组成员以user2身份运行脚本。 (同样可以为'所有'做,但这可能不是一个好主意......)
[编辑]:修改了问题
答案是,你太过滥交了。项目A和项目B可能不应该通过Popen
彼此的脚本来混淆彼此的文件。相反,干净的解决方案是在项目A上有一个Web界面,它为您提供所需的功能,并从项目B调用它。这样,如果将来您想要在不同的主机上移动A,这不是问题。
如果你坚持,你可以通过在shell中运行它来欺骗sudo(如果你有权限)。例如,有一个脚本:
#!/bin/sh
sudo my/problematic/script.sh
然后chmod it + x并从python执行它。这将解决无法在终端外运行sudo的问题。