La ligne de commande et les scripts sont dangereux. Faites une petite faute de frappe avec RM -RF et vous êtes dans un monde de blessures. Confondre Prod avec étage au nom de la base de données lors de l'exécution d'un script d'importation et que vous êtes désossé (s'ils sont sur le même serveur, ce qui n'est pas bon, mais arrive). Même chose pour remarquer trop tard que le nom du serveur où vous êtes ashed n'est pas ce que vous pensiez que c'était après avoir joué des commandes. Vous devez respecter le Hole Hawg .
J'ai quelques petits rituels avant de courir des commandes risquées - comme faire un triple retenue du serveur que je suis sur. Voici un article intéressant sur la sécurité RM .
Quels petits rituels, outils et astuces vous empêchent de sécurité sur la ligne de commande? Et je veux dire des choses objectives, comme "première course LS FOO *, regardez la sortie de cela, puis remplacez LS avec RM -RF pour éviter d'exécuter RM -RF FOO * ou quelque chose comme ça", ne vous assurez pas que vous savez ce que commande fera ".
L'un qui fonctionne bien consiste à utiliser différentes couleurs d'arrière-plan sur votre coquille pour les serveurs Prod/Staging/Test.
Avoir un plan de retour à l'esprit avant de commencer.
Celui-ci est spécifique à Windows PowerShell.
En tant que politique, nous ajoutons les suivants de la machine Profile.PS1 sur chaque serveur. Cela garantit que ce qui suit est vrai:
$ courrielprincipal = nouveau-objet Security.PRINCIPAL.WindowsPRINCIPAL ([Security.Prinipal.WindowSsidentialité] :: GetCurrent ()) [.____] & { Si ($ actuel. Security.Prinipal.windowsBuiltInrole] :: Administrateur)) [.____] {[.____] (Get-Host) Write-host "AVERTISSEMENT: PowerShell est en train d'exécuter comme administrateur.`n" [.____]} [.____] $ utilitaires = $ null [. ____ * 8 -eq 64) {[.____] $ host.ui.rawui.windowtitle = "Windows PowerShell (X64)" [.____] Utilitaires $ = "$ {env: programmages }\Utilitaires "[.____]} [.____] [.____] [.____] {[.____] {[.____] $ host.ui.rawui.windowtitle =" Windows PowerShell (X86) "[.____] = "$ {env: programfiles}\utilitaires" [.____]} [.____]} [ "\\"))))) { $ env: path = "$ utilitaires; $ {env: chemin} " } [.____]} [.____] Invite de fonction [.____] {[.] Si ($ actuelle .Principal.windowsbuiltInrole] :: Administrateur)) { if (! $ Host.ui.rawui.windowtitle.startwith ("____.] {$. Ui.rawui.windowtitle = "Administrateur:" + $ host.ui.rawui.windowtitle} [.____]} 'ps' + $ ($) }) + '>' }
J'ai une solution de faible technologie à certaines d'entre elles.
J'ai développé une habitude inate de faire ce qui suit (lors de la planification de travail en tant que root):
Sudo su - root
Pour passer à la racine. Je fais cela comme une préparation mentale, un rappel pour moi que je suis mentalement entré dans une zone très dangereuse et que je devrais être alerte et sur ma garde à tout moment. Drôle comme ça sonne, ce petit rituel seul me sauve une tonne de chagrin en renforçant simplement que Je ne peux pas être négligée.Sudo
sur mes systèmes, non Parce que je suis un bofh , mais parce que, sans préparation et entraînement, c'est comme si donner un pistolet chargé à un singe. C'est amusant et amusant au début, jusqu'à ce que le singe regarde le tonneau et les serre ...Lorsque vous utilisez RM, j'ai toujours cd
au répertoire en premier, puis utilisez un préfixe de ./
Pour vous assurer que le répertoire est correct, c'est-à-dire.
cd /usr/some/directory ; rm ./targetfile
ou je spécifie tout le chemin du fichier
rm /usr/some/directory/targetfile
qui est un pita mais ... meilleur sûr que désolé.
Je peux être d'accord avec toutes les réponses ci-dessus, mais je dois souligner cette astuce très importante:
Sachez quand éviter le multitâche.
Je m'assure que le nom d'hôte du système que je suis sur est dans l'invite Bash (ou autre Shell). Si je suis chrooté, je m'assure que cela en fait d'une manière ou d'une autre.
J'étais autrefois installé un système gentoo à partir d'une autre distribution en direct Linux et j'allais accidentellement une commande plutôt destructive (je ne peux pas me rappeler ce qu'il était guichet automatique - une variante de rm
) dans la mauvaise coquille, causant une bouquet de choses Sur le système en direct pour être supprimé, plutôt que des trucs de la chroot. À partir de là, j'ai toujours fait
export PS1="(chroot) $PS1"
chaque fois que je travaillais dans un chroot.
Règle 1 - Faire des sauvegardes
Règle 2 - JAMAIS Ajouter des emballages "Molly Guard" aux commandes standard, faites votre propre version, sûre, mais ne prenez pas le nom, ça va Il suffit de vous mordre lorsque vous êtes sur un système que vous n'avez pas installé.
Des astuces d'invite comme une couleur différente pour les arbres de répertoire racine et (partielle) sont de grands aides, mais encore une fois, assurez-vous que vous pouvez travailler sans eux.
Si vous ne l'avez pas fait déjà alias rm à rm -i
Cela peut sembler contre-intuitif et moins "Ardkore, mais le meilleur conseil de sécurité de la ligne de commande que j'ai est: Si une alternative en mode GUI est disponible et pratique, puis utilisez-la.
Pourquoi? Assez facile. Le mode interface graphique dispose généralement d'un filet de sécurité intégré, sous forme d'avertissement - vous êtes sur le point de rattraper la Freeblefrop, êtes-vous sûr de vouloir faire cela? " Même si non, cela vous ralentit, donnant plus de place pour le temps de réflexion. Cela vous permet de vérifier plus facilement les options avant de vous engager, vous pouvez la capture d'écran avant et après les États, cela vous protège des fautes de frappe; Toutes les bonnes choses utiles et utiles.
Dans le cas classique du redouté "RM -RF", pensez-vous qu'il est plus facile de le délivrer accidentellement d'une interface graphique ou d'une CLI?
En fin de compte, il n'y a aucune honte dans le recours à l'interface graphique. Cela n'empêchera pas d'infaillibilité les catastrophes majeures; Il est tout aussi possible d'être heureux-heureux dans une interface graphique comme dans une CLI; Mais si cela vous fait économiser une fois, il s'est avéré lui-même.
Au lieu d'aliaser RM à RM -i, cela ne serait-il pas préférable d'alias de dire enlever ou de Saferemove (et utilisez-les comme votre outil de suppression préféré). Ensuite, lorsque vous utilisez une boîte qui n'a pas été configurée, aucun dommage n'est fait.
Utilisez le bon sens et ne gérez pas les commandes que vous ne comprenez pas. C'est tout bon conseil. Si vous avez envie de vous alourdir d'écrire le chemin absolu de tout ce que vous passez à la RM, ou de courir quoi que ce soit via sudo, n'hésitez pas. Je préférerais Su -c alors. Au moins, cela ne cache pas le mot de passe. Je ne me sentirais pas à l'aise avec un utilisateur régulier autorisé à exécuter des objets avec des privilèges root sans vérification de mot de passe.
Il y a quelques choses que vous pouvez mettre dans votre ~/.CASHRC pour rendre les choses un peu plus sûres, telles que:
alias srm='rm -i'
Vous permettant d'avoir une alternative sûre de RM, ...
Mais à la fin, vous pouvez et va toujours bousiller. L'autre jour, j'ai eu un script de configuration de défunt chât mon dossier complet/usr/bin, rompant plusieurs choses. Oui, une simple "installation" de tout type de logiciel avec un bogue, peut casser votre système. Vous n'êtes jamais en sécurité, tout ce que vous faites. Ce que je reçois, c'est la chose la plus importante:
Gardez des sauvegardes régulières.
Assurez-vous de ne jamais exécuter la commande que vous trouvez en ligne à moins que vous ne comprenez pleinement ce qu'ils font.
Votre système peut être différent de celui de l'affiche et cela pourrait causer un monde de blessures.
Une perspective de la ligne de commande d'un point de vue UNIX/Linux est une utilisation appropriée du compte root.
Un RM -RF en tant que root est généralement plus dangereux que comme utilisateur, et en utilisant des objets intégrés tels que sudo plutôt que de se connecter en tant que root est vital. Un bel whoami simple aidera généralement à la schizophrénie ou à plusieurs personnalités.
Cela et de l'écho à la préparation des commandes en filechangeing, surtout si vous souhaitez vous assurer que vous avez une correspondance GLOB ou REGEX.
# Allow only UPDATE and DELETE statements that specify key values
alias mysql="mysql --safe-updates"`
Un alias fortement recommandé d'avoir autour si vous utilisez jamais le CLI MySQL.
Avoir une connexion secondaire dans la machine que vous travaillez peut être pratique au cas où vous tueriez votre session principale ou faire quelque chose de stupide qui le verrouille ... Traitement lourd, etc.
De cette façon, vous avez toujours accès à la machine et vous pouvez tuer votre session principale.
La plupart des commentaires ci-dessus font référence à la RM, mais j'ai aussi fait des choses stupides avec d'autres commandes ...
ifconfig à descendre le réseau - Ouch, qui nécessite une présence physique pour réparer.
En ce qui concerne les scripts, je travaille généralement dans deux fenêtres. Le premier que j'utilise pour écrire le script, la seconde pour tester chaque ligne lorsque je l'écris. Aller lentement et avec précaution, je peux m'assurer que chaque ligne fonctionne comme je m'attends à l'écriture du code, en prenant soin de maintenir les mêmes variables, etc.
Personnellement, je ne trouve pas les invites supplémentaires pour des choses comme RM -i Aide vraiment. Je fais la plupart de mes erreurs quand v. Fatigué, stressé, etc., qui sont les moments où je vais simplement frapper Y et ignorer l'invite de toute façon. Mauvaise pratique peut-être.
Si vous utilisez plusieurs variantes d'un système d'exploitation, soyez très au courant des différences de syntaxe; Ce qui est raisonnablement sûr sur une variante Unix est extrêmement dangereux dans un autre.
Exemple: killall
Linux/FreeBSD/OSX - Tue tous les processus correspondant au paramètre passé. Par exemple: "Killall Apache" tue toutes les aplaches, laissant tous les autres processus seulement.
Solaris - Kills Tous processus. Pas vraiment. De la page Man : Killall est utilisé par l'arrêt (1M) pour tuer tous les processus actifs non directement liés à la procédure d'arrêt.
Au lieu de ls, j'utilise Echo pour que je puisse voir la commande complète après que la coquille ait tout étendu. En outre, toujours deux variables de devis qui représentent des fichiers afin que votre substance fonctionne avec des noms de fichiers pouvant avoir des onglets ou des espaces.
Une excellente façon de vous faire penser à ce que vous faites est d'ajouter quelque chose comme ça à la racine de la racine (CSHRC, quoi que ce soit):
unset PATH
De cette façon, vous devez faire/bin/rm au lieu de "RM". Ces caractères supplémentaires pourraient vous faire penser.
Pour une regex complexe, surtout les commandes "Trouver" mettez-en écho devant et les capturer à un fichier. Ensuite, vous pouvez vérifier que vous supprimez/déménage/etc exactement ce que vous pensez être avant d'exécuter le fichier avec "source".
Il est également pratique d'ajouter manuellement ces cas de bord que la regex n'a pas ramassé.
utilisateur racine:
Ne soyez pas root à moins que vous ne l'iez.
[.____] Si le fournisseur dit qu'il doit fonctionner en tant que root, dites-leur que vous êtes le client et que vous souhaitez l'exécuter sous forme de root.
[.____] Combien de paquets logiciels sur l'étagère veut une racine 'juste parce que c'est plus facile?
habitude:
[.____] N'utilisez jamais '*' avec Supprimer sans le regarder trois fois il est préférable de construire l'habitude d'utiliser LS -L TargetPattern , puis utilisez-le! $ '. La plus grande menace n'est pas d'où vous pensez être. I presque Tapez "nom d'hôte" aussi souvent que "LS"!
béquilles:
[.____] Une invite standard aide beaucoup, de même que les alias comme "alias rm =" rm -i "", mais je n'ai souvent pas de contrôle total sur les machines que je suis alors que j'utilise un Attendez-vous à Script Wrapper simplement pour définir votre chemin, votre invite et votre alias avec '-i'
trouver des problèmes:
[ endommager, etc:
exemple: cd /filesystema && tar cf - | ( cd /filesystemb && tar vxf -)
[.____] L'utilisation de '&&' peut empêcher un fichier de goudron d'être extraite sur lui-même dans ce cas (si dans ce cas, "rsync" serait mieux)
supprime:
[.____] Ne supprimez jamais de manière récursive si vous pouvez l'aider, surtout dans un script. Trouvez et supprimez avec -Type F et -Name 'Motif' Je vis toujours dans la peur de nourrir "Rien" à Xargs ... goudron et endommager pour déplacer des trucs autour (utilisez RSYNC à la place)
J'évite le *
Glob comme son propre argument chaque fois que possible. Même si je veux vraiment dire "supprimer tout dans ce répertoire", j'essaie d'être plus précis, c'est-à-dire. rm *.php
. C'est un contrôle préemptif des dommages au cas où j'exécuterai accidentellement la même commande de l'histoire dans un autre répertoire.
Dans le cas de quelque chose comme:
ls * .php
[.____] echo rm * .php
[.____] RM * .php
Vous pouvez utiliser l'opérateur de substitution, comme celui-ci:
[.____] $ ls * .php
[.____] <DIR LISTE>
$ ^ LS ^ ECHO RM (ceci remplace LS dans la commande précédente avec ECHO RM, en gardant le reste de la ligne de commande identique)
$ ^ ECHO RM ^ RM (remplacez Echo RM avec juste RM, vous n'avez donc pas à retaper * .php et à lancer dans un espace au mauvais moment)
^ = Maj-6, pour ceux qui ne sont pas familiers avec elle.
Exécution de la commande avec ECHO est une bonne idée, mais il est toujours sujet à des fautes de frappe.
Essayez d'utiliser avec une expansion telle que! $.
echo foo*
rm -rf !$
Le! $ Se développe au dernier mot de la dernière commande, donc c'est équivalent à
echo foo*
rm -rf foo*
Il y a aussi! *, Qui se développe à tous les arguments à la dernière commande.
En effet, vous pouvez le faire de cette façon si vous préférez
echo rm -rf foo*
!*
(Si vous utilisez KSH, ne pas bash, vous pouvez taper la période ESC + pour insérer le dernier mot à la place.)
À la place de
rm foo*
utilisation
rm -i foo*
Ceci est pratique avec une poignée de fichiers, mais pas avec, disons, une tagère entière. C'est pourquoi l'aliasing rm
ira sur votre chemin.
Utilisez Bash et Set PS1 = '\ U\H:\w>'. Cela se développe au nom d'utilisateur @ hostname:/complet/travail/chemin/chemin> Comme mentionné dans d'autres réponses, vous pouvez utiliser pour configurer l'environnement chaque fois que vous vous connectez si vous ne pouvez pas mettre à jour les fichiers .profile ou .bash_profile. Changer les couleurs de fond est facilement la meilleure réponse cependant :-)