至于linux下修改顾客密码

expect主要用来实现自动和交互式任务进行通信,而不需要认为的干预。在Linux下很多的命令都是交互式的,比如密码修改的命令,无论是:passwd或者yppasswd,都要提示用户输入密码、再确认一次密码等。

本文章总结了如何手动、自动修改本地用户密码及远程机器的用户密码。对做自动化测试提供了自动修改用户密码的原理及方法。

最近管理的一批机器,有个需求是要统一修改一个帐号的用户名密码,比如将qa帐号的密码改为1234,后来还为了脚本化,很方便的执行,还使用了非交互式地修改用户的密码。简单记录一下吧。

需要的工具和安装:

应用的实例(自己碰到的):集群管理的后台网站,root用户登录页面后可以创建新用户和修改用户密码等。这时修改用户密码在Linux中就需要交互的实现,而我们从PHP中传参的时候,可以将$user,$oldpassword,$newpassword传进去,这个很容易实现,但是满足不了底层命令执行时的交互形式。此时expect封装来实现这种交互式的密码修改就再好不过了。

修改本地用户密码:
1、交互配置本地用户:
以root用户:
passwd <username>
Changing password for user dewang.
New UNIX password:
BAD PASSWORD: it is too short
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

1. 交互式配置本地用户的密码:passwd 命令

  你必须安装下面的工具和软件:

expect实现交互式密码修改的实例:

以非root用户修改自己的密码(注后面不能跟用户名,只有root用户才允许):
passwd
Changing password for user dewang.
Changing password for dewang
(current) UNIX password:
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

复制代码 代码如下:

  –修改口令的Shell脚本;

#!/bin/sh 
#  
exec expect -f “$0″ ${1+”#@”} 
set password [lindex $argv 1] 
spawn passwd [lindex $argv 0] 
sleep 1 
expect “assword:” 
send “$passwordr” 
expect “assword:” 
send “$password:r” 
expect eof 

2、非交互配置本地用户:
echo <newpasswd> | passwd –stdin <username>

echo <username>:<passwd> | chpasswd

将<username>:<passwd>对先写到一文件passwd.tmp中,然后执行
chpasswd < passwd.tmp

[root@host_221-81 ~]# passwd qa
Changing password for user qa.
New password:
BAD PASSWORD: it is too short
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.

  – Sudo访问权;

这里有几个特殊的符号相信大家都不陌生:$0 , #@ 等。。。

3、自动脚本处理:
根据passwd命令修改用户密码,格式为:xxx.sh <username>
<passwd>
#!/bin/sh
#
exec expect -f “$0″
${1+”[email protected]”}
if { $argc != 2 } {
    puts “Usage: $argv0 <username> <passwd>”
    exit 1
}
set password [lindex $argv 1]
spawn passwd [lindex $argv 0]
sleep 1
expect “assword:”
send “$password”
expect “assword:”
send “$password”
expect eof
说明:如果要通过shell直接调用expect相关命令,则开头中必须是如下格式,然后后面即可按照expect、TCL格式书写了。
#!/bin/sh
#
exec expect -f “$0″
${1+”[email protected]”}

2. 非交互式修改本地用户的密码:chpasswd

  – Apache or Lighttpd web服务器;

set password [lindex $argv 1]
这里是为变量赋值,我们将文件保存为chpasswd.sh时,执行方式为:chpasswd.sh 
username  password  而这里的[lindex $argv 1]
就是获得输入的第二个参数,对应上面就是password 。 
这里我们第一次输入的密码和第二次输入的密码的检验在在前台判断的是否为空,是否不相等,只有不为空,而且两次输入的相同的密码才会传入,总之就是其他对密码条件的限制都是在前台实现的。

根据echo <newpasswd> | passwd –stdin <username> 及 echo
<username>:<passwd> | chpasswd来修改用户密码:
#!/bin/sh

复制代码 代码如下:

  – PHP服务端程序。

spawn passwd [lindex $argv 0]
这里spawn是启动一个线程来执行的意思。即启动线程来执行passwd这个命令,$argv
0 就是我们输入的第一个参数,username

if [ $# -ne 2 ] ; then
    echo “Usage: `basename $0` <username> <passwd>”
    exit 1
fi

# chpasswd命令使用起来很简洁
[root@host_221-81 ~]# echo “qa:1234” | chpasswd
 
# 使用passwd命令,也可以实现非交互式修改密码
[root@host_221-81 ~]# echo “1234” | passwd –stdin “qa”
Changing password for user qa.
passwd: all authentication tokens updated successfully.

  步骤1:安装可以修改用户口令的shell脚本

expect
“assword:”是用来匹配字符串的,这点可以参考我们在命令行下输入passwd时的提示信息:

#echo “$2” | passwd –stdin “$1”
echo “$1:$2” | chpasswd
if [ $? -eq 0 ] ; then
    echo “change password for $1 success”
else
    echo “change password for $1 failed”
fi

3. 使用expect来处理交互式输入,从而实现非交互式的密码修改。

  该脚本可以实际用于修改Linux用户的口令(已在Linux和FreeBSD测试)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注