Ошибка bash: history: cannot open /home/user/.bash_history: Permission denied означает, что Bash не может открыть файл истории команд для чтения или записи. Обычно причина связана с неправильным владельцем файла или слишком строгими либо некорректными правами доступа.

Такое бывает после запуска команд от имени root, восстановления домашнего каталога из резервной копии, ручного копирования файлов между пользователями или изменения прав через chmod. В результате .bash_history может оказаться принадлежащим другому пользователю. Bash продолжает работать, но история перестаёт нормально сохраняться.

Исправление обычно занимает несколько секунд. Нужно вернуть файл истории во владение пользователя, проверить группу и установить права 600, при которых только владелец получает доступ к файлу.

Почему Bash не может записать историю команд

История Bash обычно хранится в скрытом файле .bash_history внутри домашнего каталога пользователя:

/home/user/.bash_history

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

bash: history: cannot open /home/user/.bash_history: Permission denied

Самая распространённая причина выглядит так:

ls -l ~/.bash_history

Например, вместо ожидаемого владельца можно увидеть:

-rw------- 1 root root 18420 Sep 15 15:42 /home/user/.bash_history

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

Правильный результат может выглядеть так:

-rw------- 1 user user 18420 Sep 15 15:42 /home/user/.bash_history

Теперь владельцем является user, а права позволяют этому пользователю читать и изменять историю.

Как проверить владельца и права файла истории

Перед исправлением полезно посмотреть не только сам файл, но и домашний каталог:

ls -ld ~
ls -l ~/.bash_history

Первая команда показывает владельца домашнего каталога, вторая показывает владельца и права .bash_history.

Удобнее получить информацию в более явном виде:

stat ~/.bash_history

В выводе будут указаны владелец, группа, права доступа и другие параметры файла.

Если файл принадлежит root, это сразу объясняет ошибку. Например:

Access: (0600/-rw-------)
Uid: (    0/    root)
Gid: (    0/    root)

Числовое значение 0600 означает, что владелец может читать и записывать файл, а остальные пользователи не имеют доступа. Для .bash_history это подходящий вариант, поскольку история команд нередко содержит чувствительную информацию.

Если владелец правильный, но права отличаются, причина может быть именно в разрешениях. Например, файл может оказаться доступным только для чтения владельцу:

-r--------

В таком случае Bash сможет прочитать историю, но не сможет записать новые команды.

Есть и обратная проблема:

-rw-rw-rw-

Технически Bash сможет записывать историю, но такой режим слишком открыт для файла, содержащего команды пользователя. Для истории обычно разумнее оставить доступ только владельцу.

Как вернуть владельца файла своему пользователю

Если файл принадлежит root, владельца можно изменить командой chown:

sudo chown user:user ~/.bash_history

Здесь user:user означает:

владелец:группа

В реальной системе вместо user нужно указать имя конкретной учётной записи.

Например, если пользователь называется alex:

sudo chown alex:alex ~/.bash_history

После выполнения можно проверить результат:

ls -l ~/.bash_history

Ожидаемый результат:

-rw------- 1 alex alex 18420 Sep 15 15:42 /home/alex/.bash_history

Если пользователь использует другую основную группу, безопаснее сначала узнать её:

id

В выводе будет указано имя пользователя и его группы. После этого можно передать правильную пару владельца и группы в chown.

Команда имеет смысл именно для существующего файла. Если .bash_history отсутствует, chown завершится ошибкой, и тогда нужно сначала разобраться, почему файл не существует.

Как установить безопасные права chmod 600

После исправления владельца стоит установить права:

chmod 600 ~/.bash_history

Число 600 расшифровывается следующим образом:

6 0 0

Первая цифра относится к владельцу, вторая к группе, третья к остальным пользователям.

Значение 6 складывается из разрешений на чтение и запись:

4 = чтение
2 = запись
4 + 2 = 6

Поэтому 600 означает:

владелец: чтение + запись
группа:   нет доступа
остальные: нет доступа

После команды:

chmod 600 ~/.bash_history

проверка должна показать:

-rw------- 1 user user 18420 Sep 15 15:42 /home/user/.bash_history

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

Что делать если chown и chmod не помогли

Иногда владелец и права выглядят правильно, но Bash всё равно получает Permission denied. В такой ситуации стоит проверить сам домашний каталог:

ls -ld ~

