キーボード表現の問題は (echo -ne '\015') と似ています。

キーボード表現の問題は (echo -ne '\015') と似ています。

次のようにキーボードを使用してキーの組み合わせを入力するのと同じ方法で、セッションから安全に分離するために(Ctrl++)をどのように表現できますか?adscreen

(echo -ne '\015')

これらの式を一種のスクリプトに入れたいです。 Linuxキーボードキー式マップなどがありますか?

答え1

私が知る限り、シェルで実行できるコマンドはありません。以内にscreenこのセッションから端末を分離するセッションです。screen入力のみを表示ターミナルからマジックメタ文字(Ctrl- a)の場合、管理対象端末セッションに表示されないすべての項目screen それ自体。説明するために - 文字の後に文字をdetachsequence含むファイルを作成しました。Ctrlad

$ hexdump detachsequence
0000000 01 64

セッションcatでこれを行うと、何も起こりません。ファイルは表示されません(制御文字は表示されますが)。screen

$ cat detachsequence
d

または同じように目にさらされませechoprintf

実際、catその中のファイルが自分に制御シーケンスを送信できる場合、screenこれは特に深刻なセキュリティ上の欠陥になります。screen

答え2

一般的な解決策は次のとおりです。

screen -d $STY

画面では、セッション名を$STY変数に渡してscreen -d使用できます。

分離した状態でコマンドを実行したい場合があります。次のようにできます。

screen -d $STY & yourcommand

メモ: screen -dそれ自体で十分です。を指定する必要はありません$STY

まず、分離されたスクリプトを起動することもできます。

screen -d -m /the/script

ただし、注意すべき点は、スクリプトが分離される前にスクリプトと対話できる時間枠がないことです。これを行う必要がある場合は、以前のソリューションが最善の選択である必要があります。

その他のソリューション(環境によって異なります):

セッション内の仮想端末でスクリプトを使用している場合は、制御シーケンスを端末に送信するというX利点を享受できます。xdotool

xdotool key control+a+d

答え3

キーを押して、文字のCtrl-<letter>文字コード1〜26をに送信します。つまり、またはisは文字1を送信し、またはorは2人などの文字を送信します。キャリッジリターン文字は、または13(10進数)またはです。AZCtrl-A^A\x01\001^B\015^M

まあCtrl-A d\001d

しかし、どういうわけかそのシーケンスを転送したい場合は、screen画面自体内で転送するのは簡単ではありません。 (ターミナルで行うことができます。外部screen。 )

スクリプトから分離を要求するscreenより簡単な方法はを実行することですscreen -X detach-S分離する画面を指定し、STY環境変数を使用して現在の画面のIDを見つけることができます。

関連情報