Командная строка и создание сценариев опасны. Сделайте небольшую опечатку с помощью rm -rf, и вы попадете в мир боли.При запуске скрипта импорта путайте prod со стадией в имени базы данных, и вы попадаете в ловушку (если они находятся на одном сервере, что нехорошо, но случается). То же самое, если вы слишком поздно заметили, что имя сервера, на котором вы сбрасываете, не то, что вы думали после запуска некоторых команд. Вы должны уважать Hole Hawg .
У меня есть несколько небольших ритуалов перед запуском рискованных команд - например, тройная проверка сервера, на котором я работаю. Вот интересная статья о безопасности rm .
Какие маленькие ритуалы, инструменты и уловки позволяют вам обезопасить себя в командной строке? И я имею в виду объективные вещи, такие как «сначала запустите ls foo *, посмотрите на вывод этого, а затем замените ls на rm -rf, чтобы избежать запуска rm -rf foo * или чего-то подобного», а не «убедитесь, что вы знаете, что команда сделает ".
Тот, который работает хорошо, использует различные цвета фона на Вашей оболочке для напоминания/подготовки/тестовых серверов.
А-ч да. Старый прием того возраста отправки кому-то файл через IRC, названный "-rf", таким образом, это заканчивается в их ~ каталоге. Одна небольшая "комната-rf" позже (вместо "комнаты-rf") и много смеха последовала, поскольку они извлекают резкий урок о не рабочий IRC как корень.
Выполнение команды с эхом сначала является хорошей идеей, но это все еще подвержено опечаткам.
Попытайтесь использовать его с расширением такой как! $.
echo foo*
rm -rf !$
! $ расширяется до последнего слова последней команды, таким образом, это эквивалентно
echo foo*
rm -rf foo*
Существует также! *, который расширяется до всех аргументов последней команде.
Действительно, Вы могли сделать это этот путь, если Вы предпочитаете
echo rm -rf foo*
!*
(Если Вы используете ksh, не колотят, можно ввести Esc+period для вставки последнего слова вместо этого.)
Вместо
rm foo*
использовать
rm -i foo*
Это практично с горсткой файлов, но не с, скажем, целым tarball. Вот почему искажение rm
будет стоять на пути.
Если Вы используете несколько вариантов операционной системы, очень знают о различиях в синтаксисе; то, что довольно безопасно на одном варианте Unix, чрезвычайно опасно в другом.
Пример: killall
Linux/FreeBSD/OSX - уничтожает все процессы, соответствующие переданному параметру. например: "апач killall" уничтожает всех апачей, оставляя все другие процессы в покое.
Солярис - уничтожает все процессы. Нет, действительно. Из страницы справочника: killall используется завершением работы (1M) для уничтожения всех активных процессов, не непосредственно связанных с процедурой завершения работы.
Для комплекса regex, особенно 'найдите' команды помещенным эхом впереди и получите их в файл. Затем можно проверить, что Вы действительно удалять/перемещать/и т.д. точно, что Вы думаете, что прежде выполняете файл с 'источником'.
Это также удобно для того, чтобы вручную добавить их пограничный случай, который не взял regex.
Отличный способ заставить Вас думать о том, что Вы делаете, добавляет что-то вроде этого к bashrc корня (cshrc, безотносительно):
unset PATH
Тем путем необходимо сделать/bin/rm вместо просто "комнаты". Те дополнительные символы могли бы заставить Вас думать.
which $COMMAND
больше работы.
– Kevin M
22 June 2009 в 21:22
Я избегаю *
шарик как его собственный аргумент, когда это возможно. Даже если я действительно имею в виду, "удаляют все в этом каталоге", я пытаюсь быть более конкретным, т.е. rm *.php
. Это - приоритетные ремонтно-восстановительные работы в случае, если я случайно выполняю ту же команду из истории в другом каталоге.
Вместо ls я использую эхо, таким образом, я вижу полную команду после того, как оболочка развернула все. Кроме того, всегда переменные двойной кавычки, которые представляют файлы так Ваши работы материала с именами файлов, которые могли бы иметь вкладки или пробелы.
Очевидный для безопасности командной строки с точки зрения Unix/Linux является надлежащим использованием корневой учетной записи.
Комната-rf как корень обычно более опасна, чем как пользователь и использование встроенных вещей как sudo вместо того, чтобы войти в систему, поскольку корень жизненно важен. Хороший простой whoami будет обычно помогать для шизофрении или разносторонне развитых личностей.
То и преднезаконченное эхо к любым командам filechanging, особенно если Вы хотите удостовериться, что Вы разобрались в шарике или соответствии regex.
Используйте здравый смысл и не выполняйте команды, которые Вы не понимаете. Это - весь хороший совет. Если Вы испытываете желание причинять боль себе с выписыванием полного пути всего, что Вы передаете комнате или выполнению чего-либо через sudo, не стесняться. Я предпочел бы su-c затем. По крайней мере, это не кэширует пароль. Я не чувствовал бы себя довольным никаким обычным пользователем, разрешаемым выполнять вещи с полномочиями пользователя root без проверки пароля.
Существует несколько вещей, как которые можно вставить ~/.bashrc для создания вещей немного более безопасными, таких:
alias srm='rm -i'
Разрешение Вам иметь безопасную альтернативу для комнаты...
Но в конце, Вы можете и всегда завинчивать. На днях у меня было более не существующее, настраивают сценарий, показанный мою всю/usr/bin папку, повреждая несколько вещей. Да, простое 'делает установку' любого типа программного обеспечения с ошибкой в нем, может повредить Вашу систему. Вы никогда не в безопасности, независимо от того, что Вы делаете. То, что я достигаю, самая важная вещь:
Сохраните регулярные резервные копии.
Правило 1 - делает резервные копии
Правило 2 - НИКОГДА не добавляет "molly защиту" обертки к стандартным командам, делает Вашу собственную версию, уверенную, но не принимает имя, это просто укусит Вас, когда Вы будете в системе, Вы не настраивали.
Быстрые приемы как другой цвет для корневого и (частичного) дерева каталогов являются великими помощниками, но снова, удостоверьтесь, что можно работать без них.
Если Вы не сделали этого, уже искажают комнату к комнате-i
Существует немного важных вещей знать прежде, чем внести изменение сервера:
Удостоверьтесь, что я нахожусь на правильном сервере
Знайте **, сколько людей будет затронуто этим действием* (если Вы сделаете ошибку или не),
Прежде, чем ввести 'ввести' ключ, знать о возможности отменить
Спросите себя, имеет ли эта команда потенциал разъединения Вашей сессии (fw правило, плохое завершение работы, и т.д....). Удостоверьтесь Вы, там обработка отказа для возвращения в (особенно, если Вы удалены),
Я удостоверяюсь имя хоста системы, я иду, находится в ударе (или другая оболочка) подсказка. Если я - chrooted, я удостоверяюсь, что это делает его там так или иначе, также.
Я однажды устанавливал хинду систему из другого живого дистрибутива Linux и случайно работал, довольно разрушительная команда (не может вспомнить то, из чего это был ATM - некоторый вариант rm
) в неправильной оболочке, заставляя набор материала в живой системе, которая будет удалена, вместо того, чтобы наполнит из chroot. С тех пор я всегда делал
export PS1="(chroot) $PS1"
каждый раз, когда я работал в chroot.
У меня есть не использующее высокие технологии решение некоторых из них.
Я разработал врожденную привычку к выполнению следующего (планируя работать корнем):
sudo su - root
переключаться на корень. Я делаю это как умственную подготовку, напоминание мне, что я мысленно шел в очень опасную область и что я должен быть внимательным и на моей защите в любом случае. Забавный, поскольку это звучит, один только этот небольшой ритуал имеет, сохраняют меня тонна горя путем простого укрепления этого, я не могу быть небрежным.sudo
в моих системах, не потому что я - BOFH, но потому что без подготовки и обучения, это похоже на предоставление заряженного оружия обезьяне. Это забавно и забавно сначала, до взглядов обезьяны ниже на баррель и сжимает...При использовании комнаты, я всегда cd
к каталогу сначала, затем используйте префикс ./
гарантировать, что каталог корректен, т.е.
cd /usr/some/directory ; rm ./targetfile
или я указываю весь путь файла
rm /usr/some/directory/targetfile
который является ЛАВАШЕМ, но... лучшим сейфом, чем извините.
Имейте спину, планируют в памяти перед запуском.
Наличие вторичного соединения в машину, Вы продолжаете работать, может быть удобным в случае, если Вы уничтожаете свою основную сессию или делаете что-то глупое, которое запирает его... тяжелая обработка и т.д.
Тем путем Вы все еще имеете доступ в машину и можете уничтожить Вашу основную сессию.
Большинство вышеупомянутых комментариев относится к комнате, но я сделал некоторые глупые вещи с другими командами также...
ifconfig для приведения в нерабочее состояние сети - ай, который требует, чтобы физическое присутствие зафиксировало.
Что касается сценариев я обычно работаю в двух окнах. Первое, которое я использую для записи сценария, второе для проверения каждой строки, поскольку я пишу это. При движении медленно и тщательно я могу удостовериться, что каждая строка работает, как я ожидаю, поскольку я пишу код, заботясь для поддержания тех же переменных, и т.д.
Лично, я не нахожу, что дополнительные подсказки для вещей как комната-i действительно помогают. Я делаю большинство своих ошибок, когда v. усталый, подчеркнутый и т.д., которые являются временами, когда я буду просто строчить y и игнорировать подсказку так или иначе. Плохая практика, возможно.
В случае чего-то как:
ls *.php
комната эха *.php
комната * .php
Вы могли использовать оператор замены, как это:
$ ls *.php
<список dir>
$ ^ls^echo комната (это заменяет ls в предыдущей команде с комнатой эха, сохраняя остальную часть командной строки тем же),
$ ^echo rm^rm (заменяют комнату эха просто комнатой, таким образом Вы не должны перепечатывать *.php и добавлять пространство не в то время),
^ = shift-6, для не знакомых с ним.
пользователь root:
Не будьте корнем, если Вы не имеете к.
Если поставщик говорит, что это должно работать как корень, сказать им, что Вы - клиент и что Вы хотите выполнить его как некорневой.
Сколько пакетов программного обеспечения с полки хочет корень 'просто, потому что это легче'?
привычка:
никогда не используйте '*' с, удаляют, не смотря на него, три раза Лучше создавать привычку к использованию ls-l TargetPattern, затем использовать 'комнату! $'. Самая большая угроза не состоит в том, где Вы думаете, что Вы. Я почти ввожу 'имя хоста' так же часто как 'ls'!
костыли:
стандартная подсказка помогает много, также, как и псевдонимы как "комната псевдонима ='rm-i'", но я часто не имею полного контроля над машинами, я иду так, я использую ожидать сценарий обертки просто для устанавливания пути, подсказки и псевдонимов с '-i'
найдите проблемы:
использование полного пути помогает, но в случаях, где это не возможно, CD в более безопасное местоположение и ТАКЖЕ использует '&&', чтобы обеспечить, чтобы 'CD' успешно выполнился, прежде чем Вы сделаете свою находку, удалите, смолите, untar, и т.д.:
пример: cd /filesystema && tar cf - | ( cd /filesystemb && tar vxf -)
использование '&&' может препятствовать тому, чтобы файл tar был извлечен сверху себя в этом случае (хотя в этом случае 'rsync' был бы лучше),
удаляет:
никогда не удаляйте рекурсивно, если можно помочь ему, особенно в сценарии. найдите и удалите с - тип f и - называет 'шаблон', я все еще живу в страхе перед питанием 'ничего' к xargs... tar, и untar для перемещения материала (используйте rsync вместо этого),
Немного meta к некоторым из других сообщений: Я использую обычные шаги echo/ls, предложенные сначала, чтобы удостовериться, что команда выбирает набор файлов, которые я хочу или иначе быть интерпретируемым оболочкой, как предназначено.
Но затем я использую особенности редактирования истории команд оболочки, чтобы получить предыдущую команду и изменить только части, которые должны варьироваться.
Это не помогает вообще ввести каждую из этих команд независимо...
$ ls *.bak
$ echo rm *.bak
$ rm * .bak
... потому что я случайно ввел пространство в последней строке и удалил все файлы. Я всегда получал бы предыдущую строку и просто удалял бы 'эхо'.
Это может казаться парадоксальным и меньше 'ardkore, но лучшая мера предосторожности командной строки, которую я имею: Если альтернатива режима GUI доступна и практична, то ИСПОЛЬЗУЙТЕ IT.
Почему? Довольно простой. Режим GUI обычно имеет встроенную систему поддержки, в форме "предупреждения - Вы собираетесь snargle freeblefrop, действительно ли Вы уверены, что хотите сделать это?" Даже если не, это замедляется, Вы, давая больше комнаты для думаете время. Это позволяет Вам перепроверить опции более легко перед согласием на них, Вы можете снимок экрана прежде и после состояний, это защищает Вас от опечаток; весь хороший, полезный и полезный материал.
В классическом случае страшной "комнаты-rf", Вы думаете, что легче случайно выпустить его от GUI или CLI?
В конце нет никакого позора в обращении к GUI. Это непогрешимо не предотвратит крупные катастрофы; столь же возможно быть воинственным в GUI, как это находится в CLI; но если это сохраняет Вас, после того как это оказалось worthwile.
Этот характерен для Windows Powershell.
Как политика мы добавляем следующее профиль ps1 машины на каждом сервере. Это гарантирует, что следующее верно:
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal( [Security.Principal.WindowsIdentity]::GetCurrent() ) & { if ($currentPrincipal.IsInRole( [Security.Principal.WindowsBuiltInRole]::Administrator )) { (get-host).UI.RawUI.Backgroundcolor="DarkRed" clear-host write-host "Warning: PowerShell is running as an Administrator.`n" } $utilities = $null if( [IntPtr]::size * 8 -eq 64 ) { $host.UI.RawUI.WindowTitle = "Windows PowerShell (x64)" $utilities = "${env:programfiles(x86)}\Utilities" } else { $host.UI.RawUI.WindowTitle = "Windows PowerShell (x86)" $utilities = "${env:programfiles}\Utilities" } if( (Test-Path $utilities) -and !($env:path -match $utilities.Replace("\","\\")) ) { $env:path = "$utilities;${env:path}" } } function Prompt { if ($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { if( !$host.UI.RawUI.WindowTitle.StartsWith( "Administrator: " ) ) { $Host.UI.RawUI.WindowTitle = "Administrator: " + $host.UI.RawUI.WindowTitle } } 'PS' + $(if ($nestedpromptlevel -ge 1) { '>>' }) + '> ' }
При использовании удара попробуйте это:
TMOUT=600
в Вашем /root/.bashrc
или подобный. Это регистрирует Вас автоматически после 10 минут, уменьшая шанс, что Вы зеркально отразите к корневому терминалу, который Вы случайно оставили открытыми и вводите что-то глупое.
Да, я знаю, что необходимо использовать sudo для выполнения корневых команд - это - просто дополнительная система поддержки в случае, если Вы решаете играть его опасный однажды.
Вместо того, чтобы исказить комнату к комнате-i, не был бы, она быть лучше исказить для высказывания удаляет или saferemove (и используйте тех, которые как предпочтительный инструмент удаления). Затем при использовании поля, которое не имело, это настроило, никакой ущерб не нанесен.
Используйте удар и установите PS1 = '\u@\h:\w> '. Это расширяется до username@hostname:/full/working/directory/path>, Как упомянуто в других ответах, можно использовать, ожидают настраивать среду каждый раз, когда Вы входите в систему, если Вы не можете обновить .profile или .bash_profile файлы. Изменение цветов фона является легко лучшим ответом хотя :-)
Вместо использования rm -rf
введите -rf
в конце так: rm
. Думайте об этом как о снятии предохранителя после того, как вы прицелились и перед выстрелом. Таким образом вы будете защищены, если при вводе имени каталога (или при использовании дополнения табуляцией) вы случайно нажмете клавишу ввода и у вас есть каталоги с аналогичными именами.
# Allow only UPDATE and DELETE statements that specify key values
alias mysql="mysql --safe-updates"`
Настоятельно рекомендуется иметь псевдоним, если вы когда-нибудь будете использовать интерфейс командной строки mysql.