Как отключить страшные команды терминала?


82

Как отключить страшные команды терминала?

Я использовал SSH для доступа к удаленному серверу Ubuntu без доступа к физическому серверу. Я думал, что набираю ' shutdown' на сервере NoSQL, работающем в ОС Ubuntu, но на самом деле я сказал серверу Ubuntu завершить работу. Затем мне пришлось сообщить администратору сервера, что я сделал, чтобы он мог запустить физический сервер для меня. Это было неловко!

Как я могу предотвратить это снова?


100
Это обсуждалось в деталях, обычно в отношении rmкоторых имеет худшие побочные эффекты, чем shutdown. Итог: здесь нет способа предотвратить плохие вещи, если вы продолжаете выполнять случайные команды от имени пользователя root.
Дмитрий Григорьев

5
Как отмечали другие люди относительно псевдонимов, это может заставить людей «привыкнуть к команде, работающей нестандартным образом». Так неужели кому-то еще кажется плохим, что глупый сервер NoSQL использует эту команду?
Bmb

Сервер NoSQL, который я использовал, - Redis.
MelodiousFires

60
Просто не работайте под учетной записью root.
алк

12
Я осмелюсь сказать, что вы выучили урок, поэтому вам больше не придется чувствовать необходимость в отключении какой-либо команды. Я также добавил бы, что вы не дурак GNU / Linux, вы просто лучше, чем дурак.

Ответы:


204

Стандартный ответ: «не входить в систему как root». Все команды, запускаемые с правами root, страшны. Если это не вариант, вы можете добавить некоторые псевдонимы .bashrcдля отключения команд, которые вы считаете особенно пугающими. Например:

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

Затем, если вы введете shutdown, вы получите следующее сообщение:

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

( Убедитесь, что ваш .bashrcзагружен в первую очередь, прежде чем попробовать это на рабочем сервере)

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

Обратите внимание, что если вас в первую очередь беспокоит остановка и выключение, вы можете подумать об установке molly-guard , который заставит вас ввести имя хоста перед выключением машины. Это более полезно, если вы регулярно выключаете целые ОС в командной строке, но хотите убедиться, что вы выключаете правильную.

Вы также можете проверить это с помощью менее пугающей команды, такой как выход или выход.


70
не входите в систему как root : это не поможет, если вы запутаете машину, на которой вы вошли. Я бы предложил изменить подсказку на что-то, что дало бы вам визуальную подсказку.
Исана

145
На мой взгляд, навязывание «страшных» команд для «безопасного» поведения - плохая идея. Это связано с тем, что люди привыкли к тому, что команда работает нестандартным образом, что может заставить их делать очень прискорбные вещи, когда они работают в ванильной системе. Простой ответ - очень осторожно наступать при входе в систему как root.
TimGJ

22
@isanae Ярлык, который я использовал для открытия терминала с помощью ssh на рабочий сервер, сделал бы фон терминала красным. Это заставило меня обратить внимание.
Питер - Восстановить Монику

6
sourceявляется псевдонимом .и поддерживается не всеми оболочками.
Гроностай

4
Также обратите внимание, что, хотя Debian и, соответственно, Ubuntu, имеют ~/.bash_profileисточник defaullt .bashrc, который не является стандартным поведением и на большинстве систем .bashrcне читается при входе через ssh, так что это не будет иметь значения. Гораздо лучше добавить псевдонимы ~/.profileили ~/.bash_profileвместо них.
тердон

73

sudoсуществует по причине - используйте это. Когда ваша команда (в данном случае интерактивный CLI) завершена, вы возвращаетесь обратно в оболочку уровня пользователя, а не в корневую оболочку. Есть очень мало достойных причин быть в корневой оболочке. (Я удивлен, что это еще не ответ ...)

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


Кроме того, вы можете различать ваше приглашение для корневых / пользовательских оболочек. Это также делает более очевидным, что вы вернулись к приглашению оболочки, а не к « некоторому другому CLI ». Мой очень красочный, и содержит много полезной информации (например, имя хоста), что позволяет очень просто узнать, на каком хосте будет выполняться команда, а также упростить просмотр истории и поиск приглашений - root оболочка использует приглашение по умолчанию.

Мой PS1

Это больше подходит для использования в « вашей » учетной записи, но если вы серьезно относитесь к безопасности / системному администрированию, то вы не будете делиться паролями / учетными записями и не будете сидеть в корневой оболочке, не будучи полностью осведомленными.


