linux下使用expect交互式操作
2012-02-16 11:53
453 查看
前言: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
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
相关文章推荐
- 使用linux expect进行ssh和telnet自动化登录等操作
- Linux无交互式shell 有root密码下使用expect执行root命令
- linux下shell脚本执行交互式操作命令 —【expect】
- 使用linux expect进行ssh和telnet自动化登录等操作
- 使用linux c 目录操作函数,读取任一目录下的所有目录信息文件信息
- 如何在Linux操作系统之上的MySQL数据库操作环境中使用清屏命令?
- linux 使用expect
- linux安装mysql和使用c语言操作数据库的方法 c语言连接mysql
- Linux下使用expect和另外一台机器通过SSH进行持续性交互
- 使用fdisk命令对linux硬盘进行操作
- windows下使用 Secure Shell Client工具操作linux常用命令
- linux 下 expect 的使用
- linux——使用fidsk对linux硬盘进行操作【转】
- Android使用Linux命令执行文件操作
- [Linux流操作]使用fprintf函数将字符串写入文件
- [Linux学习笔记]第1天:操作系统的发展史,linux诞生,Linux发行商,shell,terminal,shell使用技巧,文件目录,基本操作
- linux下文件的读写操作、字符串的处理操作,多线程操作等相关函数使用说明
- C++学习:使用libssh2实现交互式shell的ssh2,linux和windows通用
- linux多线程使用siglongjmp打断io操作