Expect脚本是一个很棒的Linux/Unix实用程序。我在日常生活中不得不处理很多Unix服务器,无论是在工作中还是在我的托管服务器上。所以我需要记住很多SSH用户,他们的密码,然后是SU用户和密码。当服务器的数量很大时,情况会有些混乱。因此,我想编写一个脚本,让我自动登录到服务器。当我第一次开始这方面的工作时,我被困在如何输入SSH密码上,因为当系统提示它登录时,普通的Unix外壳程序没有任何方法发送密码。然后我开始了解‘Expect脚本’,它允许自动与打开终端进行输入的程序交互。
Expect脚本
Expect脚本 非常容易学习,顾名思义,它的工作原理是解析命令的输出,当它与指定的正则表达式匹配时,它会处理指定的指令。
Expect脚本SSH示例
下面是我创建的脚本,用于自动登录到SSH服务器,然后以超级用户身份登录,然后运行一个简单的命令。sshudologin.expect
1#!/usr/bin/expect
2
3#Usage sshsudologin.expect <host> <ssh user> <ssh password> <su user> <su password>
4
5set timeout 60
6
7spawn ssh [lindex $argv 1]@[lindex $argv 0]
8
9expect "yes/no" {
10 send "yes\r"
11 expect "*?assword" { send "[lindex $argv 2]\r" }
12 } "*?assword" { send "[lindex $argv 2]\r" }
13
14expect "# " { send "su - [lindex $argv 3]\r" }
15expect ": " { send "[lindex $argv 4]\r" }
16expect "# " { send "ls -ltr\r" }
17interact
Expect脚本要点
1.请注意第一行,它指定Expect脚本将用作解释器。
2.Expect脚本默认超时为10秒,所以我将超时设置为60秒,以避免在登录提示需要时间的情况下出现超时问题。
3.注意expect
命令后跟正则表达式,然后是应该作为响应发送的内容。添加第一个是/否选项,以确保在尚未导入远程服务器密钥的情况下不会失败。
4.另一个Expect常规expressions因服务器而异,对于我的服务器,它以#
结尾,但对于其他一些服务器,它可能以$
结尾,因此您可能需要相应地对其进行编辑。唯一需要检查的是Expect命令的正则表达式应该匹配,这样它就会发送相应的命令或密码。
5.最后一个Expect命令只显示我们在登录到服务器后也可以发送命令。
下面是我使用正确的参数运行上述expect脚本时的输出。
1pankaj@Pankajs-MacBook-Pro:~$/Users/pankaj/scripts/sshloginsudo.expect 'journaldev.com' 'pankaj' 'ssh_pwd' 'su_user' 'su_pwd'
2spawn ssh [email protected]
3[email protected]'s password:
4Last login: Sun Jun 9 19:54:17 2013 from c-67-161-57-160.hsd1.ca.comcast.net
5pankaj@journal [~]# su - su_user
6Password:
7su_user@journal [~]# ls -ltr
8total 708
9...
Expect脚本的额外提示
1.Expect脚本可以重复使用,因为所有信息都是作为参数传递的,所以最好为每个信息创建别名,以便快速登录,并节省您键入所有参数的时间。例如,alias journal=
/Users/pankaj/scripts/sshloginsudo.expect‘JouralDev.com’‘pankaj’‘ssh_pwd’‘su_user’‘su_pwd’``
2.最好使用单引号来传递参数,因为大多数情况下,密码包含特殊字符,如果不用引号引起来,这些字符可能会导致有趣的结果。
注意 :上面的脚本是在Mac OS和Linux系统上测试的。参考资料:SourceForge页面