GNU/Linux >> Linux の 問題 >  >> Linux

Linux 仮想コンソールのコンテンツとスクロールバックをファイルに保存することはできますか?

/dev/vcs[a]<n> 上にスクロールした場合でも、最後の画面いっぱいしか取得できませんが、選択 ioctl() gpm で使用される s 上にスクロールしても、現在表示されている画面をダンプできます。

できること:

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

80 と 25 を実際の画面の幅と高さに調整します。

sleep 3 上にスクロールする時間を与えます (Shift+PageUP を使用) ) をダンプする実際の画面に移動します。 cat > file ペーストを file にリダイレクトします . Ctrl+D で終了します .

console_ioctl(4) を参照 詳細はこちら

gpm の場合

Linux 仮想コンソールのスクロールバックと選択は非常に制限されており、非常に面倒です (コンソールを切り替えると、スクロールバック全体が失われます)。今後は、GNU screen などを使用することをお勧めします または tmux その中にあります(私は個人的に、より高性能な端末でそれらを使用しています)。それらを使用すると、より大きな検索可能なスクロールバックを作成し、それらをファイルに簡単にダンプできます (さらに、すべての端末出力と、それらの端末マルチプレクサーに付属する他のすべての機能をログに記録することもできます)。

スクロールバック バッファ全体をダンプするプロセスの自動化に関しては、一部の条件下では可能ですが、API が非常に限られているため非常に困難です。文書化されていない ioctl があります (TIOCLINUX, subcode=13) 現在の仮想コンソールをオフセットでスクロールします (上にスクロールする場合は負、下にスクロールする場合は正)。

ただし、スクロールバック バッファの現在のサイズを知る方法はありません (私が知っていることです)。そのため、そのバッファーの最上部にいつ到達したかを知るのは困難です。それを超えてスクロールしようとすると、画面はそれほど移動せず、画面が実際にどれだけスクロールしたかを知る信頼できる方法はありません.

また、スクロールする ioctl の動作が (少なくとも VGA コンソールでは) 不安定で、4 行未満のスクロールがたまにしか機能しないこともわかりました。

以下のスクリプトは、フレーム バッファ コンソール (場合によっては VGA コンソール) でも機能するようです。ただし、スクロールバック バッファに、1 画面に 1 行を加えた長さよりも長い同一行のシーケンスが含まれていない場合に限ります。

一度に 1 行ずつスクロールし、各スクリーン ダンプを読み取るときに eof を 10 ミリ秒待つ必要があるため、非常に低速です。

that-script > file として使用 仮想コンソール内から。

#! /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. Linuxでコマンド出力をファイルに保存する方法

  2. Linux – Unixのアクセス許可とファイルタイプを理解していますか?

  3. Linux.htaccessのヒントとコツ

  1. Linuxで出力をファイルとStdoutにリダイレクトする方法

  2. NFSとは何ですか?Linuxにインストールする方法

  3. Linuxで検索および検索コマンドを使用してファイルを検索する

  1. Linuxでの圧縮とアーカイブの方法

  2. Linux のパイプとリダイレクト - 解説!

  3. Linux でファイルシステムをマウントおよびアンマウントする方法