5

I'm writing a python script that executes a csh script in Solaris 10. The csh script prompts the user for the root password (which I know) but I'm not sure how to make the python script answer the prompt with the password. Is this possible? Here is what I'm using to execute the csh script:

import commands

commands.getoutput('server stop')
darrickc
  • 1,872
  • 6
  • 27
  • 38

7 Answers7

9

Have a look at the pexpect module. It is designed to deal with interactive programs, which seems to be your case.

Oh, and remember that hard-encoding root's password in a shell or python script is potentially a security hole :D

Federico A. Ramponi
  • 46,145
  • 29
  • 109
  • 133
5

Use subprocess. Call Popen() to create your process and use communicate() to send it text. Sorry, forgot to include the PIPE..

from subprocess import Popen, PIPE

proc = Popen(['server', 'stop'], stdin=PIPE)

proc.communicate('password')

You would do better do avoid the password and try a scheme like sudo and sudoers. Pexpect, mentioned elsewhere, is not part of the standard library.

Douglas Mayle
  • 21,063
  • 9
  • 42
  • 57
  • This doesn't seem to work. I'll continue to investigate popen though. – darrickc Oct 23 '08 at 18:34
  • 2
    I get the same response when using the PIPE like you recommend here. The script stops with the Password: prompt. – darrickc Oct 23 '08 at 20:08
  • I don't think that this works because the csh script does exec su root -c "$cmd0 $*" to try to su to root. The su would be a different process than the 'server stop' script. – darrickc Oct 23 '08 at 20:19
1
import pexpect
child = pexpect.spawn('server stop')
child.expect_exact('Password:')

child.sendline('password')

print "Stopping the servers..."

index = child.expect_exact(['Server processes successfully stopped.', 'Server is not running...'], 60)
child.expect(pexpect.EOF)

Did the trick! Pexpect rules!

darrickc
  • 1,872
  • 6
  • 27
  • 38
1

Add input= in proc.communicate() make it run, for guys who like to use standard lib.

from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate(input='password')
Nakilon
  • 34,866
  • 14
  • 107
  • 142
0

Should be able to pass it as a parameter. something like:

commands.getoutput('server stop -p password')
Owen
  • 22,247
  • 13
  • 42
  • 47
0

This seems to work better:

import popen2

(stdout, stdin) = popen2.popen2('server stop')

stdin.write("password")

But it's not 100% yet. Even though "password" is the correct password I'm still getting su: Sorry back from the csh script when it's trying to su to root.

darrickc
  • 1,872
  • 6
  • 27
  • 38
0

To avoid having to answer the Password question in the python script I'm just going to run the script as root. This question is still unanswered but I guess I'll just do it this way for now.

darrickc
  • 1,872
  • 6
  • 27
  • 38