【问题标题】:How to use expect to automatically enter SSH passphrase?如何使用expect自动输入SSH密码?
【发布时间】:2017-01-30 21:33:11
【问题描述】:

我知道与此相关的风险,但我仍然想这样做。

我尝试过其他答案,但没有成功。

基本上我只想在启动时打开那个 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 other_user@other_host
expect "*passphrase*"
send "my passphrase\r"

我得到的结果是,Java 进程都没有继续运行(如果它甚至完全启动),SSH 连接也没有保持活动状态(如果它甚至完全启动并且密码短语正确插入send 命令)。

我在这里做错了什么?

谢谢!

【问题讨论】:

  • 您为什么同时使用密钥和密码?如果您在终端中单独键入ssh 命令会发生什么?
  • 它会询问我的密码。密码与私钥相关联
  • 如果您愿意编写脚本并在脚本中硬编码密码,为什么不以未加密的形式存储密钥?您也可以为此创建一个专用密钥,以防您为其他主机使用相同的密钥。
  • @PedroD : 在最后一行添加expect eof
  • 酷,脚本完成后 ssh 连接继续工作。但是没有创建java进程。

标签: bash shell ssh expect


【解决方案1】:

最好试试 autoexpect,应该可以。

通过使用

 sudo yum install expect

或 sudo apt-get install 期望

安装完成后。输入命令autoexpect

它将显示如下消息:

Autoexpect started, file is script.exp

在此之后只需手动执行活动,并为您编写一个脚本。

这是一个例子 Automating-with-Expect-Scripts

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • Ok @rghome 够了,这里是摘录,安装 Autoexpect。通过使用 sudo yum install expect 或 sudo apt-get install expect。安装完成后。输入命令 autoexpect 它将显示如下消息: Autoexpect 已启动,文件为 script.exp 之后只需手动执行活动,并为您编写脚本。
【解决方案2】:
  1. 对于spawn java:Expect 的 spawn 不理解 &lt;&amp;&gt;&amp;。您可以使用 Tcl 的 exec 命令,因为您不与 Java 命令交互。

    exec java -jar client.jar &lt; /dev/null &gt;&amp; /dev/null &amp;

  2. 对于spawn ssh:正如Dinesh 所指出的,您必须添加expect eof 否则它不会等待ssh 进程退出。

【讨论】:

  • @pedrod,如果您希望能够在 ssh 会话中以交互方式键入命令,请使用 interact 而不是 expect eof
猜你喜欢
  • 2016-01-08
  • 2015-05-03
  • 2012-08-25
  • 2019-02-24
  • 1970-01-01
  • 2015-08-27
  • 2010-11-24
相关资源
最近更新 更多