Trying to run a sudo command from script

Kent Tenney ktenney at gmail.com
Sun Jan 3 09:05:44 EST 2010


On Fri, Jan 1, 2010 at 5:08 PM, Diez B. Roggisch <deets at nospam.web.de> wrote:
> Kent Tenney schrieb:
>>
>> Howdy,
>>
>> A script running as a regular user sometimes wants
>> to run sudo commands.
>>
>> It gets the password with getpass.
>> pw = getpass.getpass()
>>
>> I've fiddled a bunch with stuff like
>> proc = subprocess.Popen('sudo touch /etc/foo'.split(),
>> stdin=subprocess.PIPE)
>> proc.communicate(input=pw)
>>
>> getting assorted errors with all variations I try.
>>
>> Googling says use pexpect, but I'd prefer a stdlib solution.
>
> pexpect is pure python, and it's needed. There is no easy way around the
> issue, so if you insist on not using pexpect, you re-invent the wheel and
> write the exact same code - just more error-prone, because of
> wheel-reinvention....

Indeed, the requirements of this are way more complex than I guessed.
The following seems to work well, took some fiddling with EOF.

def sudo(command, password=None, prompt="Enter password "):

    import pexpect

    if not password:
        import getpass
        password = getpass.getpass(prompt)

    command = "sudo " + command
    child = pexpect.spawn(command)
    child.expect(['ssword', pexpect.EOF])
    child.sendline(password)
    child.expect(pexpect.EOF)
    # is this necessary?
    child.close()

Thanks,
Kent

>
> Diez
> --
> http://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list