Як відключити страшні термінальні команди?


82

Як відключити страшні термінальні команди?

Я використовував SSH для доступу до віддаленого сервера Ubuntu без доступу до фізичного сервера. Я думав, що набираю ' shutdown' на сервер NoSQL, що працює на ОС Ubuntu, але насправді я сказав сервісу Ubuntu відключитися. Тоді мені довелося сказати адміністратору сервера, що я зробив, щоб він міг запустити фізичний сервер для мене. Це було бентежно!

Як я можу перешкодити цьому повторитись?


100
Це обговорювалося в тривалості, як правило, стосовно rmяких є гірші побічні ефекти, ніж shutdown. Підсумок: тут не можна запобігти тому, щоб погані речі не відбувалися, якщо ви продовжуєте виконувати випадкові команди як root.
Дмитро Григор’єв

5
Як зауважували інші люди щодо згладжування, це може змусити людей "увійти в звичку командувати, що працює нестандартно". То чи не здається комусь поганим, що дурний сервер NoSQL використовує цю команду?
bmb

Сервер NoSQL, яким я користувався, є Redis.
MelodiousFires

60
Тільки не працюйте під кореневим рахунком.
алк

12
Смію сказати, що ви засвоїли урок, тому не доведеться відчувати необхідність знову відключати будь-яку команду. Я також додаю, що ви не дурні GNU / Linux, ви просто краще, ніж дурень.

Відповіді:


204

Стандартна відповідь - "не входити як корінь". Усі команди, що виконуються як корінь, страшно. Якщо це не варіант, ви можете ввести кілька псевдонімів, .bashrcщоб відключити команди, які вам здаються особливо страшними. Наприклад:

for scary in shutdown halt  reboot rm
do
    alias $scary="echo If you really want to do that, type: `which $scary`"
done

Потім, якщо ви введете вимкнення, ви отримаєте таке повідомлення:

If you really want to do that, type: /sbin/shutdown

( Переконайтеся, що ваш .bashrcзавантажився спочатку, перш ніж спробувати це на виробничому сервері)

Вихід із поточного sshсеансу та вхід знову, або використання, . ~/.bashrcслід завантажувати / запускати .bashrc. Можливо, спробуйте запуститись rmбез жодних аргументів, щоб переконатися, що ваш сервер не відключився автоматично завантажуючись .bashrcна вхід або подібне.

Зауважте, що якщо ви в першу чергу переймаєтесь зупинкою та відключенням, ви можете розглянути можливість встановлення molly-guard , що змусить вас ввести ім'я хоста перед тим, як вимкнути машину. Це корисніше, якщо ви регулярно вимикаєте цілі ОС у командному рядку, але хочете переконатися, що ви вимикаєте правильний.

Ви також можете спробувати це за допомогою менш страшних команд, таких як вихід або вихід.


70
не входити в систему як корінь : це не допоможе, якщо ви плутаєте машину, на якій ви ввійшли. Я б запропонував змінити підказку на щось, що дасть вам візуальну підказку .
isanae

145
Здавання "страшних" команд щодо "безпечної" поведінки, на мій досвід, погана ідея. Це тому, що люди, як правило, звикають до того, що команди працюють нестандартно, що може змусити їх робити дуже сумні речі, коли вони перебувають у ванільній системі. Проста відповідь полягає в тому, щоб дуже ретельно ступати під час входу в систему як корінь.
TimGJ

22
@isanae Ярлик, який я використовував для відкриття терміналу з ssh на виробничому сервері, зробить фон термінала червоним. Це змусило мене звернути увагу.
Пітер А. Шнайдер

6
sourceє псевдонімом .і підтримується не всіми оболонками.
gronostaj

4
Також зауважте, що хоча Debian і Ubuntu, розширення, Ubuntu мають ~/.bash_profileджерело дефолту .bashrc, яке не є стандартною поведінкою і в більшості систем .bashrcне читається при вході в систему через ssh, так що це не матиме ніяких змін. Набагато краще додати псевдоніми до ~/.profileабо ~/.bash_profileзамість них.
тердон

73

sudoіснує з причини - використовуйте її. Коли ваша команда (в даному випадку інтерактивна CLI) закінчена, ви повертаєтеся до оболонки рівня користувача, а не до кореневої оболонки. Є дуже мало гідних причин бути в кореневій оболонці. (Я здивований, що це вже не відповідь ...)

Сказавши це, не будьте лялечкою, яка використовує sudoдля всього . Зрозумійте, що ви робите, і зрозумійте, чому це потрібно / не вимагає кореневих привілеїв.


