2010-06-20 72 views
8

我想通过fabric在远程Ubuntu 10.4框中更新我的密码。通过Python/Fabric从命令行更改Unix密码

我希望我的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的方式。

用什么命令可以通过fabric在Ubuntu 10.4上更改用户密码?

编辑: 我看了一眼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") 

这不是一个很优雅的解决方案,但它的工作原理。

谢谢您的阅读。

布赖恩

+0

注意,上清醒,参数为'usermod命令-p'是“的加密密码,(3)由作为隐窝返回”使用SHA-512不明文。 usermod页面中的警告相当于说“你会在短时间内将(通常隐藏的)/ etc/shadow的哈希内容放入进程表中”,这取决于你的安全要求,可能并不是那么简单揭示。 – msw 2010-06-20 21:33:40

回答

14

你可以使用echo例如饲料新老密码为passwd

echo -e "oldpass\\nnewpass\\nnewpass" | passwd 

(该-e选项echo使得反斜线的解释逃脱这样的换行被解释为这样)

+0

@Mikej - 感谢您的回复。我一直在尝试这个,但我有我认为是逃避麻烦。特别是'run(“echo -e \”%s \\%s \\%s \“|/usr/bin/passwd”%(old_pw,new_pw,new_pw))'不起作用“UNIX密码:passwd:身份验证令牌操作错误”) – 2010-06-20 19:33:26

+0

您可能需要对\(一次用于Python,一次用于回显)进行双重转义,例如'\\\\ n'为每个换行 – mikej 2010-06-20 19:41:53

+0

@Mikej:当我从命令行运行它时,它工作正常。但是,当我通过'fabric'运行它时,我得到以下结果:'UNIX密码:输入新的UNIX密码:重新键入新的UNIX密码:passwd:身份验证令牌操作错误' – 2010-06-20 19:43:26

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) 
+1

不错!我想补充一点,在询问密码时使用getpass而不是提示可能是个好主意。 – 2013-02-14 17:30:49

+0

@ManuelCeron很好的电话! – Roshambo 2013-02-14 17:35:18

+1

用于'crypt'的salt只能是[a-zA-Z0-9./]中的两个字符,所以'salt'与'sa'相同,请参见[docs](http://docs.python.org /2/library/crypt.html#crypt.crypt)。 – schemacs 2014-03-05 06:03:09

3

出于兴趣,我必须在Solaris盒子集合(添加大量用户,设置其密码)上执行类似的任务。 Solaris usermod没有--password选项,所以过去我使用Expect来做到这一点,但是编写Expect脚本可能会很痛苦。

所以这次我要使用Python的crypt.crypt,直接编辑/ etc/shadow(当然有备份)。 http://docs.python.org/release/2.6.1/library/crypt.html

评论者建议使用各种回声咒语管道passwd。 AFAIK这将不会工作,因为passwd被编程为忽略来自stdin的输入并且只接受来自交互式tty的输入。请参阅http://en.wikipedia.org/wiki/Expect

5

我在Ubuntu 11上使用chpasswd。04

fabric.api.sudo('echo %s:%s | chpasswd' % (user, pass)) 

注: 通常这种模式不起作用:

$ sudo echo bla | restricted_command 

,因为只有 '回声' 获取更高的权限,而不是 'restricted_command'。

然而,在这里它的工作原理,因为当fabric.api.sudo是caled 与壳= True(默认),面料组装这样的命令:

$ sudo -S -p <sudo_prompt> /bin/bash -l -c "<command>" 

须藤产生一个新的shell(/ bin中/ bash),以root权限运行,然后该升级的shell运行该命令。

另一种方式与管须藤是使用sudo tee