Comment désactiver les commandes de terminal effrayantes?

82

Comment désactiver les commandes de terminal effrayantes?

J'utilisais SSH pour accéder à un serveur Ubuntu distant sans accéder au serveur physique. Je pensais taper ' shutdown' sur le serveur NoSQL fonctionnant sur le système d'exploitation Ubuntu, mais en réalité, j'ai dit au serveur Ubuntu de s'arrêter. Ensuite, je devais dire à l'administrateur du serveur ce que je faisais pour qu'il puisse démarrer le serveur physique pour moi. C'était gênant!

Comment puis-je empêcher que cela se reproduise?

Feux mélodieux
la source
100
Cela a été discuté dans les longueurs, généralement par rapport à rmqui a des effets secondaires pires que shutdown. En bout de ligne: il n’ya aucun moyen d’empêcher que de mauvaises choses se produisent si vous continuez à exécuter des commandes aléatoires en tant que root.
Dmitry Grigoryev
5
Comme d'autres personnes l'ont fait remarquer à propos du repliement du spectre, cela peut amener les gens à "prendre l'habitude d'une commande fonctionnant de manière non standard". Cela semble-t-il donc mauvais à quiconque que le stupide serveur NoSQL utilise cette commande?
bmb
Le serveur NoSQL que j'utilisais est Redis.
MelodiousFires
60
Il suffit de ne pas travailler sous le compte root.
alk
12
J'ose oser dire que vous avez appris la leçon sans avoir à ressentir le besoin de désactiver toute commande à nouveau. J'ajouterais également que vous n'êtes pas à l'abri de GNU / Linux, vous êtes simplement meilleur que le fou.

Réponses:

204

La réponse standard est "ne vous connectez pas en tant que root". Toutes les commandes exécutées en tant que root sont effrayantes. Si ce n'est pas une option, vous pouvez insérer des commandes d'alias dans votre .bashrcpour désactiver les commandes que vous trouvez particulièrement effrayantes. Par exemple:

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

Ensuite, si vous tapez shutdown, vous obtenez le message suivant:

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

