GNU/Linux >> Znalost Linux >  >> Linux

Je možné uložit obsah virtuální konzole Linux a scrollback do souboru?

/dev/vcs[a]<n> zobrazí se pouze poslední plná obrazovka, i když jste se posunuli nahoru, ale výběr ioctl() s jak používá gpm vám umožní vypsat aktuálně zobrazenou obrazovku, i když jste se posunuli nahoru.

Takže můžete:

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

Nastavte 80 a 25 na skutečnou šířku a výšku obrazovky.

sleep 3 vám dává čas posouvat se nahoru (pomocí Shift+PageUP ) na aktuální obrazovku, kterou chcete vypsat. cat > file přesměruje vložení na file . Dokončete jej pomocí Ctrl+D .

Viz console_ioctl(4) pro podrobnosti.

Pokud máte gpm nainstalován a spuštěn, můžete tento výběr provést pomocí myši.

Scrollback a výběr virtuální konzole Linuxu jsou velmi omezené a docela otravné (v tom, že při přepnutí konzole ztratíte celý scrollback). Do budoucna bych vám doporučil používat věci jako GNU screen nebo tmux v rámci něj (osobně je používám v ještě schopnějších terminálech). S nimi můžete mít větší prohledávatelné scrollbacky a snadno je ukládat do souborů (a dokonce zaznamenávat veškerý výstup terminálu plus všechny další vychytávky, které jsou součástí těchto terminálových multiplexerů).

Pokud jde o automatizaci procesu vypisování celé vyrovnávací paměti rolování, mělo by to být možné za určitých podmínek, ale docela obtížné, protože API je velmi omezené. Existuje nezdokumentovaný ioctl (TIOCLINUX, subcode=13) pro posouvání aktuální virtuální konzole o určitý posun (záporný pro posun nahoru, kladný pro posun dolů).

Neexistuje však žádný způsob (který znám) zjistit aktuální velikost vyrovnávací paměti pro scrollback. Takže je těžké vědět, kdy jste dosáhli vrcholu tohoto bufferu. Pokud se ji pokusíte posunout, obrazovka se o tolik neposune a neexistuje žádný spolehlivý způsob, jak zjistit, o kolik se obrazovka skutečně posunula.

Také chování rolování ioctl považuji za nevyzpytatelné (alespoň u VGA konzole), kde rolování o méně než 4 řádky funguje jen občas.

Zdá se, že níže uvedený skript pro mě funguje na konzolách s vyrovnávací pamětí snímků (a příležitostně na konzolách VGA) za předpokladu, že vyrovnávací paměť pro scrollback neobsahuje sekvence identických řádků delších než jedna obrazovka plus jeden řádek.

Je to docela pomalé, protože posouvá jeden řádek po druhém a při čtení každého výpisu obrazovky potřebuje čekat 10 ms na eof.

Má být použit jako that-script > file z virtuální konzole.

#! /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);

Linux
  1. Jak extrahovat soubory .gz a .tar.gz v Linuxu

  2. Najděte soubor pomocí příkazů Najít a najít v Linuxu

  3. Kompresní a archivační metody v Linuxu

  1. Pipes a přesměrování v Linuxu – vysvětleno!

  2. Jak připojit a odpojit souborový systém v Linuxu

  3. Podporované a doporučené souborové systémy v systému Linux

  1. Jak uložit výstup příkazu do souboru v Linuxu

  2. Jak přesměrovat výstup do souboru a Stdout v Linuxu

  3. Co je NFS a jak jej nainstalovat na Linux