【发布时间】:2026-02-20 09:50:02
【问题描述】:
我在从 python 更改 Linux 用户密码时遇到问题。我尝试了很多东西,但我无法解决问题,以下是我已经尝试过的示例:
sudo_password 是 sudo 的密码,sudo_command 是我希望系统运行的命令, user 是从 List 中获取的,是我要为其更改密码的用户,newpass 是我要分配给“user”的通行证
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,理论上意味着它已经正确,但到目前为止它没有更改密码。
我在互联网和 * 上搜索过这个问题或类似问题,并尝试了暴露的解决方案,但同样没有成功。
我真的很感激任何帮助,当然,如果您需要更多信息,我很乐意提供!
提前致谢。
【问题讨论】:
-
问题是
passwd和sudo不是从标准输入读取密码,而是从/dev/tty读取密码。您必须使用伪终端来欺骗他们;pexpect擅长这样做。 -
那么,没有任何其他方法可以在不安装任何模块的情况下做我想做的事吗?我一直在阅读有关 pexpect 的内容,它似乎确实可以完成工作,但我想以与上述类似的方式进行。
标签: python linux passwords python-2.7