所以我想自动化我的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]我知道这有一个名字,但我不知道它是什么。这是无法搜索的可怕事物之一,因为忽略标点字符。作为一个侧面问题,这里有什么故事?