按照Python中给定的UID执行shell命令

按照Python中给定的UID执行shell命令,python,linux,permissions,os.system,Python,Linux,Permissions,Os.system,我需要一种方法将os.system模块作为不同的UID执行。它的行为需要类似于下面的BASH代码注意,这些不是我正在执行的确切命令: su user1 ls ~ mv file1 su user2 ls ~ mv file1 目标平台是GNULinuxgeneric 当然,我可以将这些信息传递到os.system模块,但是如何发送密码呢?当然,我可以以root用户身份运行脚本,但这是草率和不安全的 最好我不要求任何密码都是纯文本的。我认为这很重要:你可以用一个shell来实现这一点,因为每个命

我需要一种方法将os.system模块作为不同的UID执行。它的行为需要类似于下面的BASH代码注意,这些不是我正在执行的确切命令:

su user1
ls ~
mv file1
su user2
ls ~
mv file1
目标平台是GNULinuxgeneric

当然,我可以将这些信息传递到os.system模块,但是如何发送密码呢?当然,我可以以root用户身份运行脚本,但这是草率和不安全的


最好我不要求任何密码都是纯文本的。

我认为这很重要:你可以用一个shell来实现这一点,因为每个命令都被启动到它自己的进程中,进程有自己的id。但是使用python,任何东西都会有python解释进程的uid,假设您不使用子流程模块和co启动子流程。我不知道如何更改流程的用户-我不知道这是否可行-即使可能,您至少需要管理员权限


你到底想做什么?例如,出于管理目的,这听起来不是正确的做法。通常,管理脚本在priviledge用户中运行-因为理论上除了用户2之外,没有人知道用户2的密码。成为root用户意味着su用户总是为“普通”用户工作,而不需要密码。

您正在寻找的函数称为os.seteuid。在任何情况下,我担心您都无法逃避以root用户身份执行脚本,但我认为您可以使用capabilities7框架稍微“限制”执行,这样它就可以改变用户,但不做超级用户可以做的任何其他事情


或者,您也可以使用PAM来执行此操作。但一般来说,没有“整洁”的方法来实现这一点,David Cournapeau绝对正确,传统的管理脚本是以特权运行的。

也许sudo可以帮助您,否则您必须是root用户才能执行os.setuid

或者,如果你想玩得开心,你可以使用pexpect做一些事情 像这样的东西,你可以改进

p = pexpect.spawn("su guest")
p.logfile = sys.stdout 
p.expect('Password:')
p.sendline("guest")

在此过程中,某些进程或其他进程将需要0 root的有效UID,因为只有这样的进程才能将有效UID设置为任意其他UID

在shell中,su命令是SUID根程序;它是具有适当特权的POSIX术语,可以设置真实有效的UID。类似地,sudo命令也可以执行相同的任务。使用sudo,您还可以配置允许使用哪些命令和UID。关键的区别在于su需要目标用户的密码才能让你进入;sudo需要运行它的用户的密码

当然,还有一个问题,即用户是否应该知道其他用户的密码。一般来说,任何用户都不应该知道任何其他用户的密码

编写UID更改脚本很难。你可以做:

su altuser -c "commands to execute as altuser"
sudo -u altuser commands to execute as altuser
但是,su将要求控制终端提供密码,如果没有控制终端,su将失败。如果您使用sudo,它将缓存凭据,或者可以配置为缓存凭据,这样您只会被询问一次密码,但它会像su一样在第一次提示

围绕提示工作是很困难的。您可以使用并行工具期望为您处理伪TTY。但是,您将面临在脚本中存储密码的问题,这不是一个好主意,或者以某种方式将密码隐藏在视线之外

我用于这项工作的工具是我编写的,叫做asroot。它允许我精确地控制子进程应该具有的UID和GID属性。但是它只允许我使用它——也就是说,在编译时,授权用户名是指定的,当然可以更改。但是,我可以这样做:

asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ...
这会将真实有效的UID设置为“someone”,将主组设置为“theirgrp”,删除所有辅助组,并添加“othergrp”,因此该过程仅属于两个组,并将umask设置为0222;然后使用给定的参数执行“somecmd”


对于需要对其他用户帐户进行有限访问或不受限制访问的特定用户来说,这非常有效。作为一个普遍的解决方案,它不是那么热;sudo在大多数方面都更好,但仍然需要asroot不需要的密码。

您的权利是,只需要创建一个单独的特权用户就可以使用某些提升的权限执行脚本。一个比以root身份运行更干净的解决方案。David Cournapeau和Michiel Buddingh都有很好的观点。我将使用os.seteuid函数和特权用户(非root用户)来执行脚本。很好,很抱歉。