tuneoの日記: Python力を高める:初期パスワードを指定して多数のユーザを一括作成
/etc/passwdにエントリ追記すればいいじゃーん、と軽く考えてコーディングを始めた。まずは一番面倒くさい暗号化済みパスワードの作り方だが、これはPython3だとcryptモジュールですべて事足りるから恐ろしい。
import crypt
plain_password="foobarbaz"
print(crypt.crypt(plain_password, crypt.mksalt()))
はいおしまい。Python2の場合は自前でsaltをこしらえないといけないのだが、これもrandom.sample()とか使えばいいと思う。
import string
import random
import crypt
salt_letters = string.ascii_letters + string.ascii_digits + './'
def mksalt(method = 6, length = 8):
return "$%d$%s" % (method, "".join(random.sample(salt_letters, length)))
plain_password="foobarbaz"
print crypt.crypt(plain_password, mksalt())
あとは/etc/の下のpasswdとかshadowとかいじくればいいわけで、これも自前でやるのはかったるいからcsvモジュールを使った(そしてドはまりした)。何がハマったって、何度やってもログインできないのだ。生成したパスワードをコピペしてエントリを手で書けばログインできるのに!
……ということでdiffを取ってみたら「手書き」とcsvモジュールで書いたエントリは同じ内容に見えるのだが「違う」らしい。
# cat -A /etc/passwd | grep newuser1
newuser1:x:10001:10001:New User 1:/home/newuser1:/bin/bash^M$
はい、キャリッジリターン先生っすね。csvモジュールのヘルプ見直したら「デフォルトの行区切りはWindows」って書いてあったのに華麗に見落としてましたとさ。ちゃんちゃん。
Python力を高める:初期パスワードを指定して多数のユーザを一括作成 More ログイン