Linux期望在使用交互后不将控制返回到bash脚本

时间:2016-05-25 17:16:01

标签: linux automation tcl expect

我的目标是自动化以下

  • 从主shell脚本登录到远程SSH会话(无密码密钥已经是steup)
  • 然后我需要root访问权限,所以我正在使用期望登录,即发送" su",期望"密码:",发送" " 有效。
  • 然后我想将控制从期望释放回调用expect脚本的bash脚本并运行以root身份登录的各种SSH命令。<​​/ li>

这是可能的,还是我必须做所有事情?

1 个答案:

答案 0 :(得分:1)

你遇到的问题是各个层面的沟通必须保持不变;还有比你意识到的更多。

你的模特是这样的:

+------+   expect   +-----+   su   +----------------+
| bash | ---------> | ssh | -----> | remote-context | 
+------+            +-----+        +----------------+

但实际上发生了什么:

+----------------+   +----------------------+   +----------------------------+
| local terminal |   |        expect        |   |       remote terminal      |
|                |   | +------------------+ |   | +------------------------+ |
|    +------+    |   | | virtual terminal | |   | |          bash          | |
|    | bash | -----> | |                  | |   | | +--------------------+ | |
|    +------+    |   | |     +-----+      | |   | | |         su         | | |
|                |   | |     | ssh | ---------> | | | +----------------+ | | |
+----------------+   | |     +-----+      | |   | | | | remote context | | | |
                     | +------------------+ |   | | | +----------------+ | | |
                     +----------------------+   | | +--------------------+ | |
                                                | +------------------------+ |
                                                +----------------------------+

或类似的东西(例如,我省略了与网络有关的大部分内容)。有一个很多的分层正在进行,其中大多数是你不知道的。但是因为sshexpect内运行(为了利用自动化功能),这意味着ssh正在由expect控制的本地虚拟终端中运行; bash无法直接控制,expect无法将自己从循环中切除(因为bash不知道如何成为虚拟终端的主端; { {1}}和expect 知道这一点。

相反,您需要直接在expect中编写剩余的代码,或者提供可以作为参数运行的代码(在某种意义上,可能是从文件中提取的?),它可以通过{传递{1}}。

Expect从sshd变量中获取参数,可以使用send从其来电者处读取一行文字,argv / gets stdin / open拉入文件的内容。

您是否知道read替代close?这可以配置为允许特定请求用户完全无密码操作。这对于允许系统操作而不暴露太大的安全漏洞是有用的。您还应该考虑切换到更适合自动化的sudo形式,例如:

su

这种事情一旦发挥作用,就会以意想不到的方式减少错误......