Как установить пароль пользователя в linux из скрипта python?

Я пытаюсь автоматизировать настройку доступа SFTP. Этот скрипт работает как пользователь с разрешениями sudo и без пароля.

Я могу создать пользователя вот так:

>>> import subprocess
>>> process = subprocess.Popen(['sudo', 'useradd', 'test'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> process.communicate()
('', '')

Далее мне нужно установить пароль пользователя, но я не могу выяснить, как. Вот что я пробовал.

>>> process = subprocess.Popen(['sudo', 'chpasswd'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> process.communicate('test:password')

в моей программе python он не действует, в интерактивном интерпретаторе он блокируется после первой строки.

каков наилучший способ сделать это?

Я запуск python 2.6 на Ubuntu lucid.

5 ответов


документация communicate говорит, что вам нужно добавить stdin=PIPE Если вы отправляете данные на стандартный ввод через :

http://docs.python.org/release/2.6/library/subprocess.html#subprocess.Popen.communicate

Я ценю, что это просто скелетный код, но вот еще пара других небольших комментариев, если они полезны:

  • если вы не заинтересованы в выходе кроме того, если это не удалось или нет, вам может быть лучше использовать subprocess.check_call который вызовет исключение, если команда возвращает ненулевое значение.
  • во втором случае, вы должны проверить, является ли process.returncode 0 после вашего звонка в communicate('test:password')

попробуйте ниже кода, который будет делать, как вам требуется автоматизация

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 заявления не являются обязательными.


вы забыли вот это:

stdin=subprocess.PIPE

чтобы отправить данные в процесс, вам нужно stdin.

таким образом, полное утверждение:

process = subprocess.Popen(['sudo', 'chpasswd'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)

и затем вызов communicate('password').


в Ubuntu используйте 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

Я думаю, проблема в том, что вы забыли опцию-S для sudo.