2010-06-20 28 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