我需要能够在我的Linux (Fedora 10)上创建用户帐户,并通过bash脚本自动分配密码(如果需要,也可以采用其他方式)。
通过Bash创建用户很容易,例如:
[whoever@server ]# /usr/sbin/useradd newuser
是否可以在Bash中分配密码,功能类似于此,但自动:
[whoever@server ]# passwd newuser
Changing password for user testpass.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[whoever@server ]#
我知道我要过几年才会有这个想法,但我不敢相信居然没有人建议用户mod。
usermod --password `perl -e "print crypt('password','sa');"` root
如果有人想在旧的HPUX上执行此操作,您可以使用usermod.sam。
/usr/sam/lbin/usermod.sam -F -p `perl -e "print crypt('password','sa');"` username
只有当执行脚本的人是当前用户时才需要使用-F。当然,您不需要使用Perl来创建散列。您可以使用openssl或许多其他命令来代替它。
您可以使用-p选项。
useradd -p encrypted_password newuser
不幸的是,这需要您自己对密码进行散列(passwd为您完成)。不幸的是,似乎没有一个标准实用程序来散列一些数据,所以您必须自己编写。
这是我编写的一个小Python脚本,用于为您加密。假设你把它命名为pcrypt,然后你可以把上面的命令行写到:
useradd -p $(pcrypt ${passwd}) newuser
这里有几个需要注意的警告。
当pcrypt运行时,任何用户都可以通过ps命令看到明文。
pcrypt使用老式的crypt函数-如果您正在使用更现代的东西,如MD5哈希,您将需要更改pcrypt。
这是pcrypt:
#!/usr/bin/env python
import crypt
import sys
import random
saltchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
def salt():
return random.choice(saltchars) + random.choice(saltchars)
def hash(plain):
return crypt.crypt(arg, salt())
if __name__ == "__main__":
random.seed()
for arg in sys.argv[1:]:
sys.stdout.write("%s\n" % (hash(arg),))
在Debian和Red Hat上都可以工作的解决方案。依赖于perl,使用sha-512散列:
cat userpassadd
#!/usr/bin/env bash
salt=$(cat /dev/urandom | tr -dc A-Za-z0-9/_- | head -c16)
useradd -p $(perl -e "print crypt('$2', '\$6\$' . '$salt' . '\$')") $1
用法:
userpassadd jim jimslongpassword
它可以有效地作为一行程序使用,但你必须自己在正确的地方指定密码、盐和用户名:
useradd -p $(perl -e "print crypt('pass', '\$6\$$salt\$')") username