( Assurez-vous que votre .bashrca chargé en premier, avant d'essayer cela sur un serveur de production)

Quitter votre sshsession en cours et vous reconnecter, ou utiliser . ~/.bashrcdoit charger / exécuter .bashrc. Essayez peut-être d’exécuter rmsans aucun argument pour vous assurer que votre serveur n’a pas désactivé le chargement automatique .bashrclors de connexions ou similaires.

Notez que si vous êtes principalement concerné par les arrêts et les arrêts, vous pouvez envisager d’installer molly-guard , ce qui vous obligera à saisir le nom d’hôte avant d’arrêter la machine. Ceci est plus utile si vous arrêtez régulièrement des systèmes d’exploitation complets sur la ligne de commande, tout en voulant vous assurer d’arrêter le bon.

Vous pouvez également tester essayez ceci avec une commande moins effrayante telle que logout ou exit.

Gmatht
la source
70
ne vous connectez pas en tant que root : cela ne vous aidera pas si vous confondez la machine à laquelle vous êtes connecté. Je suggérerais de changer l'invite pour quelque chose qui vous donnerait un indice visuel.
Isanae
145
Faire croire à des commandes "effrayantes" d'avoir un comportement "sûr" est, selon mon expérience, une mauvaise idée. Cela est dû au fait que les gens ont tendance à prendre l’habitude d’une commande fonctionnant de manière non standard, ce qui peut leur faire faire des choses très regrettables lorsqu’ils sont sur un système à la vanille. La réponse simple est de marcher très prudemment lorsque vous êtes connecté en tant que root.
TimGJ
22
@isanae Le raccourci que j'avais l'habitude d'ouvrir un terminal avec ssh sur le serveur de production rendait le fond du terminal plus rouge. Cela m'a fait faire attention.
Peter - Réintégrer Monica le
6
sourceest un alias pour .et n'est pas supporté par tous les shells.
gronostaj
4
Notez également que bien que Debian et, par extension, Ubuntu aient la ~/.bash_profilesource par défaut .bashrc, ce qui n’est pas un comportement standard et sur la plupart des systèmes, elle .bashrcn’est pas lue lors de la connexion via ssh, cela ne fera donc aucune différence. Il est de loin préférable d’ajouter les alias à ~/.profileou à la ~/.bash_profileplace.
Terdon
73

sudoexiste pour une raison - utilisez-le. Lorsque votre commande (dans ce cas, une interface de ligne de commande interactive) est terminée, vous êtes redirigé vers votre shell au niveau utilisateur, pas un shell root. Il y a très peu de raisons valables d'être dans un shell racine. (Je suis surpris que ce ne soit pas déjà une réponse ...)

Cela dit, ne soyez pas un muppet qui utilise sudopour tout . Comprenez ce que vous faites et pourquoi vous n’avez pas besoin des privilèges root.


De plus, vous pouvez différencier votre invite pour les shells root / utilisateur. Cela rend également plus évident le fait que vous êtes de retour à l’invite du shell et non comme " un autre CLI ". Le mien est très coloré et contient de nombreuses informations utiles (telles que le nom d'hôte), ce qui permet de savoir très facilement sur quel hôte la commande sera exécutée et de consulter plus facilement votre historique et de localiser les invites - une racine shell utilise l'invite par défaut.

Ma PS1

Ceci est plus approprié pour utiliser sur " votre " compte, mais si vous prenez la sécurité / l'administrateur système au sérieux, vous ne partagerez pas les mots de passe / comptes, et vous ne serez pas assis dans un shell root sans en être parfaitement au courant.


Comme les gens l'ont répété maintes et maintes et maintes et maintes fois, "il n'est pas judicieux de créer des alias pour créer un environnement sûr ". Vous allez vous sentir à l'aise dans votre environnement sécurisé en tapant ces commandes «effrayantes» là où vous ne devriez pas. Puis un jour, vous changerez de travail ou vous vous connecterez à une nouvelle machine, puis vous ferez exploser " Whoopsy, je ne voulais pas, je suis désolé " ...

Attie
la source
2
N'aurait-il pas le même problème avec sudo shutdown? S'il l'exécute sur la mauvaise machine, ce sera toujours un désastre.
Barmar
2
@Barmar NoSQL comprend-il la commande sudo?
Taemyr
2
@Taemyr sudoest une commande shell, cela n'a rien à voir avec la base de données.
Barmar
4
@Barmar: En fait, je pense que le PO voulait le taper dans un programme NoSQL cmdline, pas dans bash. Donc, ils n'auraient pas tapé sudo shutdown, puisque je suppose que ce sudon'est pas une commande NoSQL. Ne pas être dans une coque racine aurait totalement résolu ce problème et aurait été une très bonne idée. Il serait donc utile de regarder attentivement l'invite avant d'exécuter des commandes importantes.
Peter Cordes
44

Le paquetage 'molly-guard' (au moins sur les systèmes dérivés de Debian) installera un wrapper autour de l’arrêt, de l’arrêt, de la mise hors tension et du redémarrage. S'il détecte que le terminal est distant, il demandera le nom de l'hôte. Si cela ne correspond pas, la commande est annulée.

CSM
la source
4
Qu'en est-il des autres choses (sans doute plus effrayantes) comme rm -rf /?
Marcellothearcane
9
@marcellothearcane set -upeut aider dans certains cas, comme lors de l'écriture rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT.
Alex Hall
4
@marcellothearcane Sur tout ce qui ressemble à un système Linux moderne, il y a des besoins --no-preserve-rootque vous ne serez probablement pas en mesure de taper par accident.
un CVn
3
qui est Molly, je me demande ... probablement le chat de quelqu'un.
the0ther
7
@ the0ther, un enfant de 2 ans, qui a déclenché le commutateur SCRAM sur une machine à dinosaures, deux fois dans la même journée. Les gens dans la pièce ont installé un couvercle sur l'interrupteur. catb.org/jargon/html/M/molly-guard.html
CSM le
4

J'ai accepté une réponse qui me plaît beaucoup, cependant, si quelqu'un d'autre lit et veut une réponse plus simple, voici la mienne.

Recherchez le fichier .bashrc et mettez-le comme dernière ligne:

alias shutdown=notforuse

Ensuite, lorsque vous tapez shutdown, vous obtenez quelque chose comme ~bash: notforuse is not a command

C'est peut-être idiot mais c'est simple et ça marche. J'apprécie les réponses avec de meilleures façons de le faire cependant!

Feux mélodieux
la source
4
Hm, je faisais cela avec des rmgens trolls -alias rm='echo "You can't use rm!" #'
MD XF
52
Je pense que c'est une mauvaise idée pour trois raisons. Premièrement, c'est déroutant pour quiconque ayant un accès root à la machine. Deuxièmement, il vous indique qu'il est correct de taper "shutdown" et d'appuyer sur Entrée, ce qui signifie que vous êtes susceptible de commettre la même erreur sur le prochain système auquel vous avez accès root. Troisièmement, cela deviendra extrêmement déroutant s’il existe une commande valide appelée notforusesur le chemin.
David Richerby le
5
Je suis avec @DavidRicherby sur celui-ci. Pas une bonne idée.
Tico
Si vous voulez vraiment utiliser les alias, vous pouvez au moins mettre tous ces alias de commandes effrayants dans un fichier, laissez-nous dire ~/.SaveMyReputationet ajouter comme dernière ligne de votre .bashrcligne a [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation. Vous voudrez peut-être éventuellement ajouter une ligne supplémentaire echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"dans ce fichier. Au moins, vous pouvez emporter avec vous ce fichier alias sur une autre machine (ce devrait être le cas .bash_aliases, mais dans ce cas "déconseillé", il est préférable d’utiliser un autre nom).
Hastur
Si vous voulez faire cela, évitez la confusion en utilisant un nom comme alias shutdown=shutdown-disabled-by-an-alias. (Cela ne concerne que le troisième et le plus mineur problème signalé par @DavidRicherby.) Bien que la prochaine personne ne prenne probablement encore que 2 secondes pour passer de la tâche notforuse is not a commandà la type -a shutdownrecherche et à la recherche de l'alias, puis la saisie sudo \shutdownpour désactiver l'expansion de l'alias. (En supposant qu'ils aient un sudoalias sudo='sudo ', il développe les alias dans son premier argument).
Peter Cordes
1

Pour shutdown( reboot, haltet connexes): J'ai une copie avec me demander si je suis vraiment sûr (et il ne fait rien de toute façon). Je stocke ces scripts dans /usr/local/sbin. Sur Debian, la priorité est autre /sbin(c’est le premier répertoire de PATH).

Scripts système utiliser le chemin complet, de sorte que cette bidouille me empêcher d'arrêter un serveur distant au lieu de la machine locale (un mauvais comportement de Impressionnant WM), mais n'a pas d' autre effet indirect, et je peux toujours les utiliser comme / sbin / arrêt lorsque vraiment nécessaire .

Giacomo Catenazzi
la source
Ces hacks ne fonctionnent que si vous les appliquez sur tous les ordinateurs auxquels vous vous connectez ... ce qui est souvent peu pratique et vous ne le saurez pas avant qu'il ne soit trop tard: en tapant shutdownsur un système critique qui n'a pas votre hack.
Jpaugh
@ jpaugh: oui, c'est un hack, je ne l'utilise que pour mes serveurs personnels, où je me suis souvent connecté, et les terminaux restent ouverts trop longtemps. [Remarque: j'utilise également des invites de couleurs différentes pour mes machines personnelles: racine distante, utilisateur distant, racine locale, utilisateur local]. Pour les vrais serveurs et les machines distantes, j'évite les racines et je le fais le moins possible, et bien sûr, sans oublier de les quitter. J'utilise simplement mes télécommandes en tant que "nuage" (avant le battage médiatique sur le nuage, donc traité à l'ancienne).
Giacomo Catenazzi
1

Le fichier Sudoers autorise un niveau de granularité bien plus fin que celui que * 'est autorisé à utiliser sudo' *. Vous pouvez notamment utiliser des alias de commande pour créer des listes blanches de groupes de commandes auxquelles un utilisateur ou un groupe donné est soumis. J'ai travaillé avec des serveurs distants restreints à l'accès ssh et autorisés à sudo sans mot de passe (nous avions besoin de clés ssh protégées par mot de passe). Il y a de bonnes raisons à cela, mais cela présente des dangers. Nous avons donc utilisé des alias de commande pour permettre un accès illimité à ce qu'ils doivent faire (redémarrage de serveurs, etc.) sans leur accorder de privilèges.

Il existe également une syntaxe pour dire «ne peut pas exécuter cette commande» . Cela peut être corrigé, donc cela ne devrait pas être utilisé comme une véritable mesure de sécurité mais cela fonctionnerait pour le scénario que vous avez décrit.

Man Sudoers a de bons exemples sur la façon de tout mettre en place.

Bien sûr, cela nécessite d’utiliser sudo, mais cela devrait aller de soi.

tallus
la source
1

Vous êtes peut-être victime d’une nouvelle stupidité d’Ubuntu.

Ubuntu utilisait la shutdowncommande classique classique qui prend un argument de temps obligatoire.

Voici ce qui se passe sur Ubuntu 12 si je tape shutdown, même en tant qu'utilisateur régulier:

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

ensuite

$ shutdown +100
shutdown: need to be root.

Maintenant, voici Ubuntu 16.10. Je ne suis pas root:

$ 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.

En l'absence d'argument, il planifie un arrêt 60 secondes plus tard, et même si vous n'êtes pas root, vous ne disposez que d'un compte créé avec les privilèges d'administrateur.

Blâme canonique.

Kaz
la source
6
/sbin/shutdown est fourni par systemd-sysvpaquet par défaut, donc ce n'est pas une stupidité Ubuntu, c'est une systemdstupidité, et cela ne vient pas d'Ubuntu, mais au moins de Debian, ce qui, à son tour, semble prendre tout le systemdmouvement de Red Hat. Lorsque vous blâmez, blâmez la bonne entité - pas seulement celle que vous n'aimez pas.
Ruslan
1
@Ruslan Personne qui emballe cette merde dans sa distribution échappe à la responsabilité de la stupidité.
Kaz
0

Pour l'arrêt, il y a molly-guard. Vous avez juste besoin de l'installer et lorsque vous essayez de vous arrêter via ssh, il vous demande de taper le nom d'hôte.

Pour supprimer des fichiers, il existe des solutions telles que libtrash, qui émule une corbeille via une LD_PRELOADbibliothèque.

Et vous pouvez tester quels fichiers vous modifiez / supprimez / ... avec peut - être le programme. C'est plutôt cool quand on teste quelque chose.

allo
la source
1
Cette maybechose semble être brisée par la conception: écraser certains appels système avec no-ops va bloquer tout programme non trivial qui repose sur ces appels système pour réussir.
Dmitry Grigoryev
-2

Essayez ceci: lorsque vous êtes sur un shell distant, chaque fois que vous êtes sur le point de taper la touche "retour", arrêtez-vous pendant 5 secondes, passez votre doigt sur la touche "retour" et relisez la commande que vous êtes sur le point d'envoyer. Est-ce que c'est bon? Êtes-vous sûr?

Cela semble sévère, mais d’un autre côté, nous ne devrions pas passer beaucoup de temps sur des obus isolés. Nous devrions trouver tous les moyens d’automatiser nos travaux de maintenance, de sorte que nous n’avons que rarement, voire jamais, besoin de nous connecter à un serveur distant.

xpmatteo
la source
J'ai essayé, ça ne marchait pas. Je suis entré shutdown, arrêté pendant 5 secondes, relu la commande (à haute voix!) Et je suis sûr que c'était correct. Appuyez ensuite sur Entrée et la commande qui vient d'être exécutée. Donc, cela n'a pas désactivé les commandes effrayantes, j'en ai bien peur. Je vais essayer avec ce doigt flottant, peut-être que la distance était trop petite / trop grande.
wojciech_rak