Как просмотреть все предыдущие выходные данные выполненной терминальной команды?

Как просмотреть все предыдущие выходные данные выполненной терминальной команды?

Я выполнил команду в терминале gnome, которая вывела на терминал больше вывода, чем я ожидал. Я хотел бы прочитать весь вывод, но прокрутка терминала останавливается, не дойдя до начала.

Я понимаю, что могу изменить настройки профиля терминала, чтобы включить неограниченную прокрутку или перенаправить вывод в файл и т. д. Все эти общие решения применимы кбудущеевыход, однако.

Как просмотреть полный вывод терминала для уже выполненной команды?

Редактировать: Хорошо, это невозможно. Спасибо всем!

решение1

По моему опыту, консенсус в комментариях верен: как только буфер терминала будет превышен, данные будут потеряны (или потеряны — возможно, они останутся в памяти, которая еще не была перезаписана) — и поэтому вы не сможете увеличить размер буфера задним числом.

Этот ответ находится где-то между комментарием, ответом и, возможно, излишеством для вашей ситуации. Это скорее предлагаемый подход, который может решить вашу ситуацию - в частности, проблему незнания того, что вам нужен журнал, пока не станет слишком поздно (непричинные проблемы сложны), но это не прямой ответ на ваш вопрос.

В любом случае, это было слишком длинно для комментария. Я не перечисляю явно весь код, необходимый для реализации этого подхода, в основном потому, что есть куча решений по реализации, которые нужно принять; если вам нужна более подробная информация, я буду рад ее предоставить.

Scriptдалеко не приятно иметь дело

Во-первых, scriptутилита была предложена как «временная мера» для предотвращения потери данных без увеличения размера буфера (что имеет последствия для безопасности, если установлено значение «неограниченно»). Если когда-либо и была утилита, которой требовалась некоторая TLC, то scriptэто она. Опять же, она была разработана командой ядра. Читайте это, как хотите.

Я scriptчасто нахожу, что это приносит больше проблем, чем пользы (постобработка, чтобы сделать его получеловечески читаемым и т. д.), и вместо этого начал использовать упрощенный метод для регистрации stdout, stdin и/или stderr. В некотором смысле это пересоздание скрипта, но с полным контролем вместо того, чтобы быть во власти жестко закодированных scriptнастроек регистрации.

Этот подход может быть относительно легко интегрирован в ваши сеансы оболочки, и в редких случаях, когда вы переполняли буфер терминалов, у вас будет временный файл с этим содержимым. Чтобы сохранить журналирование «чистым», вам придется выполнить некоторые действия по ведению хозяйства. Кроме того, по умолчанию будут существовать те же проблемы безопасности (журнал всех выходных данных терминала); однако есть простой метод шифрования журналов.

Есть 3 основных шага:

  1. Настройте перенаправление так, чтобы разделить stdout (и stderr, если нужно) на файл и на терминал. Я сделал этот пример простым и не направляю stdin или stderr в файл — однако, если вы понимаете пример перенаправления stdout, остальное тривиально.
  2. Настройте .bashrc так, чтобы ведение журнала начиналось при каждом открытии оболочки.
  3. При закрытии данной оболочки используйте встроенную функцию bash TRAPдля вызова пользовательского кода, который завершит ведение журнала сеанса (вы можете удалить файл, заархивировать его и т. д.)

При таком подходе вы фактически получите невидимую защитную сетку, которая позволит вам видеть всю историю сеанса оболочки (в зависимости от того, что вы перенаправляете — опять же, для простоты я показываю только stdout); когда она вам не нужна, вы даже не должны знать, что она там есть.

Подробности

1. Настроить перенаправление

Следующий фрагмент кода создаст файловый дескриптор 3, который указывает на файл журнала. stdout перенаправляется на 3, и с помощью teeмы затем разделяем этот поток обратно в терминал (эквивалент stdout). Вы можете тривиально добавить stderr в ту же команду/файл журнала, перенаправить его в другой файл или оставить как есть (нерегистрируемый).

logFile=$(mktemp -u)
exec 3>&1 1> >(tee $logFile >&3)
  • Вы увидите, что этот файл журнала гораздо чище, чем тот, который создается скриптом; в нем не хранятся символы возврата на одну позицию, перевода строки и другие специальные символы, которые часто нежелательны.

  • Обратите внимание, что если вы хотите, чтобы logFile был зашифрован, вы можете сделать это довольно легко, добавив дополнительный этап конвейера после команды tee черезopenssl.

2. Автоматизируйте генерацию журнала

В .bashrc добавьте тот же код, что и выше. Каждый раз, когда создается новая оболочка, будет создан файл журнала, относящийся к этому сеансу.

export logFile=$(mktemp -u)
exec 3>&1 1> >(tee $logFile >&3)
echo "Current session is being logged in $logFile"

3. Автоматически закрывать журнал при закрытии оболочки

Если вы хотите, чтобы файл журнала был удален после завершения сеанса, вы можете использовать встроенную trapфункцию bash, чтобы определить завершение сеанса и вызвать функцию для обращения к файлу журнала, например (также в .bashrc).

trap closeLog EXIT

closeLog () {
  rm -f "$logFile" >/dev/null 2>&1
}

Очистка журнала сеанса может быть выполнена несколькими способами. Этот подход будет вызван, когда оболочка закрывается, путем перехвата сигнала «exit». В этот момент вы можете удалить файл журнала, переместить его/переименовать или сделать что-нибудь еще, чтобы очистить его. Вы также можете очистить файлы журнала с помощью задания cron, а не через TRAP (если используется этот подход, я бы предложил периодическую задачу очистки, если у вас еще нет настроенной для каталога /tmp задачи; так как если оболочка bash падает, ловушка EXIT не сработает).

Примечание по обработке подоболочек

Интересная ситуация будет развиваться с подоболочками. Если новая интерактивная оболочка открывается поверх существующей, будет создан новый журнал, и все должно работать нормально. Когда эта оболочка выходит (возвращается к родительской), журналирование этого файла возобновляется. Если вы хотите решить эту проблему более чисто — возможно, даже поддерживая общий журнал для подоболочек (интерактивных или иных), вам нужно будет обнаружить (в .bashrc), что вы находитесь во вложенной подоболочке, и перенаправить в файл журнала родительской оболочки, а не создавать новый. Вам также нужно будет проверить, находитесь ли вы в подоболочке, чтобы ваш вызов «ловушки» не удалил файл журнала родительской оболочки при выходе. Вы можете получить уровень вложенной оболочки из переменной окружения bash SHLVL, которая хранит «глубину» стека вашей оболочки.

Примечание о том, как поддерживать «чистоту» журнала:

Если вы перенаправите stdin в файл журнала, вы получите множество нежелательных артефактов, которые генерирует утилита скрипта. Это можно устранить, добавив этап фильтра (например, sed/grep) между перенаправлением и файлом. Просто создайте регулярное выражение, которое удалит все, что вы не хотите регистрировать. Чтобы полностью очистить его, потребуется довольно глубокая обработка (возможно, буферизация каждой новой строки перед записью в файл, очистка ее перед записью). В противном случае будет сложно узнать, является ли возврат «мусорным» или преднамеренным.

решение2

Традиционный способ — использовать PuTTY и сохранять тысячи строк. Также есть экран, так как не так много пользователей Linux (или локальных) используют PuTTY.

Теперь, когда в командной строке Windows есть ssh, он становится ненужным.

Связанный контент