Expect脚本SSH示例教程

时间:2020-02-23 14:43:59  来源:igfitidea点击:

Expect脚本是一个很棒的linux/unix实用程序。
无论是在工作还是在托管服务器上,我每天都要处理很多Unix服务器。
因此,我需要记住很多SSH用户,他们的密码,然后是SU用户和密码。
当服务器数量巨大时,这有点混乱。
因此,我想到编写一个脚本,该脚本将自动将我登录到服务器。

刚开始进行此工作时,我对如何输入SSH密码感到困惑,因为普通的unix shell在提示登录时无法发送密码。
然后,我了解了"期望脚本",该脚本允许与打开终端以供输入的程序自动进行交互。

期望脚本

期望脚本非常易于学习,顾名思义,它可以通过解析命令的输出来工作,并且当它与指定的正则表达式匹配时,它将处理指定的指令。

Expect脚本SSH示例

这是我创建的用于自动登录SSH服务器,然后以超级用户身份登录,然后运行简单命令的脚本。

sshsudologin.expect

#!/usr/bin/expect

#Usage sshsudologin.expect <host> <ssh user> <ssh password> <su user> <su password>

set timeout 60

spawn ssh [lindex $argv 1]@[lindex $argv 0]

expect "yes/no" { 
	send "yes\r"
	expect "*?assword" { send "[lindex $argv 2]\r" }
	} "*?assword" { send "[lindex $argv 2]\r" }

expect "# " { send "su - [lindex $argv 3]\r" }
expect ": " { send "[lindex $argv 4]\r" }
expect "# " { send "ls -ltr\r" }
interact

有关Expect脚本的要点

  • 请注意,第一行指定了期望脚本将用作解释器。

  • 预期脚本的默认超时为10秒,因此我将超时设置为60秒,以避免登录提示需要花费时间时出现任何超时问题。

  • 注意" expect"命令,后跟正则表达式,然后发送应作为响应的内容。
    添加第一个是/否选项,以确保如果尚未导入远程服务器密钥,则不会失败。

  • 另一个期望正则表达式在服务器之间会有所不同,对于我的服务器,它以"#"结尾,但对于其他一些服务器,它可能以" $"结尾,因此您可能需要进行相应的编辑。
    唯一要检查的是Expect命令的正则表达式应该匹配,以便它将发送相应的命令或者密码。

  • 最后一个Expect命令仅显示我们登录到服务器后也可以发送命令。

这是当我使用正确的参数运行上述期望脚本时的输出。

hyman@hymans-MacBook-Pro:~$/Users/hyman/scripts/sshloginsudo.expect 'theitroad.local' 'hyman' 'ssh_pwd' 'su_user' 'su_pwd'
spawn ssh [email protected]
[email protected]'s password: 
Last login: Sun Jun  9 19:54:17 2013 from c-67-161-57-160.hsd1.ca.comcast.net
hyman@journal [~]# su - su_user
Password: 
su_user@journal [~]# ls -ltr
total 708
...

期望脚本的另外提示

  • 由于所有信息均作为参数传递,因此期望脚本可以重复使用,因此最好为每个参数创建别名以快速登录并节省键入所有参数的时间。
    例如,
    alias journal="/Users/pankaj/scripts/sshloginsudo.expect 'theitroad.local' 'pankaj' 'ssh_pwd' 'su_user' 'su_pwd'"
  • 始终最好使用单引号来传递参数,因为大多数时候密码都包含特殊字符,如果不加引号,它们会导致有趣的结果。