2016-09-22 63 views
0

我意识到与此相关的风险,但是我仍然想要这样做。如何使用expect来自动输入SSH密码?

我试图遵循其他答案,但没有成功。

基本上所有我想要的是在启动时打开该SSH隧道。所以我正在制作一个脚本,我可以在系统启动时将cron作业放在处。

到目前为止,脚本是这样的:

#!/usr/bin/expect -f 
spawn java -jar client.jar </dev/null &>/dev/null & 

spawn ssh -fN -i /home/my_user/.ssh/id_rsa -R 20001:localhost:22 [email protected]_host 
expect "*passphrase*" 
send "my passphrase\r" 

结果我这个得到的是,无论是Java进程保持运行(如果在所有甚至推出),并且无论是SSH连接保持活着(如果它甚至启动并且密码由send命令正确插入)。

我在这里做错了什么?

谢谢!

+0

为什么你同时使用密钥和密码?如果你自己在终端输入'ssh'命令,会发生什么? – redneb

+0

它问我密码。密码与私钥关联 – PedroD

+2

如果您愿意编写脚本并在脚本中对密码进行硬编码,为什么不以未加密的形式存储密钥?如果您为其他主机使用相同的密钥,您也可以为此创建一个专用密钥。 – redneb

回答

-1

更好的尝试autoexpect,这应该工作。

通过使用

sudo yum install expect 

或 命令和apt-get安装期望

一旦安装完成。键入命令autoexpect

它会显示一个消息,象下面这样:

Autoexpect started, file is script.exp

在此之后只是手动执行的活动和脚本为你写的。

这里有一个例子 Automating-with-Expect-Scripts

+0

虽然这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/13758827) – rghome

+0

Ok @rghome Fair足够了,这里是摘录,安装Autoexpect。通过使用sudo yum install expect或sudo apt-get install expect。一旦安装完成。键入命令_autoexpect_ 它会显示如下消息: Autoexpect started,file is script.exp 之后只需手动执行该活动,并为您编写脚本。 – user6863772

+0

你能编辑答案吗? – rghome

1
  1. 对于产卵的java:期待的spawn不明白<&>&。您可以使用Tcl的exec命令,因为您没有与Java命令交互。

    exec java -jar client.jar </dev/null>& /dev/null &

  2. 对于产卵SSH:作为Dinesh指出,必须添加expect eof或者它会不会等待ssh进程退出。

+0

@pedrod,如果您希望能够在ssh会话中交互式输入命令,请使用'interact'而不是'expect eof' –