2010-07-21 65 views
1

我想自动化ssh登录。经过一番研究,似乎tcl/expect是要走的路线。自动化ssh登录:tcl expect交互命令行为怪异

但是,我的问题是,当交互接管我的终端,东西不能按预期工作(双关语不是预期的)。

例如,如果我调整终端大小,它不会“取”。另外,有时互动不响应,有时它只是无缘无故地挂起。我在下面列出了我的代码。我的代码问题是,我错过了什么?

另外,有没有更好的方法来做到这一点(与另一种脚本语言?)我需要终端非常灵敏,没有比在手持式控制台上手动键入ssh没有什么不同。

proc Login {username server password} { 
    set prompt "(%|>|\#|\\\$) $" 

    spawn /usr/bin/ssh [email protected]$server 
    expect { 
     -re "Are you sure you want to continue connecting (yes/no)?" { 
      exp_send "yes\r" 
      exp_continue 
      #continue to match statements within this expect {} 
     } 

     -nocase "password: " { 
      exp_send "$password\r" 
      interact 
     } 
    } 
} 
+2

大概你不能使用'ssh-keygen'生成认证的RSA/DSA密钥? – 2010-07-21 18:39:20

回答

4

你提出的关于'交互'的问题并没有注意到窗口已经改变了大小,因为默认情况下,交互只监视字符流。调整窗口大小时,会产生一个WINCH信号。默认情况下,Expect具有默认的操作,即忽略它。您应该使用Expect的陷阱命令来捕获SIGWINCH。然后你可以做你想做的事 - 例如,把新的尺寸传播给对方或采取其他的本地行动。

您可以在Expect的示例脚本中找到这样的示例。有关如何处理SIGWINCH的Expect书中的解释和示例。

0

由于W.克雷格交易提到了评论,“正确”的方式做到这一点是使用ssh-凯基生成用于认证的密钥。

您可以通过设置-o StrictHostKeyChecking=no来避免“继续”提示。