画面を使わずにttyを切り替えるには?

画面を使わずにttyを切り替えるには?

Linuxインストールをデスクトップに起動するとします。 gnome-terminal/konsole/何でも起動すると、コマンドを入力するttyがあります。

それでは、SSHを介して同じシステムに接続するとしましょう。コマンドを入力するために私を別のttyにバインドします。

さて、私のttyを元のSSH端末から以前に起動したgnome端末端末に「変換」したいとしましょう。

screen -xデフォルトでは、画面なしで同じことを行う方法があるかどうかを尋ねています。

/devファイルに何かをエコーすると、出力を他のttyに簡単に送信できることがわかりますが、ttyに何があるかを「見る」方法はわかりません。

どんなアイデアがありますか?

答え1

おそらく、これらのパターンは状況を明確にするかもしれません。一般的な設定は次のとおりです。

                               Terminal  (/dev/ttyX or /dev/pts/x)
                                device
                                   |
                    (screen)<--[<output]----x-------(stdout) Process1
        Terminal  (keyboard)---[input >]---o-\----->(stdin)
                                            \ \
(hardware console or                         \ `----(stdout) Process2
 virtual console or terminal                  `---->(stdin)
 emulators like xterm, …)

そして持っていいえProcess3次のようないくつかの新しいメソッドを挿入します。

                             Terminal
                              device
                                 |
             (screen)<---o---[<output]--x------(stdout) Process1
  Terminal (keyboard)---/-x--[input >]-o-\---->(stdin)
                       | /              \ \
                       | |               \ `---(stdout) Process2
                       | |                `--->(stdin)
                       | |
                       \ `---------------------(stdout) Process3
                        `--------------------->(stdin)

画面(およびその他)が実行する作業は、いくつかの擬似端末デバイス(xtermなど)を割り当て、それを1つ以上の「実際の」端末(物理、仮想、またはエミュレートされた)にリダイレクトすることです。

             Terminal                   pseudo
             devices              ,--> Terminal (/dev/pts/x)
                |         _______/      device
Terminal <--[<output]--- |       |        |
 1       ---[input >]--> |screen | <--[<output]---x-----(stdout) Process1
                         |Process| ---[input >]--o-\--->(stdin)
Terminal <--[<output]--- |       |                \ \
 2       ---[input >]--> |_______|                 \ `--(stdout) Process2
                                                    `-->(stdin)

xtermを使用すると、スクリーンセッションにscreen -x他の端末を接続できます。Terminal 3

したがって、いいえ、他の端末に接続されているプロセスを使用してstdin / stdoutを介して直接通信することはできません。この端末が擬似端末であり、プロセスがそうするように設計されている場合(画面のように)、その端末のプロセスを制御する必要があります。

答え2

ダーティトリックがなければ、他の端末のプロセスを現在の端末に再接続することはできません。プロセスが特定のシステムコールを実行するように強制できます(次を使用)。ptrace)これにより、一部のプログラムが中断される可能性があります。これを行うためのさまざまなツールがあります(たとえば、、、、neercs...を参照)。rettycryopidreptyr実行中のプロセスであることを拒否し、新しいスクリーンシェルに接続するにはどうすればよいですか?そして関連する問題。

他の端末にすでに表示されている出力を取得することは別の問題です。完全に普遍的な解決策はありません。原則として、出力がレンダリングされると、端末はそれを画像として保存できます。ほとんどすべてのX端末エミュレータは、コピーして貼り付けることができるように、出力バッファをテキスト形式で保持します。この出力の取得方法は、端末エミュレータによって異なります。基本的なアイデアは、スクロールバックバッファ全体の選択をシミュレートすることです。たとえば、Linuxコンソールでは、/dev/tty1スクロールバックバッファを使用することができます/dev/vcs1/dev/vcsa1テキストプロパティもあります)。

簡単な答えは、別の場所で端末に再接続するには、screenまたはを使用することですtmux

関連情報