【问题标题】:Linux expect not returning control to bash script after using interactLinux期望在使用interact后不会将控制权返回给bash脚本
【发布时间】:2016-09-23 10:44:06
【问题描述】:

我的目标是自动化以下操作

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

这可能吗,还是我必须通过 expect 做所有事情?

【问题讨论】:

  • 什么不起作用?展示一些我们可以看到的证据。在启用调试的情况下运行 expect 通常很有帮助,这样您就可以看到发生了什么 (expect -d script.exp)

标签: linux automation tcl expect


【解决方案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 不知道如何成为虚拟终端的主端;expectsshd 确实知道)。

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

Expect 从argv 变量中获取参数,可以使用gets stdin 从其调用方读取一行文本,并使用open/read/close 拉入文件的内容。


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

spawn ssh $remotehost sudo /usr/local/bin/DoTheWonderfulThing

这种事情一旦奏效,就不会以意想不到的方式出错……

【讨论】:

  • 谢谢,这是对我所面临问题的一​​个很好的总结。将给出其中一些建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
相关资源
最近更新 更多