9

所以我想自动化我的 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$ 

但这就是成功的终点。

命令不起作用,但按回车键只会换行。箭头键和其他非字母数字键产生像'^[[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 脚本编写经验,但我认为这是因为我仍然“在”expect 的“内部”,而不是“在”SSH 的“内部”。有什么方法可以在我登录后终止期望,并让它将 SSH 会话交给我?

在“send --”\r“”之后,我尝试过像“close”和“exit”这样的命令。是的,他们做我想做的事并期望死亡,但它报复性地取消了 SSH 会话,让我回到了开始的地方。我真正需要的是让 expect 完成它的工作并终止,让 SSH 会话回到我的手中,就像我手动完成一样。

感谢所有帮助,谢谢。[1] 我知道这个有一个名字,但我不知道它是什么。这是无法用谷歌搜索的可怕事物之一,因为标点符号被忽略了。作为一个附带问题,这里有什么故事?

4

3 回答 3

19

我想你的问题已经在这里解决了:

使用期望将密码传递给 ssh

您要查找的命令是interact. 它将控制权交给您/您的键盘。

于 2010-05-12T22:10:41.920 回答
3

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

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

expect "?assword: "
send -- "$password\r"
expect "$"
interact
于 2013-10-07T00:29:42.943 回答
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
于 2016-03-24T10:52:25.527 回答