如何以root身份执行os。*方法?

时间:2009-10-28 09:40:15

标签: python root sudo

是否可以在没有存储在我的脚本内存中并且以root身份运行某些os。*命令的情况下请求root pw?

我的剧本

  1. 扫描一些文件夹和文件以检查它是否可以完成工作
  2. 在/ etc /...
  3. 中进行了一些更改
  4. 创建应由运行脚本的用户拥有的文件夹和文件
  5. (1)可以作为普通用户完成。我可以通过sudoing脚本来做(2),但是(3)中的文件夹和文件将是root的。

    问题是我使用了很多os.makedirs,os.symlink等,这使我无法让普通用户运行它。

    坦克2全部用于建议

    到目前为止的解决方案是:

    # do all in sudo
    os.chown(folder, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID')))
    

    感谢 gnibbler 提示。

5 个答案:

答案 0 :(得分:2)

也许你可以把(2)放在一个单独的脚本中,比如script2.py,然后在主脚本中用sudo script2.py来调用popen

这样只有(2)将以root身份执行。

答案 1 :(得分:2)

yourscript.py

run_part_1()
subprocess.call(['sudo', sys.executable, 'part2.py'])
run_part_3()

part2.py

run_part_2()

答案 2 :(得分:1)

您会考虑使用Linux PAM吗?您可能需要查看Linux-PAM Application Developers' GuidePython API for PAM

答案 3 :(得分:1)

您应该以root身份执行脚本,并使用os.chmod和os.chown对(3)的权限进行适当的更改。

您可以通过sudo执行另一个具有root权限的脚本,但这也需要在脚本中存储用户密码以传入sudo,从安全角度来看这是一个糟糕的想法。

因此,您的问题是获取某些文件/文件夹的正确权限。首先,传入或硬编码普通用户的UID /用户名。然后使用os.chown更改所有者,并使用os.chmod更改权限。您应该查看os包中的备用chown / chmod方法:http://docs.python.org/library/os.html

最后一点:您不必担心符号链接的权限。他们拥有他们所指向的权限。

答案 4 :(得分:1)

gnibbler提示os.chown。问题是然后知道sudo背后的用户的ID。该信息存储在环境变量SUDO_*

os.chown, (some_path, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID')))

将代码分成3个文件可能是一个解决方案,但代码已经混合,因此不适合。