前言:windows下有keypass或者lasspass帮助我们自动登录服务器,其实xshell等终端工具也包含了 expect方式设置自动登录服务器,不需要每次输入复杂不容易记忆的密码。linux下在没有设置ssh信任时候大量操作服务器也需要自动登录甚至在自 动登录后执行一些命令,或者使用定时任务(cron)定期自动登录交换机作一些操作以及取相应日志。当这些需求出现的时候需要在无人职守情况下让程序自动 操作,这就是expect语言的作用(类似于tcl语言),一下是一个在linux机器上ssh登录远程服务器的脚本

1  首先确保安装了expect

rhel/centos/fedora  yum install expect

ubuntu/debian  apt-get install expect

opensuse yast2 -i expect/zypper in expect

gentoo emerge expect

archlinux pacman -S expect

2 主程序

#!/usr/bin/expect    #设置解析器 
set timeout 10   #设置超时时间
set password1089 ***** 
set passwordvps *****
set passwordkvm26 *****
set password4150 *****  #以上密码我隐藏了 
set file1 [lindex $argv 0]  #程序第一个参数
set port [lindex $argv 1]  #程序第二个参数
if {$port==""} {
set port 22
}   #设置登录的默认ssh端口是22  ,假如程序只有一个参数(也就是设计的服务器的代码)表示默认的是22
if {$argc>2} {
puts stderr "参数错误,请使用以下格式: $argv0 {想去的服务器简称,比如89  端口(默认是22)} "
exit 1   #设置当参数出现错误的提示信息,这里没有太强的逻辑性,当参数多于2个就会弹这个错误
}
if {$file1=="89"} {    #当程序的第一个参数是89  执行这个代码块,以下的类似,当然可以写成switch形式的

spawn luit -encoding gbk ssh -p $port root@192.168.10.89   #必须加spawn  luit是我自己的设计,它是一个命令,但是需要手动安装,因为当我登录远程服务器可能因为编码出现一些错误,但是不能随意改变远程服务器的编码 locale,只是我登录的这个终端使用我设计的编码,我这里是gbk编码。去掉这个额外的设置是:spawn  ssh -p $port root@192.168.10.89

expect "password:"   #这里表示等待出现 "password:"
send "$password1089\n"  #然后发送数据  记住需要回车
interact  #表示执行完登录到远程服务器后可以自由使用,要不然登录上去什么也作不了,在这里就可以继续执行其他命令操作
} elseif {$file1=="58"} {   #tcl语言控制结构的语法是  if... elseif ... else
spawn luit -encoding gbk ssh -p 9922 root@192.168.8.58
expect "password:"
send "****\n"   #这里我没有设置变量 而是直接将相应字符串写进来
interact
} elseif {$file1=="26"} {
spawn luit -encoding gbk ssh -p 61300 root@10.14.22.26 -X -C
#expect "password:"
#send "$passwordkvm26\n"
interact
 } elseif {$file1=="150"} {
spawn luit -encoding gbk ssh -p $port root@192.168.4.150
expect "password:"
send "$password4150\n"
interact
} elseif {$file1=="62"} {   #这里是使用rdesktop登录windows机器 ,其中密码我隐藏了
spawn rdesktop -u admin -p **** -f -r clipboard:PRIMARYCLIPBOARD -r disk:sunray=/home/dongwm 192.168.10.62:63005
interact
} elseif {$file1=="63"} {
spawn rdesktop -u admin -p **** -f -r clipboard:PRIMARYCLIPBOARD -r disk:sunray=/home/dongwm 192.168.10.63:63005
interact
} else {  #这里设置的是当第一个参数不是我设计的那些参数是默认的操作方式  比如我可以直接写服务器的ip 或者  /etc/hosts指定的hosts
spawn luit -encoding gbk ssh -p $port root@$file1
interact
}

3 使用方式:

dongwm@linux-b8lh:~> chmod +x /home/dongwm/bin/op
dongwm@linux-b8lh:~> op 150
spawn luit -encoding gbk ssh -p 22 root@192.168.4.150
root@192.168.4.150's password:
Last login: Tue Feb  7 14:57:56 2012 from 192.168.8.46
[root@gyyx-as5 ~]# exit
logout

Connection to 192.168.4.150 closed.
dongwm@linux-b8lh:~> op 26
spawn luit -encoding gbk ssh -p 61300 root@10.14.22.26
Last login: Tue Feb  7 15:18:25 2012 from 192.168.8.46
[root@localhost ~]# exit
logout

Connection to 10.14.22.26 closed.
dongwm@linux-b8lh:~> op mta1 61002  
spawn luit -encoding gbk ssh -p 61002 root@mta1  #mta1 是我hosts指定的一个服务器的别名
Last login: Tue Feb  7 11:51:13 2012 from 124.193.159.8
[root@mail ~]# exit
logout

4  设置PATH

1   用户定制  本用户可以直接执行op

编辑用户家目录下的.profile  #个人习惯
添加一行
export PATH=$PATH:/home/dongwm/bin

2 全局用户动能使用 直接修改/etc/profile