web-dev-qa-db-ja.com

画面を使用せずにttyを切り替えるにはどうすればよいですか?

したがって、デスクトップに至るまでLinuxインストールを起動するとします。 gnome-terminal/konsole/whateverを起動して、コマンドを入力するttyを用意します。

次に、同じマシンにSSH接続するとします。コマンドを入力する別のttyにバインドします。

ここで、ttyを元のSSHから、以前に開始したgnome-terminalに「切り替え」たいとしましょう。

基本的に私は同じことをする方法があるかどうか尋ねていますscreen -xしますが、画面はありませんか?

/ devファイルに何かをエコーするだけで、他のttyに出力を簡単に送信できることはわかっていますが、ttyの内容を「表示」する方法はわかりません。

何か案は?

17
user488244

多分これらのスキーマは状況を明らかにすることができます。これは通常の設定です:

                               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をプラグインするno方法があります。

                             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)

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

そのため、違う端末に接続されているプロセスとstdin/stdoutを介して直接通信することはできません。それがたまたま疑似端末であり、かつこのプロセスがそうするように意図されている場合(画面がそうであるように)、この端末を制御しているプロセスを通じてのみそれを行うことができます。

16

他のターミナルのプロセスを現在のターミナルに再接続することは、ダーティトリックなしでは不可能です。プロセスに特定のシステムコールを実行するように強制することで可能です( ptrace を使用)。これにより、一部のプログラムがクラッシュします。これを行うツールはいくつかあります。たとえば、neercsrettycryopidreptyr、…;参照 どのようにして実行中のプロセスを否認し、それを新しい画面シェルに関連付けることができますか? およびリンクされた質問。

他の端末にすでに表示されている出力を取得することは、別の問題です。完全に一般的な解決策はありません。原則として、出力がレンダリングされると、端末はそれを画像としてのみ保存する可能性があります。実際には、すべてのX端末エミュレーターは出力バッファーをテキスト形式で保持するため、コピーして貼り付けることができます。その出力を取得する方法は、ターミナルエミュレータによって異なります。基本的な考え方は、スクロールバックバッファ全体の選択をシミュレートすることです。 /dev/tty1などのLinuxコンソールの場合、スクロールバックバッファは/dev/vcs1(および/dev/vcsa1 with text attributes)として簡単に利用できます。

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