SSHを介して既存のユーザーコンテキストに接続するための最良の方法

SSHを介して既存のユーザーコンテキストに接続するための最良の方法

私たちがしたいこと:

スクリプトを実行するための一時的な仮想マシンがあります。仮想マシンはSSHを介して「ビルド」(スクリプトシーケンス)を実行し、すべてのスクリプトが完了した後に削除されます。各スクリプトは新しいSSH接続/セッションを介して実行されます。

これは、2つの主なユースケースを除いて、ほぼすべてのシナリオに適しています。

  1. スクリプトが仮想マシンにインストールされているiOSシミュレータを制御する必要がある場合(これが現在私たちが解決している主なユースケースです) - 技術上の注意:iOSシミュレータはGUIコンテキストでのみ適切に制御できます。 Goベースのミニサーバー(https://github.com/bitrise-io/xcodebuild-unittest-miniserver)、ユーザーがログインすると実行エージェントとして起動されるため、ユーザーのGUIコンテキストがあります。
  2. OS Xキーチェーンへのアクセスを維持する(SSHを介してOS Xキーチェーンを開いて管理できますが、SSHセッションが閉じるとキーチェーンがロックされます)

どういうわけか、仮想マシン内でエージェントを起動し、特定のデーモン/エージェントに接続し、実行したいコマンドをデーモン/エージェントに送信し、デーモン/エージェントにそれを実行させることができれば、両方の問題が可能です。それで解決してください。要件は、仮想マシン内で実行される実際のスクリプト/コマンドの出力ストリームがあることです。

私たちは今何をしていますか単純なSSHコマンド(例:)を介して実行されますssh ssh-params 'bash -l -c "echo \"hello world\""'。もちろん、これは非常に単純化された例ですが、現在持っているものと似ているので、次のようになります。出力ロギング要件を満たすためのストリームとしてのコマンドに加えて、コマンドの情報を取得できます。終了コード

だから私達は何をしたいと思うか。仮想マシン「外部」で指定されたコマンドに似ていますが、仮想マシンの内部で実行されます。出力コマンドの内容は、スクリプトが完了した直後ではなく、「外部」(呼び出し側)プロセスのストリームとして使用できます。コマンドの内容は次のとおりです。終了コード「外部」プロセスで簡単に検索できます。

ツールの使用に関する限り、私たちは非常にオープンです(SSHに頼る必要はありません。現在はそれがうまくいきます)。ただし、ツールはOS Xで動作し、可能であればLinux(この場合はOS X)で動作する必要があります。問題のある2つのユースケースはOS Xと関連しているため、優先順位です。

TL;博士;上記のSSHコマンドと同様に使用できますが、リモート(仮想マシン)側ですでに実行されているエージェント/デーモンに接続できるツールが必要です。出力指定された「リモートコマンド」によって生成されたデータは、呼び出し側プロセスのストリームとして提供されなければなりません。命令の終わりにだけでなく。リモートコマンドの出力を収集することに加えて、そのコマンドの出力も取得できる必要があります。終了コード

最後の馬:私たちは簡単な方法を見つけることができなかったので、最終的に独自のソリューションを作成することにしました。 GitHubにあります。https://github.com/bitrise-io/cmd-bridge- 私が説明したすべての必要事項をサポートし、コマンド環境変数の処理サポートも含みます(環境変数はそのリモートコマンドに対してのみ定義されます)。

答え1

仮想マシンの画面またはtmuxセッションでコマンドを実行できますか?これにより、複数の手順で同じセッションにコマンドを接続/送信できます。

関連情報