2011-10-11 138 views
1

我试图完成一项简单的工作通过期待。我想在Linux VM上使用“ssh-keygen”命令创建ssh密钥。我下面预计的代码看起来很直接,但它不工作:Expect脚本问题

#!/usr/bin/expect 

spawn ssh-keygen -t rsa 
expect -exact "Enter file in which to save the key (/root/.ssh/id_rsa): " 
send -- "\r" 
expect -exact "Enter passphrase (empty for no passphrase): " 
send -- "\r" 
expect -exact "Enter same passphrase again: " 
send -- "\r" 

我不想使用任何密码短语。因此为“Enter”键操作键入"\r"。 我试着用"#!/usr/bin/expect -d"运行此代码,我觉得它永远不会匹配我所提到的字符串。像如下:

... 
expect: does "" (spawn_id exp6) match exact string "Enter file in which to save the key (/root/.ssh/id_rsa): "? no 
.... 

所以我会认为,因为它是无法匹配的模式,我的脚本失败。 的问题是,为什么它是不能匹配的模式。我使用"-exact"仍然失败匹配图案。我试图玩弄"-re",但我觉得我不擅长TCL正则表达式。

你能帮忙吗? 谢谢。

回答

1

产生的程序可能会发送比正确的更多的输出,你试图匹配。这就是为什么正则表达式匹配非常有用。

试试这个:

spawn ssh-keygen -t rsa 
expect -re {Enter file in which to save the key (/root/.ssh/id_rsa): $} 
send -- "\r" 
expect -re {Enter passphrase (empty for no passphrase): $} 
send -- "\r" 
expect -re {Enter same passphrase again: $} 
send -- "\r" 
+0

谢谢格伦,你正确的正则表达式的一部分。它用于匹配模式,但expect命令的调试显示模式不匹配。只要我的脚本正常工作,我不在乎调试。谢谢。 –

1

我想你很快退出来。这一个适用于我:

#!/usr/bin/expect 

spawn ssh-keygen -t rsa 
expect "Enter file in which to save the key (/root/.ssh/id_rsa): " 
send "\r" 
expect "Enter passphrase (empty for no passphrase): " 
send "\r" 
expect "Enter same passphrase again: " 
send "\r" 
expect 
+0

谢谢Dimitre,你是正确的,我是太早退出。我从未意识到这一点。遵循Glenn的建议,我的脚本工作得很好。感谢你们。 –