/dev/vcs[a]<n>
Sie erhalten nur den letzten Bildschirm, auch wenn Sie einen Bildlauf durchgeführt haben. Mit der Auswahl ioctl()
von gpm
können Sie den aktuell angezeigten Bildschirm auch dann ausgeben, wenn Sie einen Bildlauf durchgeführt haben.
Sie können also Folgendes tun:
sleep 3; perl -e '
require "sys/ioctl.ph";
# copy:
ioctl(STDIN, &TIOCLINUX, $arg = pack("CS5", 2, 1, 1, 80, 25, 2));
# paste:
ioctl(STDIN, &TIOCLINUX, $arg = "\3")'; cat > file
Stellen Sie die 80 und 25 auf Ihre tatsächliche Bildschirmbreite und -höhe ein.
Das sleep 3
gibt Ihnen Zeit , um nach oben (mit Shift+PageUP) dem eigentlichen Bildschirm Sie dump möchten. cat > file
leitet die Paste weiter zu file
. Beende es mit Ctrl+D.
Siehe console_ioctl(4)
für weitere Einzelheiten.
Wenn Sie gpm
installiert haben und ausgeführt werden, können Sie diese Auswahl mit der Maus vornehmen.
Der Scrollback und die Auswahl der virtuellen Linux-Konsole sind sehr begrenzt und ziemlich ärgerlich (wenn Sie die Konsole wechseln, verlieren Sie den gesamten Scrollback). Zukünftig würde ich vorschlagen, dass Sie Dinge wie GNU screen
oder tmux
innerhalb davon verwenden (ich persönlich benutze sie in noch leistungsfähigeren Terminals). Mit ihnen können Sie größere durchsuchbare Scrollbacks haben und diese einfach in Dateien speichern (und sogar die gesamte Terminal-Ausgabe sowie alle anderen Extras protokollieren, die mit diesen Terminal-Multiplexern geliefert werden).
Die Automatisierung des Prozesses zum Speichern des gesamten Bildlaufpuffers sollte unter bestimmten Bedingungen möglich sein, ist jedoch recht schwierig, da die API sehr begrenzt ist. Es gibt eine undokumentierte ioctl
(TIOCLINUX, Subcode = 13), um die aktuelle virtuelle Konsole um einen gewissen Versatz zu scrollen (negativ zum Scrollen nach oben, positiv zum Scrollen nach unten).
Es gibt jedoch keine Möglichkeit (die ich kenne), die aktuelle Größe des Scrollback-Puffers zu ermitteln. Es ist also schwer zu wissen, wann Sie die Spitze dieses Puffers erreicht haben. Wenn Sie versuchen, daran vorbei zu scrollen, wird der Bildschirm nicht so stark verschoben, und es gibt keine verlässliche Möglichkeit, festzustellen, um wie viel der Bildschirm tatsächlich gescrollt hat.
Ich finde auch das Verhalten des Bildlaufs unregelmäßig (zumindest mit der VGA-Konsole), wo das Scrollen um weniger als 4 Zeilen nur gelegentlich funktioniert.
Das folgende Skript scheint für mich auf Frame-Buffer-Konsolen (und gelegentlich auf VGA-Konsolen) zu funktionieren, vorausgesetzt, der Scrollback-Buffer enthält keine Sequenzen identischer Zeilen, die länger als ein Bildschirm plus eine Zeile sind.
Es ist ziemlich langsam, da es zeilenweise einen Bildlauf durchläuft und 10 ms auf eof warten muss, wenn jedes Bildschirmabbild gelesen wird.
Verwendung that-script > file
ab der virtuellen Konsole.
#! /usr/bin/perl
require "sys/ioctl.ph";
($rows,$cols) = split " ", `stty size`;
$stty = `stty -g`; chomp $stty;
system(qw(stty raw -echo icrnl min 0 time 1));
sub scroll {
ioctl(STDIN, &TIOCLINUX, $arg = pack("Cx3l", 13, $_[0])) or die "scroll: $!";
}
sub grab {
ioctl(STDIN, &TIOCLINUX, $arg = pack("CS5", 2, 1, 1, $cols, $rows, 2)) or die "copy: $!";
ioctl(STDIN, &TIOCLINUX, $arg = "\3") or die "paste: $!";
return <STDIN>;
}
for ($s = 0;;$s--) {
scroll $s if $s;
@lines = grab;
if ($s) {
last if "@lines" eq "@lastlines";
unshift @output, $lines[0];
} else {
@output = @lines;
}
@lastlines = @lines;
}
print @output;
exec("stty", $stty);