我想用一种方法在Ubuntu 10.4
带有结构的远程盒子上更新我的密码.
我希望我fabfile.py
看起来像这样:
def update_password(old_pw, new_pw): # Connects over ssh with a public key authentication run("some_passwd_cmd --old %s --new %s" % (old_pw, new_pd))
不幸的是,我所知道的唯一一个命令让一个人更改密码passwd
,而在Ubuntu 10.4上似乎没有任何方法可以传递新的(或旧的)密码作为参数passwd
.
可以使用什么命令来更改Ubuntu 10.4上的用户密码fabric
?
编辑:我已经看过了usermod -p
,这可能会有效,但手册页不建议这样做.
编辑:由于某种原因usermod -p
,无法在面料上工作.
同样,我尝试了一个(有点不安全)mikej的答案,确实解决了这个问题:
# connecting & running as root. from fabric.api import * from fabric.contrib import files files.append("%s\n%s" % (passwd, passwd), '.pw.tmp') # .pw.tmp: # PASSWD # PASSWD run("passwd %s < .pw.tmp" % user) run("rm .pw.tmp")
这不是一个非常优雅的解决方案,但它的工作原理.
谢谢你的阅读.
布赖恩
您可以passwd
使用echo
例如提供新密码和旧密码
echo -e "oldpass\\nnewpass\\nnewpass" | passwd
(-e
用于echo
解释反斜杠转义的选项,以便将换行符解释为此类)
诀窍是使用usermod
和Python的组合crypt
来更改密码:
from crypt import crypt from getpass import getpass from fabric.api import * def change_password(user): password = getpass('Enter a new password for user %s:' % user) crypted_password = crypt(password, 'salt') sudo('usermod --password %s %s' % (crypted_password, user), pty=False)
我在Ubuntu 11.04上使用chpasswd
fabric.api.sudo('echo %s:%s | chpasswd' % (user, pass))
注意:通常此模式不起作用:
$ sudo echo bla | restricted_command
因为只有'echo'获得了提升权限,而不是'restricted_command'.
但是,这里有效,因为当fabric.api.sudo使用shell = True(默认值)进行caled时,fabric会像这样组装命令:
$ sudo -S -p/bin/bash -l -c " "
sudo生成一个新的shell(/ bin/bash),以root权限运行,然后该升级的shell运行该命令.
使用sudo管道的另一种方法是使用sudo tee: