Python 的 sudo 权限

0 投票
2 回答
2713 浏览
提问于 2025-04-17 15:38

我有一个脚本(A.py),它会动态地生成新的进程(B.py),但是这些脚本需要以root身份创建。如果我作为普通用户运行

$ python A.py

然后当我运行

>>> subprocess.Popen('sudo nohup python B.py &') 

我就需要输入root密码才能开始。我其实不太想这么做。


现在如果我以root身份运行第一个脚本

$ sudo python A.py

那么我就可以像正常一样运行

>>> subprocess.Popen('nohup python B.py &')

我担心的事情是,使用sudo时会有一个超时时间,过了这个时间就会降级到普通权限。这样当A.py想要生成或结束一个进程时,它会要求输入密码,这样就无法按预期工作了。

  1. 运行sudo python A.py会在脚本运行期间保持root权限吗,还是会像普通终端那样因为sudo超时(我记得默认是15分钟)而失去权限?
  2. 有没有更好的方法来实现这个?

2 个回答

0

你可以有一个额外的脚本来运行 python B.py,这个脚本由超级用户(root)拥有,并且设置了 setuid 标志。(另外,你也可以给 B.py 添加一个合适的开头标记,让它可以直接执行。)这样的话,随时运行这个脚本就会以超级用户的身份执行。(当然,你还需要确保这个脚本是安全的,只能在合适的情况下运行,不能执行任意代码,以防止权限提升的问题。)

4

运行 sudo python A.py 会在脚本执行期间保持超级用户权限吗?还是说像普通终端那样,会因为 sudo timeout(我记得默认是15分钟)而失去权限呢?

在脚本运行期间,它会保持超级用户权限。

运行的命令不会失去超级用户权限;超时设置并不是用来撤销权限的。超时只是控制用户在使用 sudo 命令时需要多频繁输入密码。因为你的脚本现在有了超级用户权限,它会直接执行 nohup python B.py,而不是 sudo nohup python B.py,所以超时设置就不会影响到它。

撰写回答