Как установить пароль пользователя в 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