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

Bash 使用expect(1)进行SSH登录。如何退出expect并保留在SSH中?,bash,shell,ssh,expect,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 "*?a

所以我想自动化我的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脚本创建的两个提示之外,不会出现其他提示。 一旦expect超时,任何被忽略的命令都将由本地shell执行。 例如:

-jailshell-3.2$ whoami
ls
pwd
hostname
(…时间流逝,预计超时…)

正如我所说,我没有编写shell脚本的经验,但我认为这是因为我仍然处于expect的“内部”,而不是SSH的“内部”。有没有办法在我登录后终止expect,并让它将SSH会话移交给我

我尝试过在“发送--”“\r”之后使用诸如“关闭”和“退出”之类的命令。是的,它们执行我想要的操作,但却会导致SSH会话死机,让我回到开始的位置。我真正需要的是让expect执行其工作并终止,让SSH会话回到我手中,就像我手动操作一样

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

我想你的问题以前已经解决了:


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

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

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

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

把所有这些放在一起,让您登录并留在命令行上,就像您手动键入一样

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