I\'m trying to automate the setup of SFTP access. This script is running as a user with sudo permissions and no password.
I can create a user like so:
The documentation for communicate
says that you'll need to add stdin=PIPE
if you're sending data to standard input via the communicate
parameter:
http://docs.python.org/release/2.6/library/subprocess.html#subprocess.Popen.communicate
I appreciate this is just skeleton code, but here are another couple of other small comments, in case they are of use:
useradd
command other than whether it failed or not, you might be better off using subprocess.check_call
which will raise an exception if the command returns non-zero.process.returncode
is 0 after your call to communicate('test:password')
I guess the issue is that you forgot the -S option for sudo.
On Ubuntu, use usermod
class SomeClass
def userPasswd(self, login, password):
encPass = crypt.crypt(password)
command = "usermod -p '{0:s}' {1:s}".format(encPass, login)
result = os.system(command)
if result != 0:
logging.error(command)
return result
Try below code which will do as you required automation
from subprocess import Popen, PIPE, check_call
check_call(['useradd', 'test'])
proc=Popen(['passwd', 'test'],stdin=PIPE,stdout=PIPE,stderr=PIPE)
proc.stdin.write('password\n')
proc.stdin.write('password')
proc.stdin.flush()
stdout,stderr = proc.communicate()
print stdout
print stderr
print
statements are optional.
You forgot this:
stdin=subprocess.PIPE
To send data to the process, you need a stdin
.
So the full statement is:
process = subprocess.Popen(['sudo', 'chpasswd'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
and then call communicate('password')
.