Для доступа к файлу пользователь должен иметь возможность пройти через каталог. Например, если домашний каталог принадлежит другому пользователю и закрыт от владельца текущей учётной записи, правильные права .bash_history сами по себе не решат проблему.

Можно проверить путь целиком:

namei -l ~/.bash_history

Команда показывает права каждого каталога в пути к файлу. Это удобно, когда проблема находится не непосредственно в .bash_history, а выше по дереву каталогов.

Ещё одна возможная причина связана с атрибутами файла. Проверить их можно так:

lsattr ~/.bash_history

Если файл имеет необычный атрибут, препятствующий изменению, это будет видно в выводе.

На системах с дополнительными механизмами безопасности причиной могут быть и контексты безопасности. Однако для обычной ошибки с .bash_history сначала стоит проверить владельца, группу и стандартные права. В большинстве случаев проблема находится именно там.

Если файл принадлежит пользователю, но сам домашний каталог имеет неправильного владельца, нужно исправлять уже каталог, а не случайно расширять права .bash_history.

Почему файл истории мог стать владельцем root

Одна из типичных причин возникает после использования sudo или перехода в оболочку root.

Например, если администратор случайно создаёт файл истории внутри домашнего каталога пользователя из root-оболочки, новый файл может получить владельца root.

Похожая ситуация возникает при командах вроде:

sudo touch ~/.bash_history

Переменная ~ в такой команде сначала раскрывается оболочкой текущего пользователя, а сама операция создания файла выполняется с повышенными правами. В результате файл /home/user/.bash_history может быть создан владельцем root.

Ещё один источник проблемы связан с копированием:

sudo cp backup_history ~/.bash_history

Если файл копируется с сохранением соответствующих атрибутов или создаётся от имени администратора, владельцем нового файла также может стать root.

Поэтому команды с sudo лучше использовать только там, где действительно нужны права администратора. Для обычной работы с собственной историей Bash повышение привилегий не требуется.

Как быстро восстановить работу Bash

Если причина точно установлена как неправильный владелец .bash_history, достаточно выполнить две команды:

sudo chown user:user ~/.bash_history
chmod 600 ~/.bash_history

После этого можно проверить:

ls -l ~/.bash_history

Затем выполнить несколько команд и убедиться, что Bash снова записывает историю:

history

Для проверки файла непосредственно с диска:

tail ~/.bash_history

Если новые команды появились в файле после завершения сеанса или сохранения истории, проблема устранена.

Полезно помнить одну деталь: команда history работает с историей текущей оболочки, которая может находиться в памяти. Поэтому исправление .bash_history не обязательно мгновенно изменит уже загруженное состояние истории. Главное проверить, что Bash теперь может открыть файл для записи.

Если файл оказался повреждённым или пустым, его можно создать заново, но сначала стоит сохранить старый вариант, если в нём есть нужные команды. В простом случае после исправления владельца и прав Bash продолжит использовать существующий файл.

Как избежать ошибки с историей в дальнейшем

Для нормальной работы достаточно соблюдать несколько простых правил: не создавать .bash_history через sudo, проверять владельца после восстановления домашнего каталога, не делать файл доступным всем пользователям и не менять права домашней директории без необходимости.

Если проблема появилась после восстановления данных, особенно полезно проверить владельцев сразу для всего домашнего каталога. Например:

ls -ld ~
ls -l ~/.bash_history

Если выяснится, что множество файлов в /home/user принадлежат root, проблема уже не ограничивается историей Bash. Тогда массовое изменение владельцев стоит выполнять осторожно, поскольку в домашнем каталоге могут находиться файлы и каталоги с намеренно установленными другими владельцами или специальными разрешениями.

Для одного файла исправление намного проще:

sudo chown user:user ~/.bash_history
chmod 600 ~/.bash_history

Именно сочетание chown и chmod решает две разные задачи. Первая команда возвращает пользователю право владения файлом, вторая устанавливает подходящие разрешения.

Ошибка Permission denied при работе с .bash_history поэтому обычно не требует переустановки Bash, удаления файла или изменения глобальных настроек оболочки. Сначала достаточно проверить:

ls -l ~/.bash_history

Если владельцем оказался root, вернуть файл пользователю:

sudo chown user:user ~/.bash_history

После этого закрыть доступ для группы и остальных:

chmod 600 ~/.bash_history

В результате Bash снова получает право читать и записывать собственную историю, а команды пользователя остаются недоступны другим обычным учётным записям.