Крім того, ви можете розмежувати своє запит на оболонки кореня / користувача. Це також робить більш очевидним, що ви знову в запиті оболонки, а не " якийсь інший CLI ". Шахта дуже колоритна і містить багато корисної інформації (наприклад, ім'я хоста), завдяки якій можна дуже просто зрозуміти, на якому хості буде виконуватися команда, а також полегшує огляд історії та пошук підказок - корінь shell використовує підказку за замовчуванням.

Мій PS1

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


Як люди говорили знову і знову, і знову, " зведення команд створити безпечне середовище - погана ідея ". Вам стане комфортно у вашому безпечному оточенні, вводячи ті 'страшні' команди там, де не слід. Тоді одного разу ти зміниш роботу, або увійдеш на нову машину, а потім пробудеш " whoopsy, я цього не мав на увазі, вибач " ...



2
Хіба він не мав би такої ж проблеми sudo shutdown? Якщо він виконає його на неправильній машині, це все одно буде катастрофою.
Бармар

2
@Barmar Чи NoSQL розуміє команду sudo?
Taemyr

2
@Taemyr sudo- команда оболонки, вона не має нічого спільного з базою даних.
Бармар

4
@Barmar: Насправді, я думаю, що ОП мав намір ввести його в програму cmdline NoSQL, а не в bash. Таким чином, вони не мали б набрати sudo shutdown, оскільки я припускаю, що sudoце не команда NoSQL. Якщо не знаходитися в кореневій оболонці, то цілком було б вирішено цю проблему і було б дуже хорошою ідеєю. Тож би уважно подивитись на підказку перед запуском важливих команд.
Пітер Кордес

44

У пакеті «molly-guard» (принаймні, на системах, отриманих Debian) буде встановлено обгортку навколо відключення, зупинки, переключення та перезавантаження. Якщо він виявить, що термінал є віддаленим, він запитає ім'я хоста. Якщо вона не відповідає, команда скасовується.


4
як щодо інших (напевно, страшніших) речей, як rm -rf /?
marcellothearcane

9
@marcellothearcane set -uможе допомогти у цьому в деяких випадках, наприклад, під час написання rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT.
Алекс Холл

4
@marcellothearcane Що-небудь, що нагадує сучасну систему Linux, потребує --no-preserve-rootякої ви навряд чи наберете випадково.
CVn

3
хто Моллі, цікаво ... певно, хтось кіт.
thether

7
@ the0ther, дворічна дитина, яка двічі за той же день ввімкнула перемикач SCRAM на машині динозаврів. Вони в кімнаті скомпонували кришку на вимикачі. catb.org/jargon/html/M/molly-guard.html
CSM

4

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

Знайдіть файл .bashrc і поставте як останній рядок:

alias shutdown=notforuse

Потім, коли ви вводите відключення, ви отримуєте щось на кшталт ~bash: notforuse is not a command

Це може бути нерозумно, але це просто і працює. Я вдячний відповідям з кращими способами зробити це, однак!


4
Гм, я раніше це робив з rmтроллю людьми -alias rm='echo "You can't use rm!" #'
MD XF

52
Я думаю, що це погана ідея з трьох причин. По-перше, це заплутано для всіх, хто має кореневий доступ до машини. По-друге, він навчає вас, що це нормально, щоб набрати "shutdown" та натиснути enter, а це означає, що ви, швидше за все, помилитесь у наступній системі, до якої маєте root. По-третє, це стане надзвичайно заплутаним, якщо notforuseна шляху колись з’явиться дійсна команда .
Девід Річербі

5
Я з цим @DavidRicherby на цьому. Не гарна ідея.
Тіко

Якщо ви дійсно хочете використовувати псевдоніми, ви можете принаймні помістити всі ці псевдоніми команд scaring у файл, нехай ми скажемо ~/.SaveMyReputationі додамо як останній рядок .bashrcрядка як [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation. Ви можете, нарешті, додати додатковий рядок echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"всередині цього файлу. Принаймні, ви можете взяти з собою цей псевдонім-файл на іншій машині (він повинен бути .bash_aliases, але в цьому "застарілому" випадку краще використовувати інше ім'я).
Гастур

Якщо ви збираєтеся це робити, зробіть це менш заплутаним, використовуючи таке ім’я alias shutdown=shutdown-disabled-by-an-alias. (Це стосується лише третьої та найменшої проблеми, на яку вказував @DavidRicherby.) Хоча для наступної людини, ймовірно, буде потрібно лише 2 секунди, щоб перейти від побачення notforuse is not a commandдо запуску type -a shutdownта пошуку псевдоніма, а потім ввівши, sudo \shutdownщоб відключити розширення псевдоніму. (За умови , що вони sudoпсевдоніми , щоб sudo='sudo 'таким чином він розширює псевдоніми в своєму першому Арга).
Пітер Кордес

1

Для shutdown( reboot, haltі пов'язаних з ними ): У мене є копія з запитай мене , якщо я дійсно впевнений (і це не робить нічого , у всякому разі). Я зберігаю такі сценарії в /usr/local/sbin. У Debian цей пріоритет має інші /sbin(це перший каталог PATH).

Системні сценарії використовують повний шлях, тому такий хак заважає мені зупинити віддалений сервер замість локальної машини (погана поведінка від Awesome WM), але не має іншого опосередкованого ефекту, і я все ще можу використовувати їх як / sbin / shutdown, коли це дійсно потрібно .


Такі зломи працюють тільки , якщо застосувати їх до кожного комп'ютера ви коли - небудь увійти , щоб ... що часто вельми непрактичним, і ви не дізнаєтеся, поки не буде занадто пізно: набравши shutdownна критичній системі , яка ніяк НЕ мати свій хак.
jpaugh

@jpaugh: так, це хакер, і я використовую його лише для своїх особистих серверів, де я часто входжу в систему, а термінали залишаються відкритими занадто багато часу. [Примітка. Я також використовую різні кольорові підказки для моїх персональних машин: віддалений корінь, віддалений користувач, локальний корінь, локальний користувач]. Що стосується справжніх серверів та віддалених машин, я уникаю root, і коріння я отримую якнайменше, і точно, не забуваючи виходити з них. Просто я використовую свої пульти як "хмара" (до того, як хмара шумила, так оброблялася по-старому).
Джакомо Катенацці

1

Файл Sudoers дозволяє набагато більш тонкий рівень деталізації, ніж просто * 'дозволено використовувати sudo' *, зокрема ви можете використовувати псевдоніми команд для створення білих списків груп команд, до яких обмежений певний користувач або група. Я працював з віддаленими серверами, які обмежували доступ до ssh і дозволяли захищати паролем sudo (нам потрібні були захищені паролем ssh-ключі). Для цього є кілька вагомих причин, але це має небезпеку, тому ми використовували псевдоніми команд, щоб дозволити необмежений доступ до речей, які їм потрібно робити (перезапуск серверів тощо), не надаючи їм привілеїв на те, чого вони не зробили.

Існує також синтаксис сказати "не можна запустити цю команду" . Це можна обійти, тому він не повинен використовуватися як реальний захід безпеки, але він буде працювати за описаним вами сценарієм.

Людина-судовики має кілька хороших прикладів, як це все налаштувати.

Звичайно, для цього потрібно використовувати судо, але це само собою зрозуміло.


1

Можливо, ви стали жертвою якоїсь нової глупості Ubuntu.

Ubuntu використовував звичайну класичну shutdownкоманду, яка приймає обов'язковий аргумент часу.

Ось що трапляється на Ubuntu 12, якщо я набираю shutdown, навіть як звичайний користувач:

$ shutdown
shutdown: time expected
Try `shutdown --help' for more information.

Тоді

$ shutdown +100
shutdown: need to be root.

Тепер ось Ubuntu 16.10. Я не корінь:

$ date ; /sbin/shutdown
Fri Jun 23 16:00:16 PDT 2017
Shutdown scheduled for Fri 2017-06-23 16:01:16 PDT, use 'shutdown -c' to   cancel.

Без аргументів, він планує відключення на 60 секунд пізніше, і навіть якщо ви не root - просто обліковий запис, створений з правами адміністратора.

Виною канонічним.


6
/sbin/shutdown надається systemd-sysvпакетом за замовчуванням, тому це не глупость Ubuntu, це systemdдурість, і вона приходить не від Ubuntu, а від Debian принаймні, що, в свою чергу, здається, що приймає весь systemdрух від Red Hat. Звинувачуючи, звинувачуйте правильну сутність - не лише ту, яку ви не любите.
Руслан

1
@Ruslan Ніхто, хто упакує це лайно у свій дистрибутив, не уникає вини дурості.
Каз

0

Для відключення є molly-guard. Вам просто потрібно встановити його, і коли ви намагаєтесь відключити через ssh, він попросить ввести ім'я хоста.

Для видалення файлів існують такі рішення, як libtrash, які емулюють кошик для сміття через LD_PRELOADбібліотеку.

І ви можете перевірити, які файли ви змінюєте / видаляєте / ... за допомогою програми " Можливо ". Це досить круто, коли щось тестують.


1
Ця maybeштука, здається, порушена дизайном: заїдання деяких системних дзвінків без відключення операцій руйнує будь-яку нетривіальну програму, яка покладається на ці системні дзвінки, щоб досягти успіху.
Дмитро Григор'єв

-2

Спробуйте це: коли ви знаходитесь на віддаленій оболонці, кожного разу, коли ви збираєтесь набрати клавішу "return", зупиніться на 5 секунд, натискаючи пальцем на клавішу "return" і перечитайте команду, яку ви збираєтеся надіслати. Чи гаразд? Ти впевнений?

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


Спробував це, не працюючи. Я увійшов shutdown, зупинився на 5 секунд, перечитав команду (вголос!), І я впевнений, що це було правильно. Потім натисніть клавішу Enter і команда щойно виконана. Так що це не відключило страшні команди, я боюся. Я спробую з цією пальцевою річчю, можливо, відстань була занадто мала / велика.
wojciech_rak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.