Как я могу установить пароль пользователя в 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
если вы отправляете данные на стандартный ввод через communicate
параметр:
http://docs.python.org/release/2.6/library/subprocess.html
Я ценю, что это просто скелетный код, но вот еще пара небольших комментариев на случай, если они пригодятся:
- Если вы не заинтересованы в выводе
useradd
команда, кроме того, провалилась она или нет, вам лучше использовать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
заявления не являются обязательными.
В 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
Вы забыли это:
stdin=subprocess.PIPE
Чтобы отправить данные в процесс, вам нужно stdin
,
Итак, полное утверждение таково:
process = subprocess.Popen(['sudo', 'chpasswd'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
а затем позвоните communicate('password')
,