![通过 SSH 连接到现有用户上下文的最佳方式](https://linux22.com/image/63058/%E9%80%9A%E8%BF%87%20SSH%20%E8%BF%9E%E6%8E%A5%E5%88%B0%E7%8E%B0%E6%9C%89%E7%94%A8%E6%88%B7%E4%B8%8A%E4%B8%8B%E6%96%87%E7%9A%84%E6%9C%80%E4%BD%B3%E6%96%B9%E5%BC%8F.png)
我们想做的:
我们有用于运行脚本的短暂虚拟机。虚拟机通过 SSH 来执行“构建”(脚本序列),并在所有脚本完成后被丢弃。每个脚本都通过新的 SSH 连接/会话运行。
这对于我们拥有的几乎所有场景都非常有效,除了两个主要用例:
- 当脚本必须控制安装在虚拟机上的 iOS 模拟器时(这是我们目前要解决的主要用例) - 技术说明:iOS 模拟器只能从 GUI 上下文中正确控制,现在我们使用一个特殊的基于 Go 的迷你服务器(https://github.com/bitrise-io/xcodebuild-unittest-miniserver),当用户登录时作为启动代理启动,因此它具有用户的 GUI 上下文
- 保持对 OS X 钥匙串的访问(通过 SSH,可以打开和管理 OS X 钥匙串,但一旦 SSH 会话关闭,钥匙串就会锁定)
如果我们能够以某种方式在虚拟机内启动代理,然后我们可以连接到该特定的守护进程/代理,将我们想要运行的命令发送到守护进程/代理,并让守护进程/代理执行,那么这两个问题都可以得到解决它。要求是拥有在虚拟机内运行的实际脚本/命令的输出流。
我们现在做什么是通过简单的 SSH 命令(例如ssh ssh-params 'bash -l -c "echo \"hello world\""'
.当然,这是一个非常简化的示例,但它接近我们现在所拥有的,这样我们就可以得到输出命令作为流来满足日志记录要求,此外我们还可以获得命令的退出代码。
所以我们想要做什么类似于命令是从虚拟机“外部”指定的,但在虚拟机内部执行的输出命令的内容可作为流用于“外部”(调用者)进程,而不仅仅是在脚本完成之后,以及命令的退出代码可以通过“外部”过程轻松检索。
就工具而言,我们非常开放(我们不必依赖 SSH,这就是它目前的工作方式),但该工具应该适用于 OS X,如果可能的话也适用于 Linux(尽管在本例中是 OS X)是优先事项,因为两个有问题的用例都与 OS X 相关)。
TL;博士;我们想要一个可以类似于上述 SSH 命令使用的工具,但它可以连接到已经在远程(虚拟机)端运行的代理/守护进程,并且输出由指定的“远程命令”生成的应该可以作为流供调用者进程使用,不只是在命令末尾。除了收集远程命令的输出之外,我们还必须能够获取它的退出代码。
最后的话:我们最终决定创建自己的解决方案,因为我们找不到更简单的方法。你可以在 GitHub 上找到它:https://github.com/bitrise-io/cmd-bridge- 它支持我描述的所有必需的东西,此外它还具有命令环境变量处理支持(仅为该远程命令定义环境变量)。
答案1
您可以在虚拟机的屏幕或 tmux 会话中运行命令吗?这将允许多个步骤连接/发送命令到同一会话