我有一个Python脚本,让我们说install.py
(我正在运行的须藤),对安装自制软件,Xcode中,画中画,红宝石,痛饮,并最终盐OS X。 问题是,运行和(在partituclar的Xcode CLI)安装一切需要很长时间来运行,即sudo的超时,需要另一个提示输入管理员凭据。
事情是这样的。 由于部分install.py
,踢了所有的安装之前,我先通过打开一个子进程,并使用创建的本地管理员用户:
make_admin_account = {
"mkdir -p /Users/%(accountname)s",
"sudo dscl . -create /Users/%(accountname)s",
"sudo dscl . -create /Users/%(accountname)s UserShell /bin/bash",
"sudo dscl . -create /Users/%(accountname)s RealName \"%(fullname)s\"",
"sudo dscl . -create /Users/%(accountname)s UniqueID \"%(uid)s\"",
"sudo dscl . -create /Users/%(accountname)s PrimaryGroupID 80",
"sudo dscl . -create /Users/%(accountname)s NFSHomeDirectory /Users/%(accountname)s",
"sudo dscl . -passwd /Users/%(accountname)s \"%(password)s\"",
"sudo dscl . -append /Groups/admin GroupMembership%(accountname)s",
"sudo dscl . -append /Groups/_appserveradm GroupMembership %(accountname)s",
"sudo dscl . -append /Groups/_appserverusr GroupMembership %(accountname)s",
"sudo chown -R %(accountname)s /Users/%(accountname)s",
"sudo createhomedir -c -u %(accountname)s"
}
所以,现在我们有一个本地管理员帐户。 倒也干脆,现在,通过每个安装程序的运行。 让我们直接跳到哪里Xcode的CLI已安装完毕,现在我们踢了自制:
print("Install Homebrew")
execute("sudo -H -u %s ruby homebrew_ruby" % accountname)
( execute()
就是这样的呼唤一个简单的函数subprocess.Popen()
只要遇到sudo
,它又想管理员凭据。 这是不期望的行为。 那么,怎么样传递preexec_fn
的子进程和运行的新创建的管理员帐户?
def demote(user_uid, user_gid):
def result():
os.setgid(user_gid)
os.getuid(user_uid)
return result
preexec_fn = demote(pwd.getpwnam(accountname).pw_uid, pwd.getpwnam(accountname).pw_gid)
execute("ruby homebrew_ruby", preexec_fn=preexec_fn)
再次, execute
只是采取preexec_fn
参数,并将它传递给subprocess.Popen
。 什么是返回是:
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
chdir: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
chdir: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
在这一点上,我想我的新管理员帐户设置错误。 退出脚本,并尝试su'ing到我刚刚创建的新管理员帐户:
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
看起来很熟悉。
所以,把我的愿望变成了一句: 我正在寻找一种方法来保持很长的Python脚本提示输入管理员creds后超时默认5分钟。 我知道,我可能只是编辑/etc/sudoers
:
Defaults timestamp_timeout=15
这应该修复它...但我觉得应该在这里得到较好的解决,要么我没有看到或还没有讨论。 如果我们可以运行它作为一个Python子进程prexec_fn
,这将是理想的。