82

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

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

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

9 ответов9

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, который заставит вас ввести имя хоста перед выключением машины. Это более полезно, если вы регулярно выключаете целые ОС в командной строке, но хотите убедиться, что вы выключаете правильную.

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

73

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

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


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

Мой PS1

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


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

44

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

4

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

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

alias shutdown=notforuse

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

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

2

Возможно, вы стали жертвой какой-то новой глупости 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, просто учетная запись, созданная с правами администратора.

Виноват каноник.

1

Для shutdown (reboot , halt и прочее): у меня есть копия с вопросом, действительно ли я уверен (и все равно ничего не происходит). Я храню такие скрипты в /usr/local/sbin . В Debian это имеет приоритет other /sbin (это первый каталог PATH).

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

1

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

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

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

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

0

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

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

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

-2

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .