Bri*_*unt 8 python unix passwords passwd fabric
我想用一种方法在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))
Run Code Online (Sandbox Code Playgroud)
不幸的是,我所知道的唯一一个命令让一个人更改密码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")
Run Code Online (Sandbox Code Playgroud)
这不是一个非常优雅的解决方案,但它的工作原理.
谢谢你的阅读.
布赖恩
mik*_*kej 14
您可以passwd
使用echo
例如提供新密码和旧密码
echo -e "oldpass\\nnewpass\\nnewpass" | passwd
Run Code Online (Sandbox Code Playgroud)
(-e
用于echo
解释反斜杠转义的选项,以便将换行符解释为此类)
Ros*_*mbo 10
诀窍是使用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)
Run Code Online (Sandbox Code Playgroud)
我在Ubuntu 11.04上使用chpasswd
fabric.api.sudo('echo %s:%s | chpasswd' % (user, pass))
Run Code Online (Sandbox Code Playgroud)
注意:通常此模式不起作用:
$ sudo echo bla | restricted_command
Run Code Online (Sandbox Code Playgroud)
因为只有'echo'获得了提升权限,而不是'restricted_command'.
但是,这里有效,因为当fabric.api.sudo使用shell = True(默认值)进行caled时,fabric会像这样组装命令:
$ sudo -S -p <sudo_prompt> /bin/bash -l -c "<command>"
Run Code Online (Sandbox Code Playgroud)
sudo生成一个新的shell(/ bin/bash),以root权限运行,然后该升级的shell运行该命令.