Как программно изменить пароль для пользователя без интерактивной подсказки в Python? - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь изменить пароль для пользователя foo с панелью пользователя, вызвав команду оболочки. Но у меня есть некоторые проблемы.

Я могу сделать это, чтобы отправить пароль на sudo

$ echo sudopw | sudo -S ls

И это, чтобы изменить пароль:

$ echo foo:newpw | sudo chpasswd
[sudo] password for bar: sudopw    

Это меняет пароль для пользователя foo на newpw,но это заставляет меня вводить пароль sudo вручную.

Проблема в том, что я не вижу, как объединить эти вещи. Я попробовал это, но это не работает:

$ echo sudopw | sudo -S echo foo:newpw | chpasswd 
chpasswd: Permission denied.
chpasswd: cannot lock /etc/passwd; try again later.
[sudo] password for bar: [bar@host]$

Мне удалось сделать это так:

echo sudopw | echo -e "newpw\nnewpw" | sudo passwd dummy

Но когда я попробовал это так, он снова запрашивает пароль.

os.system('echo sudopw | echo -e "newpw\nnewpw" | sudo passwd dummy')

Я нашел множество ответов о том, как отправить пароль на sudo <cmd>, где cmd не требует никакого дополнительного ввода. Но я действительно не могу решить ситуацию, когда ОБА отправляет ввод в cmd И отправляет пароль в sudo из сценария python.

Ответы [ 4 ]

0 голосов
/ 18 октября 2019

sudo кеширует пароль в течение короткого времени, вы можете попробовать сделать 2 разных вызова, один для ввода пароля для sudo: что-то вроде sudo ls работает просто отлично, затем вы вызываете вторую команду, котораяне будет требовать пароль для sudo, просто введите необходимые данные для изменения пароля пользователя.

0 голосов
/ 18 октября 2019

Если visudo не ваш выбор, попробуйте следующее

$ echo 'sudopassword
foo:newpassword' | sudo -S /usr/sbin/chpasswd

или

$ echo -e "sudopassword\nfoo:newpassword" | sudo -S /usr/sbin/chpasswd
0 голосов
/ 18 октября 2019

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

r = Popen(('mkpasswd', '-m', 'sha-512', new_password), stdout=PIPE)
shadow = r.communicate()[0].strip()

proc = Popen(['sudo', '-S', '-k', 'usermod', '-p', shadow, 'foo'], 
             stdin=PIPE, stdout=PIPE)
proc.stdin.write(sudo_password + b'\n')
proc.stdin.flush()
proc.communicate()
0 голосов
/ 18 октября 2019

Вы можете использовать команду sudo без пароля.

$ sudo visudo

Если вы запускаете python с пользователем XXX, добавьте следующую строку.

XXX ALL=(ALL) NOPASSWD:/usr/sbin/chpasswd

После вы можете использовать $ sudo chpasswd команда без пароля.

...