原文地址:http://hi.baidu.com/test/blog/item/d064d0163b799f1
批量修改linux密码
2007-04-03 20:22在某些redhat issue中(报歉,REDHAT的发行版我用过的并不是太多,所以只能言“某些”),更改密码可以用
passwd –stdin user
从标准输入中读取密码,所以用户可以在脚本中使用如
echo “NewPasswd” | passwd –stdin username
这种方式来批量更改密码
但在其它的一些发行版(如Debian/Suse)所提供的passwd并不支持‘–stdin‘这个参数
此时,我们有另外一种选择 chpasswd
在基于debian的系统中,该程序随“passwd”包提供,在suse9中,该程序由“pwdutils”包提供(可能在redhat系统中也提供了这个工具,我就不太清楚了)。
chpasswd命令从标准输入中读取信息,例如
echo “username:password” |chpasswd
格式是“Username:Password”
更加方便的是,你可以一次性更改多个用户的密码。
例如有文件passwd.txt,内容如下:
user1:passwd1
user2:passwd2
user3:passwd3
执行
chpasswd <passwd.txt
将一次更改user1,user2,user3三个用户的密码。
(或 echo -e “user1:passwd1\nuser2:passwd2\nuser3:passwd3″ |chpasswd ,显然--过多过长的输入会令你眼花,然后出错)
唯一的困扰是基于安全的理由--没有及时删除掉的密码文件(passwd.txt)、命令行的历史(history),可能会泄漏一些敏感信息。除此之外,我个人认为这是个很方便的工具。
注意:不同发行版所提供的chpasswd返回值是不同的,在Debian/Ubuntu上chpasswd出错会返回非0值,而suse下的chpasswd出现错误也会返回0,唯一相同的是在正确执行的情况下,什么都不输出。
-------------------------------------------
下面是一个简单的用例:
#!/bin/bash
[ $# -ne 1 ] && echo “Usage: $0 UserName” && exit 1
echo -n “Input new password:”
read -s P
echo
echo -ne “User: ${1}\tPassword: ${P}, ensure?(y/N)”
read CONFORM
case “${CONFORM}” in
Y|y|yes|Yes|YES)
;;
*)
echo “Operation cancelled by user. Bye!”
exit 2
;;
esac
for HOST in `cat list`
do
echo -n “Setting password for ${1} on ${HOST} … ”
RET=$(echo “$1:$P” |ssh -l root ${HOST} “chpasswd 2>&1|wc -l”)
#此处不判断返回值,在有些发行版(如SUSE9)中,chpasswd返回值并不可靠。
if [ $RET -eq 0 ]
then
echo OK
else
echo ERR
fi
done