2010-05-12 14 views
6

所以我想自动化我的SSH登录。我使用的主机不允许在此服务器上进行密钥验证,所以我必须更具创造性。使用期望(1)的SSH登录。如何退出预期并保持在SSH中?

我对shell脚本知之甚少,但是一些研究向我展示了命令'expect'和一些使用它的脚本来达到这个目的。我建立了一个脚本并运行它,它完美地登录。

#!/usr/bin/env expect -f 

set password "my_password" 

match_max 1000 

spawn ssh -p 2222 "my_username"@11.22.11.22 

expect "*?assword:*" 
send -- "$password\r" 
send -- "\r" 

expect eof 

最初,它应该运行。

Last login: Wed May 12 21:07:52 on ttys002 
esther:~ user$ expect expect-test.exp 
spawn ssh -p 2222 [email protected] 
[email protected]'s password: 
Last login: Wed May 12 15:44:43 2010 from 20.10.20.10 


-jailshell-3.2$ 

但这就是成功结束的地方。

命令不起作用,但按回车只是换了新的一行。 箭头键和其他非字母数字键产生符号,如'^ [[C','^ [[A','^ [OQ'等] [1]

除了expect脚本最初创建的两个外,没有其他提示。 任何被忽略的命令都会由我的本地shell执行,一旦期望超时。 一个例子:

-jailshell-3.2$ whoami 
ls 
pwd 
hostname 

(...时间的推移,预计超时...)

esther:~ user$ whoami 
user 

esther:~ ciaran$ ls 
Books  Documents Movies  Public  
Code  Downloads Music  Sites  
Desktop  Library  Pictures expect-test.exp 

esther:~ ciaran$ pwd 
/Users/ciaran 

esther:~ ciaran$ hostname 
esther.local 

正如我所说,我没有shell脚本的经验,但我认为这是因为正在引起我仍然“期待”,但不是“内部”的SSH。有没有办法在我登录后终止期望,并让它将SSH会话交给我?

我已经尝试过像'close'和'exit'这样的命令,在“send - ”\ r“”之后。是的,他们做我想要的东西并期待死亡,但是它斗气地将SSH会话与它一起下来,让我回到我开始的地方。我真正需要的是期望完成工作并终止,将SSH会话留在我的手中,就好像我手动完成一样。

所有帮助表示赞赏,谢谢。 [1]我知道这有一个名字,但我不知道它是什么。这是无法搜索的可怕事物之一,因为忽略标点字符。作为一个侧面问题,这里有什么故事?

回答

2

我已经使用了类似的脚本来自动登录。

我用“互动”,我删除了“expect eof”。通过这样做,我可以返回屏幕,以便我可以手动输入命令。

expect "?assword: " 
send -- "$password\r" 
expect "$" 
interact 
0

把他们放在一起,让您登录,让你在命令行上完全一样,虽然你手动

#!/usr/bin/expect -f 
set ip "127.001.001.001" 
set password "xxyykkx" 
spawn ssh $ip -l root 
expect "?assword:" 
send "$password\r" 
interact 
键入它