使用expect(1)进行SSH登录。如何退出预期并保留在SSH中?

时间:2010-05-12 21:50:41

标签: bash shell ssh expect

所以我想自动化我的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 my_username@11.22.11.22
my_username@11.22.11.22's password: 
Last login: Wed May 12 15:44:43 2010 from 20.10.20.10


-jailshell-3.2$ 

但这就是成功的结束。

命令不起作用,但按Enter键只会换行。 箭头键和其他非字母数字键产生符号,如'^ [[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会话移交给我?

在“发送 - ”\ r“”之后,我尝试过'close'和'exit'等命令。是的,他们做了我想做的事情并且期望死去,但是它以报复性的方式将SSH会话带回来,让我回到我开始的地方。我真正需要的是期望完成它的工作并终止,将SSH会话留在我手中,就像我手动完成一样。

感谢所有帮助。 [1]我知道有一个名字,但我不知道它是什么。这是令人恐惧的事情之一,不能用Google搜索,因为标点字符被忽略了。作为一个附带问题,这里的故事是什么?

3 个答案:

答案 0 :(得分:15)

我认为你的问题在此之前已经解决了:

Using expect to pass a password to ssh

您正在寻找的命令是interact。它将控制权移交给您/您的键盘。

答案 1 :(得分:2)

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

我使用了“互动”,我删除了“期待eof”。通过这样做,我可以恢复屏幕,以便我可以手动输入命令。

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

答案 2 :(得分: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