/dev/vcs[a]<n>
otterrai solo l'ultimo schermo pieno anche se hai fatto scorrere verso l'alto, ma la selezione ioctl()
s come usato da gpm
ti permetterà di scaricare la schermata attualmente visualizzata anche quando hai fatto scorrere verso l'alto.
Quindi puoi fare:
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
Regola 80 e 25 in base alla larghezza e all'altezza effettive dello schermo.
Il sleep 3
ti dà il tempo di scorrere verso l'alto (con Maiusc+PagSU ) alla schermata effettiva che desideri scaricare. cat > file
reindirizza l'incolla a file
. Termina con Ctrl+D .
Vedi console_ioctl(4)
per i dettagli.
Se hai gpm
installato e funzionante, puoi effettuare la selezione con il mouse.
Lo scrollback e la selezione della console virtuale di Linux sono molto limitati e piuttosto fastidiosi (in quanto quando si cambia console, si perde l'intero scrollback). Andando avanti, ti suggerirei di usare cose come GNU screen
o tmux
al suo interno (io personalmente li uso in terminali ancora più capaci). Con loro, puoi avere scrollback ricercabili più grandi e scaricarli facilmente su file (e persino registrare tutto l'output del terminale, oltre a tutte le altre chicche fornite con quei multiplexer di terminale).
Per quanto riguarda l'automazione del processo per eseguire il dump dell'intero buffer di scrollback, dovrebbe essere possibile in alcune condizioni, ma piuttosto difficile in quanto l'API è molto limitata. C'è un ioctl
non documentato (TIOCLINUX, subcode=13) per scorrere la console virtuale corrente di un certo offset (negativo per lo scorrimento verso l'alto, positivo per lo scorrimento verso il basso).
Tuttavia non c'è modo (che io conosca) di conoscere la dimensione corrente del buffer di scrollback. Quindi è difficile sapere quando hai raggiunto la cima di quel buffer. Se provi a superarlo, lo schermo non verrà spostato di tanto e non esiste un modo affidabile per sapere di quanto lo schermo è effettivamente passato.
Trovo anche irregolare il comportamento dello scorrimento ioctl (almeno con la console VGA), dove lo scorrimento di meno di 4 righe funziona solo occasionalmente.
Lo script seguente sembra funzionare per me su console con frame buffer (e occasionalmente su quelle VGA) a condizione che il buffer di scrollback non contenga sequenze di righe identiche più lunghe di uno schermo più una riga.
È piuttosto lento perché scorre una riga alla volta e deve attendere 10 ms per eof durante la lettura di ogni dump dello schermo.
Da usare come that-script > file
dall'interno della console virtuale.
#! /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);