在Python中,如何在没有交互式提示的情况下以编程方式更改用户的密码?

2024-09-28 01:26:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过调用shell命令来更改用户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不需要任何额外的输入。但是我真的无法解决从python脚本向cmd发送输入和向sudo发送密码的情况。你知道吗


Tags: 用户echocmd密码forfoosudobar
3条回答

我终于解决了。我想强调的是,这个解决方案可能有安全缺陷,可能不是每个人都适合的选择。在我的例子中,它应该只运行一次,任何能够利用此代码中任何缺陷的人都已经走了很远。你知道吗

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()

您可以使用sudo命令而不需要密码。你知道吗

$ sudo visudo

如果您使用XXX用户运行python,那么请添加以下行。你知道吗

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

之后,可以使用$ sudo chpasswd命令而不需要密码。你知道吗

如果visudo不是您的选择,那么请尝试以下操作

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

或者

$ echo -e "sudopassword\nfoo:newpassword" | sudo -S /usr/sbin/chpasswd

相关问题 更多 >

    热门问题