如何在没有重新提示凭据运行长Python脚本(How to run long Python scri

2019-10-18 14:58发布

我有一个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 ,这将是理想的。

Answer 1:

在Python,请检查您的os.getcwd()你可能会从一个时髦的地方运行。

尝试通过cwd='/tmp'process.Popen() 每个人都有权限/tmp



文章来源: How to run long Python script without re-prompt for credentials