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


17

それでは、Linuxインストールをデスクトップまで起動するとしましょう。gnome-terminal / konsole / whateverを起動して、コマンドを入力するttyを用意します。

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

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

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

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

何か案は?



これは、unix.stackexchange.com / questions / 8469 / …の複製ですか?
mattdm

回答:


16

たぶん、これらのスキーマは状況を明確にすることができます。これは通常の設定です。

                               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)

を使用screen -xすると、もう1つの端末であるxtermを(たとえばTerminal 3)スクリーンセッションに接続できます。

いいえ、別の端末に接続されているプロセスとstdin / stdoutを介して直接通信することはできません。これは、この端末が疑似端末である場合、およびこのプロセスが(画面のように)完了している場合にのみ、この端末を制御しているプロセスでのみ実行できます。


それは素晴らしい説明です!ここでは本当に答えではないと思いますが、この質問によく合います。1つの観察:「方法はありません」は禁止する場合にのみ当てはまりますptrace。おかげでptrace、プログラムが好きでneercsrettyそのためには、時にはそれを行うことができます。
ジル 'SO-悪である停止

@Gilles:まあ、彼らは何かを実行します。彼らは、(ファイル記述子の値を変更しstdinstdoutプロセスをハイジャックして直接スキーマの右側)。悪の権化!
ステファンギメネス

1
うーん、あなたは正しい、彼らは別の矢印を変更します。邪悪だが便利!
ジル「SO-悪であるのをやめる」

8

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.