Как говорили люди снова и снова и снова, « навязывание команд для создания безопасной среды - плохая идея ». Вы будете чувствовать себя комфортно в своей безопасной среде, печатая эти «страшные» команды там, где этого не следует делать. Затем однажды вы смените работу или войдете в систему на новом компьютере, а затем начнете греметь: « Черт возьми, я не хотел, прости » ...



2
Не будет ли у него такой же проблемы sudo shutdown? Если он выполнит его не на той машине, это все равно будет катастрофой.
Бармар

2
@ Barmar NoSQL понимает команду sudo?
Темыр

2
@Taemyr sudo- это команда оболочки, она не имеет ничего общего с базой данных.
Бармар

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

44

Пакет 'molly-guard' (по крайней мере в системах, производных от Debian) установит оболочку вокруг shutdown, halt, poweroff и reboot. Если он обнаружит, что терминал является удаленным, он запросит имя хоста. Если он не совпадает, то команда отменяется.


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
Интересно, кто такая Молли?
the0ther

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

4

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

Найдите файл .bashrc и введите в качестве последней строки:

alias shutdown=notforuse

Затем, когда вы печатаете shutdown, вы получаете что-то вроде ~bash: notforuse is not a command

Это может быть глупо, но это просто, и это работает. Я ценю ответы с лучшими способами сделать это как бы то ни было!


4
Хм, я делал это раньше, rmчтобы троллить людейalias rm='echo "You can't use rm!" #'
MD XF

52
Я думаю, что это плохая идея по трем причинам. Во-первых, это сбивает с толку любого, кто имеет root-доступ к машине. Во-вторых, он учит вас, что все в порядке, чтобы набрать «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 это имеет приоритет other /sbin(это первый каталог PATH).

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


Такие взломы работают только , если применить их к каждому компьютеру вы когда - нибудь войти , чтобы ... что часто весьма непрактичным, и вы не узнаете, пока не будет слишком поздно: набрав shutdownна критической системе , которая никак не иметь свой хак.
jpaugh

@jpaugh: да, это взлом, и я использую его только для своих личных серверов, где я часто заходил в систему, и терминалы остаются открытыми слишком долго. [Примечание: я также использую различные цветовые приглашения для своих персональных компьютеров: удаленный root, remote-пользователь, local-root, local-user]. На реальных серверах и на удаленных машинах я избегаю рутирования и прохожу как можно меньше, и, конечно же, не забывая выходить из них. Просто я использую свои пульты в качестве «облака» (до облачных ажиотажей, поэтому занимался по старинке).
Джакомо

1

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

Существует также синтаксис «не могу запустить эту команду» . Его можно обойти, поэтому его не следует использовать в качестве реальной меры безопасности, но он будет работать для описанного вами сценария.

У Man sudoers есть несколько хороших примеров того, как все это настроить.

Конечно, это требует использования sudo, но это само собой разумеется.


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по умолчанию предоставляется package , так что это не глупость Ubuntu, а systemdглупость, и она исходит не от Ubuntu, а, по крайней мере, от Debian, который, в свою очередь, похоже, берет все systemdдвижение от Red Hat. Когда обвиняете, обвиняйте правильную сущность, а не только ту, которая вам не нравится.
Руслан

1
@Ruslan Никто, кто упаковывает это дерьмо в свой дистрибутив, не избежит вины за глупость.
Каз

0

Для отключения есть Молли-охранник. Вам просто нужно установить его, и когда вы пытаетесь завершить работу через ssh, он просит вас ввести имя хоста.

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

И вы можете проверить, какие файлы вы меняете / удаляете / ... с помощью программы возможно . Это довольно круто, когда что-то тестируешь.


1
Эта maybeвещь, кажется, нарушена по замыслу: если заглушить некоторые системные вызовы с помощью no-ops, это приведет к сбою любой нетривиальной программы, которая для успеха использует эти системные вызовы.
Дмитрий Григорьев

-2

Попробуйте это: когда вы находитесь на удаленной оболочке, каждый раз, когда вы собираетесь набирать клавишу «return», останавливайтесь на 5 секунд, удерживая палец на клавише «return» и перечитывая команду, которую вы собираетесь отправить. Это нормально? Ты уверен?

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


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