python用户名和密码登录函数_使用Python脚本更改Linux用户名或密码

我正在编写一个Python脚本来更改Linux帐户用户的用户名和密码-这是一个更大的内部web gui系统的一部分,它将来自apache2(不能作为root用户运行)的密码更改请求排队,然后更改密码本身。python脚本本身显然必须以root用户身份运行才能更改密码。在

密码更改功能非常简单:def chpasswd(user, passwd):

if os.getuid() != 0:

syslog.syslog("Error: chpasswd.py must be run as root")

return

proc = Popen(

['/usr/sbin/chpasswd'],

stdin = subprocess.PIPE,

stdout = subprocess.PIPE,

stderr = subprocess.PIPE

)

print "Changing: " + user + ':' + passwd

out, err = proc.communicate(user + ':' + passwd)

proc.wait()

print out

if proc.returncode != 0:

print "Error: Return code", proc.returncode, ", stderr: ", out, err

if out:

syslog.syslog("stdout: " + out)

if err:

syslog.syslog("stderr: " + err)

print语句只是用于临时调试。它运行良好,不报告任何错误-out或err上没有任何内容;但是由于某些原因,实际的UNIX密码没有被更改。在

调用此函数的脚本正在侦听本地绑定的TCP套接字。当它接收到一个更改密码请求(格式为user:password-稍后将被加密,但现在是纯文本)时,它将其添加到队列中,然后调用chpasswd函数。在

因此,典型用法是:

^{pr2}$

当服务器在bash窗口中运行时(不是作为守护程序),它会输出:# python chpasswd.py

Starting Password Server

New connection from: 127.0.0.1

Changing: jsmith:mynewpassword

您可以看到,最后一个语句是我的chpasswd函数中的print语句。在

但在完成上述操作后,当我实际尝试使用新密码以用户身份登录时,我得到:$ su jsmith

Password:

su: Authentication failure

我有什么明显的错误吗?我的怀疑是,不知何故,与Popen的连接实际上并没有结束,或者也许单行user:password文本没有被传输。所以我试着做一些类似的事情:out, err = proc.communicate(user + ':' + passwd + '\x04')

请注意结尾处额外的\x04字符,表示传输结束。但是,添加这个仍然不能使它工作-密码保持不变。在

我在Debian Wheezzy上运行这个,以防有什么不同。在

更新:

进一步研究,我可以看到我的chpasswd函数实际上是在更改密码-如果我在连接密码服务器之前和之后cat文件,我会发现有一个不同的哈希。在

只是当我尝试使用明文密码进行身份验证时,它不起作用。因此,我怀疑,与Popen的通信要么添加额外的字符,要么以某种方式丢失字符。当然,由于/etc/shadow是一个散列,所以我不能确切地知道这里到底发生了什么。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值