LINUX.ORG.RU

как Linux хранит историю терминала?

 , ,


0

2

Всем привет! Никак не могу понять как храниться история терминала в линуксе. Предположим, я логинюсь по ssh, делаю некие команды, а затем выхожу из сессии. При последующем логине нажимаю стрелочку вверх, но обнаруживаю что выводимая команда уже не та, которую я вызывал последней из предыдущей ssh-сессии. При следущем логине это снова повторяется, причем команды уже из какого-то другого временного промежутка.

Как работает история терминала? Как будет работать история для двух одновременно залогиненных под одним аккаунтом юзеров?

Если у тебя bash:

По умолчанию bash хранит историю в памяти и сохраняет её в ~/.bash_history в момент выхода пользователя из сессии, дописывая введённые команды в конец. Если размер файла превышает установленную значение в переменной (название не помню, поищи в мане), то самые старые записи удаляются.

Если несколько пользователей ходят в систему, то дозапись производится у каждого пользователя при выходе. Также bash не хранит по умолчанию повторяющиеся команды, т.е. если много раз ввести одно и то же, он сохранит один раз. Не сохраняются и пустые команды, по понятным причинам.

Всё это можно перенастроить через переменные окружения, смотри man. Например, можно форсировать запись команд сразу после ввода оной, можно требовать сохранять вообще всё.

Aceler ★★★★★
()

Кстати, а как обстоит дело с записью истории, если открыть несколько консолей, поработать там под одним и тем же юзером, а затем всё позакрывать? История сохранится для всех консолей, или только для одной?

Mobutu_Sese_Seko
()

Это не история терминала, это история команд командной оболочки (shell'а). Большинство тут написало про .bash_history, но может у вас другой shell.

При последующем логине нажимаю стрелочку вверх, но обнаруживаю что выводимая команда уже не та, которую я вызывал последней из предыдущей ssh-сессии.

Это странно. Попробуйте открыть две сесиии, в одной ввести команды и выйти, а из другой смотреть за содержимым файла с историей команд. Может у вас чего намучено с переменными среды и история для ssh-сессий не записывается. А может вы завершаете сессию закрывая окно терминала, а не делая exit в shell'е.

Как будет работать история для двух одновременно залогиненных под одним аккаунтом юзеров?

При логине каждый прочитает файл с истоией команд, в ходе работы к истоии у каждого будут добавляться его команды, при выходе в конец файла с историей каждый допишет свою историю, кто позже выйдет, то и будет в конце файла. Может быть настроено, что при запуске каждой команды идёт запись файл и чтение — одна история у всех сессий.

mky ★★★★★
()

У терминала нет истории, это виртуальное символьное устройство, создаваемое по необходимости (pty) или требованию (tty). Оно осуществляет только ввод/вывод и некоторый бэклог (смотри stty(1)).

За историю команд отвечает login shell, который может отличаться в разных ОС, разных дистрибутивах Linux и помимо всего этого каждый пользователь в UNIX-like волен указать любой шелл из доступных (смотри chsh(1)).

Обычно шелл можно посмотреть через echo $SHELL (актуально для login shell, но активный шелл может быть любым, всё зависит от настроек, в том числе аргументов ssh на клиенте) или echo $0 (это точно покажет активный шелл).

mord0d ★★★★★
()
Ответ на: комментарий от Andreezy

Чем в таком случае отличается закрытие окна терминала на моем устройстве от команды exit?

Во втором случае ты явно завершаешь сессию, в первом ты просто закрываешь окно, а твой шелл (скорее всего закроется по сигналу) → ssh (не закроется, если завис) → шелл удалённой сессии (не закроется по причине того, что через зависшее соединение он никогда не узнает о том что на той стороне сделали hangup).

Фактически всё выглядит так:

Ты открыл окно терминала, ему выделился pty, в нём открыт твой шелл, в нём запущен ssh, к которому присоединён pty удалённой машины, в котором открыт удалённый шелл, в котором ты выполняешь команды.

Окно → pty → $SHELL → ssh → pty → $SHELL
mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)

У меня такие настройки для истории:

export HISTFILE=$ZDOTDIR/.zsh_history
export HISTSIZE=100000
export SAVEHIST=100000

# Для отключения какой-то настройки к имени нужно добавить no см. вывод setopt, который без аргументов показывает установленные настройки
# setopt autocd
setopt auto_list # automatically list choices on ambiguous completion
setopt auto_menu # automatically use menu completion
#setopt complete_in_word
unsetopt correct_all
setopt correct
setopt interactive_comments # allow comments in interactive shells
setopt extended_glob
setopt share_history
setopt append_history
setopt inc_append_history
setopt extended_history
setopt hist_no_store
setopt hist_reduce_blanks
setopt hist_find_no_dups

Мне размер истории сменить, наверное, надо на 1 миллион команд. У меня их там 60.000, несмотря на то что я уже тер пару раз историю

uwuwuu
()
Ответ на: комментарий от Andreezy

ЕМНИП, bash пишет историю только если получить команду exit, ну или Ctrl+D. А если ему придёт сигнал SIGHUP или ещё какой, то он просто завершит работу и не запишет историю в файл. Понятно, что если история пишется на каждую команду (через PROMPT_COMMAND), то особо без разницы.

Вы так и не уточнили, у вас bash или другой shell.

mky ★★★★★
()