How can I set a users password in linux from a python script?

后端 未结 5 1763
陌清茗
陌清茗 2020-12-09 00:54

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:



        
相关标签:
5条回答
  • 2020-12-09 01:06

    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:

    • If you're not interested in the output of the 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.
    • In the second case, you should check whether process.returncode is 0 after your call to communicate('test:password')
    0 讨论(0)
  • 2020-12-09 01:07

    I guess the issue is that you forgot the -S option for sudo.

    0 讨论(0)
  • 2020-12-09 01:09

    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
    
    0 讨论(0)
  • 2020-12-09 01:13

    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.

    0 讨论(0)
  • 2020-12-09 01:16

    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').

    0 讨论(0)
提交回复
热议问题