Запобігаємо збереженню паролів в історії Bash
Кожен, хто працює з Linux, рано чи пізно вводить у термінал команду, яку не хотів би бачити в історії. Разом із зручними шорткатами Bash history автоматично зберігає й чутливі дані (паролі або токени).
Гарна новина полягає в тому, що Bash дає вам повний контроль над тим, що саме він зберігає, коли це відбувається та як видаляти окремі записи. Ба більше, ви можете навіть автоматизувати цей процес — саме цьому ми навчимо вас у нашому гайді.
Як Bash зберігає команди в історії
Під час поточної сесії кожна введена команда спочатку зберігається в оперативній пам’яті ~/.bash_history. І лише коли сесія завершується коректно, ці дані записуються у файл історії.
Тому, важливе нагадування: якщо термінал закрився аварійно або процес оболонки був завершений примусово, з допомогою kill, частина команд із поточної сесії може не потрапити на диск взагалі.
Щоб побачити, як це налаштовано у вас, перевірте три основні змінні:
echo $HISTFILE
echo $HISTSIZE
echo $HISTFILESIZE
Приклад виводу:
/home/ravi/.bash_history
1000
2000
Пояснюємо, що це все означає:
- HISTFILE — файл, у який Bash записує історію після завершення сесії;
- HISTSIZE — скільки команд зберігається в пам’яті в межах поточної сесії;
- HISTFILESIZE — максимальна кількість рядків у файлі історії на диску.
У більшості дистрибутивів Bash автоматично зберігає приблизно 1000 команд у пам’яті і 2000 команд у історії файла.
Це важливо розуміти, адже коли ви видаляєте запис із history, ви можете прибрати його лише з поточної сесії, але він ще може залишатися у файлі на диску — якщо не переписати історію окремо.
Найпростіший спосіб не зберігати команду в Bash history
Є дуже простий трюк, який рятує в повсякденній роботі — додайте пробіл перед командою.
До прикладу, написана у такий спосіб команда точно потрапить в історію:
export API_KEY="supersecretkey123«
Натомість спробуйте ввести так, додавши пробіл:
export API_KEY="supersecretkey123«
Це працює, якщо у вас встановлено відповідне значення змінної HISTCONTROL — ignorespace або ignoreboth.
Перевірити можна наступним чином:
echo $HISTCONTROL
Вивід:
ignoredups:ignorespace
Або:
ignoreboth
Якщо бачите ignorespace або ignoreboth, значить Bash уже налаштований ігнорувати команди з початковим пробілом.
Якщо змінна порожня або такої поведінки немає, додайте в ~/.bashrc:
export HISTCONTROL=ignorespace
Після цього перезавантажте конфігурацію:
source ~/.bashrc
Це один із найзручніших способів для одноразових команд. Однак він не універсальний і працює тільки до виконання команди. Якщо ви вже натиснули Enter, потрібен інший підхід.
Як видалити конкретну команду з історії Bash
Якщо пароль уже опинився в історії, не обов’язково чистити весь файл. Можна видалити лише конкретний запис.
Для початку зазирнемо в історію команд:
history
Уявімо, що це команди з нашої історії:
497 sudo systemctl restart nginx
498 export DB_PASS="hunter2"
499 curl [api.example.com](https://api.example.com/token)
500 ls -la /etc/nginx
Тепер необхідно знайти необхідний рядок і видалити його за номером:
history -d 498
Після цього запис зникне зі списку історії в поточній сесії.
Тут важливо довести все до кінця: якщо просто закрити термінал, Bash може поводитися по-різному залежно від налаштувань. Щоб одразу переписати файл історії на диску, виконайте:
history -w
Ця команда записує поточний список history у файл ~/.bash_history, перезаписуючи його вже без видаленого рядка.
Фактично це означає що ви:
- знайшли чутливий запис;
- видалили його через history -d;
- одразу зафіксували зміни через history -w.
Це значно ефективніше, ніж відкривати .bash_history вручну й редагувати його навмання.
Як не засмічувати history дублями
Є ще одна менш критична, але популярна проблема: history швидко забивається повтореннями на кшталт:
- ls
- cd
- clear
- git status
У підсумку, коли треба знайти одну справді важливу команду, доводиться прокручувати десятки однакових рядків.
Щоб Bash не зберігав повтор тієї самої команди, використовуйте:
export HISTCONTROL=ignoredups
Якщо ж хочете одночасно ігнорувати команди з початковим пробілом та не зберігати дублікати, краще задати:
export HISTCONTROL=ignoreboth
А щоб це працювало на постійній основі додайте цей рядок у ~/.bashrc:
echo 'export HISTCONTROL=ignoreboth' >> ~/.bashrc
source ~/.bashrc
Це не вирішить проблему паролів повністю, але зробить history чистішою та коротшою.
Як назавжди видалити певні команди з history
Якщо ви регулярно запускаєте команди, які не повинні потрапляти в історію, не варто щоразу покладатися на пам’ять або уважність.
Для цього в Bash є спеціальна змінна — HISTIGNORE.
Іншими словами, це список «команд-винятків».
Ось яким чином ви вказуєте Bash, що ці команди не потрібно зберігати в історії:
export HISTIGNORE="ls:ls -la:cd:pwd:clear:history:exit"
Як бачимо, тут команди розділяються двокрапкою. Можна піти далі й використати такий шаблон:
export HISTIGNORE="ls*:cd*:pwd:clear:history:export *:curl *token*"
У цьому прикладі Bash ігноруватиме:
- будь-які команди ls;
- команди cd;
- усі export …;
- команди curl, у яких є слово token.
Щоб зберегти змінну між сесіями, додайте ці налаштування в ~/.bashrc.
Важливо: якщо зробити шаблони занадто загальними, можна втратити корисний аудит дій. Наприклад, ігнорувати все, що починається з sudo — погана ідея. Ненавмисно ви можете прибрати команди, які можуть бути важливими для відладки, перевірки змін або розбору інциденту.
Як тимчасово вимкнути історію команд
Бувають ситуації, коли краще взагалі не залишати слідів у history в межах поточної сесії. Особливо, якщо ви:
- працюєте з обліковими даними;
- перевіряєте конфігурацію на спільному сервері;
- швидко реагуєте на інцидент;
- виконуєте чутливі команди в тимчасовому сеансі.
У такому разі можна тимчасово перенаправити файл історії в /dev/null:
export HISTFILE=/dev/null
Поки сесія активна, команди залишаються доступними через історію поточної оболонки, тож їх можна переглядати за допомогою стрілки вгору. Однак після завершення сесії жодна з них не буде збережена у файлі історії.
Це хороший варіант, коли вам потрібне середовище без необхідності очищати його вручну опісля.
Як повністю очистити Bash history
Іноді потрібно почати з чистого аркуша — наприклад, після випадкового витоку даних або перед передачею середовища іншому користувачу.
У такому разі використовуйте:
history -c && history -w
Як це працює:
- history -c очищає історію в пам’яті;
- history -w записує порожній список у файл ~/.bash_history.
Після цього файл історії стане повністю порожнім.
Цей спосіб радикальний, тому варто використовувати його тоді, коли справді потрібно стерти все, а не один конкретний рядок.
Що варто передусім налаштувати для безпечної роботи з Bash history
Якщо ви прагнете не тимчасового рішення, а повного усунення проблеми, почніть із трьох базових кроків:
- Увімкніть ігнорування команд із початковим пробілом:
export HISTCONTROL=ignoreboth
- Додайте в HISTIGNORE шаблони для найбільш ризикових команд, якщо ви часто працюєте з токенами, конфіденційною інформацією або змінними середовища.
- Для сесій з секретними даними використовуйте:
export HISTFILE=/dev/null
Налаштування займає лише кілька хвилин, але знижує ризик того, що пароль або токен випадково буде збережено в історії команд і згодом стане доступним через автодоповнення.
Підсумуємо
Вам не потрібно обирати між зручністю і безпекою. Bash уже має все необхідне, щоб гнучко керувати історією команд. Достатньо напрацювати кілька простих звичок:
| Інструмент | Призначення |
| Початковий пробіл перед командою | Не зберігати окремі команди в історії |
| history -d | Видалити конкретний запис з історії |
| HISTCONTROL | Керувати збереженням команд із початковим пробілом і дублікатів |
| HISTIGNORE | Виключити окремі команди з історії на постійній основі |
| HISTFILE=/dev/null | Не записувати історію команд під час поточної сесії |
| history -c && history -w | Повністю очистити історію команд |
Це лише одна з багатьох можливостей зробити роботу в Linux комфортнішою. На курсі Linux. Базовий рівень ви знайдете ще більше інструментів, які допоможуть впевнено працювати в терміналі.
Чекаємо на вас!