Запобігаємо збереженню паролів в історії Bash 

Запобігаємо збереженню паролів в історії Bash  – ITEDU Blog

Кожен, хто працює з 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, перезаписуючи його вже без видаленого рядка.

Фактично це означає що ви:

  1. знайшли чутливий запис;
  2. видалили його через history -d;
  3. одразу зафіксували зміни через 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 ігноруватиме:

  1. будь-які команди ls;
  2. команди cd;
  3. усі export …;
  4. команди 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

Якщо ви прагнете не тимчасового рішення, а повного усунення проблеми, почніть із трьох базових кроків:

  1. Увімкніть ігнорування команд із початковим пробілом:
 export HISTCONTROL=ignoreboth
  1.  Додайте в HISTIGNORE шаблони для найбільш ризикових команд, якщо ви часто працюєте з токенами, конфіденційною інформацією або змінними середовища. 
  2. Для сесій з секретними даними використовуйте:
export HISTFILE=/dev/null

Налаштування займає лише кілька хвилин, але знижує ризик того, що пароль або токен випадково буде збережено в історії команд і згодом стане доступним через автодоповнення. 

Підсумуємо

Вам не потрібно обирати між зручністю і безпекою. Bash уже має все необхідне, щоб гнучко керувати історією команд. Достатньо напрацювати кілька простих звичок:

Інструмент Призначення
Початковий пробіл перед командоюНе зберігати окремі команди в історії
history -dВидалити конкретний запис з історії
HISTCONTROLКерувати збереженням команд із початковим пробілом і дублікатів
HISTIGNOREВиключити окремі команди з історії на постійній основі
HISTFILE=/dev/nullНе записувати історію команд під час поточної сесії
history -c && history -wПовністю очистити історію команд

Це лише одна з багатьох можливостей зробити роботу в Linux комфортнішою. На курсі Linux. Базовий рівень ви знайдете ще більше інструментів, які допоможуть впевнено працювати в терміналі. 

Чекаємо на вас!

Залишити відповідь

Дякуємо, що поділились