Как изменить пароль пользователя Linux из python

У меня возникли проблемы с изменением пароля пользователя Linux от python. Я пробовал так много всего, но я не мог решить проблему, вот пример того, что я уже пробовал:

sudo_password – пароль для sudo, sudo_command – это команда, которую я хочу, чтобы система запускалась, пользователь получает из списка и является пользователем, для которого я хочу изменить пароль, а newpass – это пропуск, который я хочу назначить «пользователю»,

user = list.get(ANCHOR) sudo_command = 'passwd' f = open("passwordusu.tmp", "w") f.write("%s\n%s" % (newpass, newpass)) f.close() A=os.system('echo -e %s|sudo -S %s < %s %s' % (sudo_password, sudo_command,'passwordusu.tmp', user)) print A windowpass.destroy() 

«A» – это возвращаемое значение для выполнения os.system, в данном случае 256. Я также попробовал

  A=os.system('echo %s|sudo -S %s < %s %s' % (sudo_password, sudo_command,'passwordusu.tmp', user)) 

но он возвращает тот же код ошибки. Я пробовал несколько других способов с командой «passwd», но без успеха. С командой chpasswd я пробовал это:

  user = list.get(ANCHOR) sudo_command = 'chpasswd' f = open("passwordusu.tmp", "w") f.write("%s:%s" % (user, newpass)) f.close() A=os.system('echo %s|sudo -S %s < %s %s' % (sudo_password, sudo_command,'passwordusu.tmp', user)) print A windowpass.destroy() 

также с:

  A=os.system('echo %s|sudo -S %s:%s|%s' % (sudo_password, user, newpass, sudo_command)) @;which returns 32512 A=os.system("echo %s | sudo -S %s < \"%s\"" % (sudo_password, sudo_command, "passwordusu.tmp")) @;which returns 256 

Я попробовал «mkpasswd» и «usermod» тоже так:

  user = list.get(ANCHOR) sudo_command = 'mkpasswd -m sha-512' os.system("echo %s | sudo -S %s %s > passwd.tmp" % (sudo_password,sudo_command, newpass)) sudo_command="usermod -p" f = open('passwd.tmp', 'r') for line in f.readlines(): newpassencryp=line f.close() A=os.system("echo %s | sudo -S %s %s %s" % (sudo_password, sudo_command, newpassencryp, user)) @;which returns 32512 

но если вы перейдете на https://www.mkpasswd.net , хеш «newpass» и замените «newpassencryp», он вернет 0, что теоретически означает, что он поступил правильно, но до сих пор он не изменяет пароль.

Я искал в Интернете и stackoverflow для этой проблемы или аналогичный, и пытался, какие решения были разоблачены, но опять же, без успеха.

Я бы действительно приветствовал любую помощь, и, конечно, если вам нужна дополнительная информация, я буду рад ее предоставить!

Заранее спасибо.

4 Solutions collect form web for “Как изменить пароль пользователя Linux из python”

Попробуйте использовать параметр «-stdin» для команды passwd в ваших трубах. Чтобы процитировать с man-страницы:

     --stdin
       Этот параметр используется для указания того, что passwd должен читать новый
       пароль со стандартного ввода, который может быть трубой.

Другой вариант, если ваш Linux имеет команду usermod, как root (или через sudo), вы можете явно установить (зашифрованный) пароль с помощью опции -p.

usermod основе usermod :

 #!/usr/bin/env python from crypt import crypt from getpass import getpass from subprocess import Popen, PIPE sudo_password_callback = lambda: sudo_password # getpass("[sudo] password: ") username, username_newpassword = 'testaccount', '$2&J|5ty)*X?9+KqODA)7' # passwd has no `--stdin` on my system, so `usermod` is used instead # hash password for `usermod` try: hashed = crypt(username_newpassword) # use the strongest available method except TypeError: # Python < 3.3 p = Popen(["mkpasswd", "-m", "sha-512", "-s"], stdin=PIPE, stdout=PIPE, universal_newlines=True) hashed = p.communicate(username_newpassword)[0][:-1] # chop '\n' assert p.wait() == 0 assert hashed == crypt(username_newpassword, hashed) # change password p = Popen(['sudo', '-S', # read sudo password from the pipe # XXX: hashed is visible to other users 'usermod', '-p', hashed, username], stdin=PIPE, universal_newlines=True) p.communicate(sudo_password_callback() + '\n') assert p.wait() == 0 

Сегодня я столкнулся с той же проблемой, и я написал простую оболочку subprocess для вызова команды passwd и подачи stdin с новым паролем. Этот код не является доказательством дурака и работает только при запуске с правами root, который не запрашивает старый пароль.

 import subprocess from time import sleep PASSWD_CMD='/usr/bin/passwd' def set_password(user, password): cmd = [PASSWD_CMD, user] p = subprocess.Popen(cmd, stdin=subprocess.PIPE) p.stdin.write(u'%(p)s\n%(p)s\n' % { 'p': password }) p.stdin.flush() # Give `passwd` cmd 1 second to finish and kill it otherwise. for x in range(0, 10): if p.poll() is not None: break sleep(0.1) else: p.terminate() sleep(1) p.kill() raise RuntimeError('Setting password failed. ' '`passwd` process did not terminate.') if p.returncode != 0: raise RuntimeError('`passwd` failed: %d' % p.returncode) 

Если вам нужен вывод passwd, вы также можете передать stdout=subprocess.PIPE на вызов Popen и прочитать его. В моем случае меня интересовало только то, что операция прошла успешно или нет, поэтому я просто пропустил эту часть.

echo -n 'password\npassword\n | passwd username' безопасности: не используйте что-то вроде echo -n 'password\npassword\n | passwd username' echo -n 'password\npassword\n | passwd username' поскольку это сделает пароль видимым в списке процессов.

SUDO

Поскольку вы хотите использовать sudo passwd <username> я бы порекомендовал добавить новую строку в ваш /etc/sudoers (используйте visudo для этого!)

 some_user ALL = NOPASSWD: /usr/bin/passwd 

Sudo не будет запрашивать пароль для some_user и скрипт будет работать, как ожидалось.

Или просто добавьте дополнительную p.stdin.write(u'%s\n' % SUDO_PASSWORD) . Таким образом, sudo сначала получит пароль пользователя, а затем passwd получит новый пароль пользователя.

Пользователь, которому вы выполняете это, должен иметь разрешение sudo для запуска команды passwd без пароля.

 >>> from subprocess import Popen >>> proc = Popen(['/usr/bin/sudo', '/usr/bin/passwd', 'test', '--stdin']) >>> proc.communicate('newpassword') 
  • Ошибка Dateutil parse в python возвращает неверное значение
  • Как правильно сортировать экземпляр namedtuple
  • В Python (2.7), почему os.remove не идентичен os.unlink?
  • Загрузка файла с несколькими строками JSON в Pandas Pandas
  • pygame падает при использовании метода заливки (цвета)
  • Случайно используйте оператор сравнения?
  • Альтернативы Selenium / Webdriver для заполнения полей при сглаживании без использования Python?
  • Почему print ("text" + str (var1) + "more text" + str (var2)) описывается как "отклонено"?
  • Python - лучший язык программирования в мире.