Terminalgroesse automatisch setzen?

09/10/2015 - 13:04 von Ulli Horlacher | Report spam
Wenn man eine shell in einem xterm laufen hat und die Window-Groesse
veraendert, so bekommt das die shell automatisch mit. Man kann das auch
via stty abfragen:

framstag@diaspora:~: stty -a | grep rows
speed 38400 baud; rows 24; columns 80; line = 0;
(window vergroessern)
framstag@diaspora:~: stty -a | grep rows
speed 38400 baud; rows 35; columns 114; line = 0;

Somit wissen dann alle fullscreen Programm wie vi, less, etc, wie gross
das Terminal ist und nutzen es voll aus.

Das funktioniert auch noch, wenn man sich mit ssh woanders eingeloggt hat.
Die Bildschirmgroesse wird dynamisch weitergereicht.

So weit, so gut :-)

Doch nun zum Problem: ich rufe ssh nicht direkt aus der shell auf, sondern
via pipe-open, damit ich noch Environment Variablen mit uebergeben kann.
Ich verwende dazu Perl, aber das spielt keine Rolle, es koennte auch C oder
Python, oder oder sein.

open $ssh,"|ssh -t -t $target" or die "$0: cannot ssh $target - $!";
$SIG{PIPE} = sub { undef $ssh };
autoflush $ssh;
foreach (@env) { print {$ssh} "export $_;" }
print {$ssh} "";
system qw'stty -echo -icanon intr undef';
while ($ssh and sysread STDIN,$_,1024) { syswrite $ssh,$_ }
system qw'stty echo icanon intr ^C';

Meine Environment Variablen aus @env werden weitergereicht und danach hab
ich eine fast normale interaktive ssh-session.

"fast" weil es ein Problem gibt: die remote session nimmt als
Terminalgroesse 80x24 fest an und alle fullscreen Programme wie vi, less,
etc zeigen nur 80x24 Zeichen an. Auch wenn ich die Groesse des xterms
veraendere, tut sich da nichts.


framstag@diaspora: stty -a | grep rows
speed 38400 baud; rows 30; columns 94; line = 0;

framstag@diaspora: ./sshe fex
SSH_ENV: $EDITOR $FEXXX $LANG $LC_TIME
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-65-generic x86_64)
(...)
framstag@fex:~: stty -a | grep rows
speed 38400 baud; rows 0; columns 0; line = 0;

framstag@fex:~: vi xxxxxx

framstag@fex:~: stty -a | grep rows
speed 38400 baud; rows 24; columns 80; line = 0;


Noch schlimmer: nach dem logout hat auch diese shell die falsche
Terminalgroesse, obwohl stty sie richtig anzeigt:

framstag@fex:~: logout
Connection to fex closed.
framstag@diaspora: stty -a | grep rows
speed 38400 baud; rows 31; columns 97; line = 0;


Bei einem "normalen" ssh Aufruf via exec() funktioniert ja die
automatische Terminalgroesseanpassung. Nur: wie(so)?


Ullrich Horlacher Server und Virtualisierung
Rechenzentrum IZUS/TIK E-Mail: horlacher@tik.uni-stuttgart.de
Universitaet Stuttgart Tel: ++49-711-68565868
Allmandring 30a Fax: ++49-711-682357
70550 Stuttgart (Germany) WWW: http://www.tik.uni-stuttgart.de/
 

Lesen sie die antworten

#1 Christian Kellermann
09/10/2015 - 14:11 | Warnen spam
Ulli Horlacher writes:

Bei einem "normalen" ssh Aufruf via exec() funktioniert ja die
automatische Terminalgroesseanpassung. Nur: wie(so)?



IIRC wird die Größe bei ssh in einer in-band Nachricht "pty-req"
übertragen. Meine (ungetestete) Vermutung ist, dass das nicht passiert
wenn istty() beim ssh client false zurückliefert.

Als workaround könntest Du den output vom host stty als COLUMNS und
LINES setzen und mitgeben, und auf SIGWINCH reagieren um das zu àndern.

Liebe Grüße,

Christian

May you be peaceful, may you live in safety, may you be free from
suffering, and may you live with ease.

Ähnliche fragen