擬似端末(任意の端末)を介して利用可能なシリアルポートを端末に提供するために仮想マシン(linux + kvm + qemuを使用)を設定します。/dev/pts/<number>
画面は、エスケープ文字(たとえば)を正しく処理しないか、入力を何度もエコーするよりも優れていることがわかった/dev/pts/<number>
ため、対話する方法として画面を使用します。cat /dev/pts/<number> & cat > /dev/pts/<number>
ctrl-c
stty --all
この問題の問題であり、キーは、シェルによって内部的に照会された「tty / pts」の設定にディメンション(および)のscreen /dev/pts/<number>
正しい設定がないことです。これは、実際には内部的に間違った改行などにより、痛みを伴うことがあります。 VM のシェルです。cols
rows
ここでは、複数のシステムとターミナル/tty/ptsが実行されているため、正しい設定を構成する方法を知るのに十分な経験がありません。
screen /dev/pts/<number>
シェルに正しい設定を知らせるにはどうすればよいですかstty
?
**更新**
stty --all
仮想マシンシェル内の出力は次のとおりです。
root@mail:~# stty --all
speed 115200 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff
-iuclc -ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc
stty --all
ホストシステムシェルの出力は次のとおりです。
speed 38400 baud; rows 39; columns 147; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
答え1
対話型シェル初期化を実行するように設定した場合resize
、端末のサイズを尋ね、同じシステムコールを実行しますstty
。
ブロックはaの終わりにあります。.bashrc
働きます:
if [ -t 0 ] && [ -t 1 ] && [[ $TERM == screen* ]] && [ -f /usr/bin/resize ]; サイズ変更>/dev/null #stty-a フィリピン諸島
標準入力/出力が端末であるか(つまり、セッションが対話型であるか)、次のいずれかにTERM
設定されていることを確認します。screen
フレーバーとインストールするresize
かどうか。
出力をリダイレクトしても、resize
端末にエスケープシーケンスを送信して応答を受信するのを妨げません。開いているこれを行うには、ttyの独自のストリームがあります。
追加資料:
答え2
長すぎる博士。シリアル接続の背後にある内部端末が端末エミュレータのサイズ設定を受信するには、./bashrc
set_terminal_dimension() (
old="$(stty -g)"
stty raw -echo min 0 time 1
printf '\033[18t' >/dev/tty
IFS=';t' read -r _ rows cols _ </dev/tty
stty "$old";
stty cols "$cols" rows "$rows"
)
PROMPT_COMMAND='set_terminal_dimension'
背景の詳細
Linuxシステムへの接続の1つserial connection
(例:/ dev / ttyS0)は、入出力用のバイトデータストリームを提供します。ただし、IPC(信号などのプロセス間通信方式)は提供されません。したがって、存在しないシグナルウインチこれは次のことを行います。
SIGWINCH信号は、制御端末がサイズを変更すると(ウィンドウの変更)プロセスに送信されます。
もちろん、シリアル接続で受信した出力を表示する他のコンピュータはstty
同じコンピュータではないため、端末設定(たとえば経由)を実行することはできません。
2つのシステム間:a)TARGET-Sysはシリアル接続の背後にシェルを提供します。 b) CONNECTING-Sys はシリアル接続を介して TARGET システムを読み書きします。問題は次のとおりです。
システム「a)TARGET」はシェルを実行しており、接続に関する正しい情報を設定する必要があります(つまり、コマンドラインユーティリティを介して設定できますstty
)。画面に表示できる文字数のサイズを知る方法はありません(cols
そしてrows
「b)接続された」システム、より正確には、対応するターミナルエミュレータアプリケーションだけがこれを知っています。
cols
システムa)とb)は2つのバイトストリームi)入力とii)出力を介して接続されており、同じストリームを介した情報交換が必要です。これらの情報交換は、送信された一般的なバイトと競合する可能性があるため、エスケープバイトシーケンスをrows
使用して情報を具体的に表示しようとした場合は、この記事で使用できます。説明したように回答シリアル通信はSSH接続(両方のシステムも接続)の逆であり、NAWSなどの特別なプロトコルを使用して確立されません。「SSHとTelnetを介して端末の長さと幅がどのように渡されますか?」への回答)。
resize
ここでのもう一つの答えは、通常、ディストリビューションにパッケージとして提供される既製のプログラムを使用することです。この回答は「単純さはパッケージの依存関係を減らします。-GUIを介してシリアル通信を使用する多くのシステム(サーバーなど)がXorg
期待できる態度
Archlinux Wikiの「シリアルコンソールの使用」から「問題解決セクション」また、resize
多くのディストリビューションパッケージに含まれているコマンドを参照してくださいxterm
。シリアル接続を使用することは、通常、シリアル接続を介して接続されたシステムでグラフィックス出力/GUIを必要としないことと一致するため、このxterm
ソリューションはかなり大きなソリューションです(Xorgサーバーをパッケージ依存関係として提供)。
したがって、端末のサイズについてはここに記載されています。
- xtermをインストールしたくない場合は、シェル機能を使用して同じことを実行できます。 zshrcに次の関数を配置し、ターミナルエミュレータウィンドウのサイズを変更して引数なしで呼び出します。
ここで説明されているソリューションは、端末が相手端末エミュレータから応答を要求および受信する方法も詳しく説明します。より軽いソリューションは、次のbashスクリプトに似ている可能性があります/bin/sbin/resize.sh
。
#!/bin/bash
## store tty settings before
old="$(stty -g)"
## briefly disable any stty setting, like echo or line discipline
## because for a brief moment a escape sequence is send (to be received
## by the receiver (a terminal emulator program)
## a) raw => no line discipline
## b) -echo => disable repeating and display stuff
## c) min 0 time 1 => return a read with after 1 tenth of a sec and no minimum bytes
stty raw -echo min 0 time 1
## send the request an escape sequence for the outer terminal emulator
printf '\033[18t' >/dev/tty
## use read shell builtin to read the return into the variables rows, cols
## (IFS is used in combination with a "_" (as "garbage variable") to
## get rid of not neede part of response)
IFS=';t' read -r _ rows cols _ </dev/tty
## (previous settings are restore, ie. the "raw" and "-echo" is undone)
stty "$old";
## finally the received info ( the info provided via the same stream
## of bits as bytes as also actually incoming the bytes generated by the
## keyboard ) and which was read into the variables was set before
stty cols "$cols" rows "$rows"