expect 出错

这里是几个 expect 脚本错误解析,首先看第一个:

#!/usr/bin/expect
set timeout 60
set host  ip-address
set name user-name
set password your-password
spawn ssh $name@$host

expect {
    "yes" {send "yes\n"}
    "password:" {send "$password\n"}
}

interact

该脚本在登陆了一次以后也就是说将信息加入到了本地的 known_hosts 之后是不会出错的,但是在第一次登陆时,会出现如下错误:

#./ssh.sh
spawn ssh user-name@ip-address
The authenticity of host 'ip-address (ip-address)' can't be established.
RSA key fingerprint is 06:e8:3a:5f:4b:8d:59:78:c0:79:dc:8c:57:a3:f8:10.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ip-address' (RSA) to the list of known hosts.
user-name@ip-address's password:

系统停在那儿,直到你输入密码。原因很简单,在 "yes" 这个条件满足之后,发了 yes,但是在接下来 ssh 要求输入密码时,没有了 expect/send 对,也就造成了上面的错误。解决办法可以在 send 之后继续加上需要的 expect/send 对:

"yes" {send "yes\n";expect "password" ;send "$password\n"}

或者像下面这样写,更漂亮些:

#!/usr/bin/expect
set timeout 60
set host  ip-address
set name user-name
set password your-password
spawn ssh $name@$host

expect {
      "yes" {
           send "yes\r"
           expect {
               "password" {send "$password\r"}
                       }
           }
       "password" { send "$password\r"}
}
interact

下面这个脚本实现同样的功能:

#!/usr/bin/expect
set timeout 60
set host ip-address
set name user-name
set password your-password
spawn ssh $name@$host

expect {
      "yes" {
           send "yes\n"
           expect  "password:"
           send "$password\n"
           }
       "password:"{
                    send "$password\n"
                   }
}

interact

但是在执行时会出现如下的错误:

#./ssh.sh
spawn ssh user-name@ip-address
extra characters after close-quote
    while executing
"expect {
       "yes" {
           send "yes\n"
           expect  "password:"
           send "$password\n"
           }
       "password:"{
…"
    (file "./3.sh" line 8)

在 plutoid.h 同学的帮助下,找到了产生错误的原因,"password:" 右边的 “ 要跟其后的 { 有空格分开;并且在整个脚本中除了第一行的 # 井号外,接下来不能出现任何的 # 井号,这也就是说不能有任何的注释了。

Deepin 这个基于 Ubuntu 发行的版本中有一个叫 fq(你懂的) 的命令,没有安装该系统的同学点击这里下载 deepin-tools 包。
   
解压缩后 fq 在 usr/local/bin/ 目录下,该脚本我在 CentOS 以及 Ubuntu 11.04 下第一次 ssh 登陆,测试均未通过,出现错误的原因上面已经说了。

expect 这个以 TCL(Tool Command Langauge) 交互式语言为基础的工具的更详细的语法规则可以看这里这里是一份中文翻译。

  • http://shellexy.info/ Shellexy

    博士你好淡疼,早说了安装 putty-tools 就有 plink 可用了

    • http://jaseywang.info jaseywang

      我只是想找到错误的原因的~