是否可以在没有存储在我的脚本内存中并且以root身份运行某些os。*命令的情况下请求root pw?
我的剧本
(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 提示。
答案 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)
答案 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个文件可能是一个解决方案,但代码已经混合,因此不适合。