远程虚拟服务器
解决方案:
1 vi服务端的/etc/ssh/sshd_config
把PasswordAuthentication设成yes
把#PermitRootLogin no改为PermitRootLogin yes
2 重启服务器端的sshd服务
/etc/init.d/sshd restart
3 重启客服端的SecureCRT程序
4本文章总结了如何手动、自动修改本地用户密码及远程机器的用户密码。对做自动化测试提供了自动修改用户密码的原理及方法。
修改本地用户密码:
1、交互配置本地用户:
以root用户:
passwd Changing password for user dewang. New UNIX password: BAD PASSWORD: it is too short Retype new UNIX password: passwd: all authentication tokens updated successfully. 以非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. |
2、非交互配置本地用户:
echo | passwd --stdin |
或
echo : | chpasswd |
或
将:对先写到一文件passwd.tmp中,然后执行
chpasswd < passwd.tmp
3、自动脚本处理:
根据passwd命令修改用户密码,格式为:xxx.sh
#!/bin/sh # \ exec expect -f "$0" ${1+"$@"} if { $argc != 2 } { puts "Usage: $argv0 " exit 1 } set password [lindex $argv 1] spawn passwd [lindex $argv 0] sleep 1 expect "assword:" send "$password\r" expect "assword:" send "$password\r" expect eof |
说明:如果要通过shell直接调用expect相关命令,则开头中必须是如下格式,然后后面即可按照expect、TCL格式书写了。
#!/bin/sh # \ exec expect -f "$0" ${1+"$@"} |
根据echo | passwd --stdin 及 echo : | chpasswd来修改用户密码:
#!/bin/sh if [ $# -ne 2 ] ; then echo "Usage: `basename $0` " exit 1 fi #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 |
修改远程主机上用户密码:
1、交互配置远程用户:
echo | ssh -l root passwd --stdin |
如:
echo "newpass" | ssh -l root 10.11.103.151 passwd --stdin dewang root@10.11.103.151's password: Changing password for user dewang. passwd: all authentication tokens updated successfully. |
或
echo : | ssh -l root chpasswd 2>&1 |
或
将:对先写到一文件passwd.tmp中,然后执行
chpasswd < passwd.tmp [作者未测试]
或
ssh -l root
.... 交互输入root密码
然后执行以上的所有可用方式均可
2、非交互配置远程用户:
则需要用到expect来进行处理,通过ssh登录到远程机器,然后结合上述配置方式,以完成自动修改用户密码。
#!/usr/bin/expect #@brief to change user password by ssh remote machine proc usage {funcname} { puts "Usage: " puts " $funcname -user " puts " $funcname -root " } # check param if { $argc != 5 } { usage $argv0 exit 1 } # get param set host [lindex $argv 0] set username [lindex $argv 1] set newpasswd [lindex $argv 2] set loginname "root" if { [string compare [lindex $argv 3] "-user"] == 0 } { set loginname $username } set passwd [lindex $argv 4] puts "$host $username $newpasswd $loginname $passwd" spawn ssh -l $loginname $host expect { "*(yes/no)*" { send "yes\r"; set sshkey 1 } "*assword:*" { send "$passwd\r"; set sshkey 0 } if sshkey == 1 { expect "*password:*" send "$passwd\r" } } expect "*#" if { [string compare $loginname "root"] == 0 } { #send "echo \"$username:$newpasswd\" | chpasswd\r" send "echo \"$newpasswd\" | passwd --stdin \"$username\"\r" } else { send "passwd\r" expect { "*current*assword:" {send "$passwd\r"} "passwd: Authentication token manipulation error" {exit} } expect "New*assword:" send "$newpasswd\r" expect "Retype*assword:" send "$newpasswd\r" } expect "*#" send "exit\r" #interact 是否将交互权接过来,如果接过来,则用户这时可进行交互操作 |