Quel est le contenu de / bin / bash et que dois-je faire si je les écrase accidentellement

24

J'ai accidentellement remplacé le fichier / bin / bash par un script stupide que j'avais l'intention de placer dans le dossier / bin.

Comment récupérer le contenu de ce fichier? Existe-t-il un moyen de trouver le contenu sur le Web et de le recopier? Quelles sont mes options ici, étant donné que le terminal donne une erreur en parlant de "Trop de liens symboliques?"

Je suis encore un nouveau venu dans ce genre de choses et j'apprécie toute l'aide que je peux obtenir.

Edit: j'ai oublié de mentionner que je suis sur Kali 2.2 Rolling, qui est à peu près Debian avec quelques fonctionnalités supplémentaires.

Edit 2: J'ai également redémarré la machine, car je n'ai réalisé mon erreur qu'il y a quelques jours. Cela rend cela un peu plus difficile.

GarrukApex
la source
9
Bash supprimé? Utilisez simplement zsh :-) </troll>
Kevin
1
serverfault.com/questions/451528/… et plusieurs autres
skandigraun
physique ou VM?
Ben Aveling
9
Pour la prochaine fois: ne placez rien dans les répertoires système . Si vous voulez des scripts et des trucs personnalisés, créez-en un $HOME/.binet ajoutez-le à votre PATHou utilisez-le /usr/local/binsi vous en avez besoin pour l'ensemble du système. Ou, mieux encore, créez un package.
spectras

Réponses:

33

bashest un shell, probablement votre shell système, donc maintenant des choses étranges se produisent, tandis que des parties du shell sont toujours en mémoire. Une fois que vous vous déconnectez ou redémarrez, vous aurez de plus gros problèmes.

Donc, la première chose devrait être de changer votre shell en quelque chose de sûr. Voir les coques que vous avez installées

cat /etc/shells

Ensuite, changez votre shell pour l'un des autres shells répertoriés ici, par exemple

chsh -s /bin/dash

Mettre à jour, car vous avez déjà redémarré:

Vous avez de la chance qu'aujourd'hui le processus de démarrage ne repose pas sur bash, donc votre système démarre, vous ne pouvez tout simplement pas obtenir de ligne de commande. Mais vous pouvez démarrer un éditeur pour éditer /etc/passwdet changer le shell dans la rootligne de /bin/bashà /bin/dash. Déconnectez-vous et reconnectez-vous. N'apportez simplement aucune autre modification à ce fichier, sinon vous risquez de gâcher complètement votre système.

Essayez ensuite de réinstaller bashavec

apt-get --reinstall install bash

Si tout a réussi, vous pouvez chshrevenir à bash.

Enfin: je pense que kali est une distribution hautement spécialisée, probablement pas adaptée aux personnes qui écrasent accidentellement leur shell. Comme cette phrase était qualifiée de grossière et de dure, je dois ajouter que je l'ai écrite à partir de ma propre expérience. Quand j'étais plus jeune, j'ai ruiné mon système parce que personne ne m'a dit d'éviter de déconner en tant que root.

Philippos
la source
3
@ dr01: Étant donné le fonctionnement de l'échappement bash, il peut s'agir d'une citation mal placée. Pensez command > /bin/bash ...contre command > (/bin/bash ...).
MSalters
7
Cette dernière phrase a été dure ... :)
James Reinstate Monica Polk
6
@MSalters Une citation mal placée exécutée en tant que root . Voilà deux erreurs. Le deuxième, bien sûr, étant d'essayer vos pipelines compliqués en tant que root, et non en tant qu'utilisateur non privilégié.
derobert
12
@JamesKPolk non, ce n'est pas dur du tout. C'est la simple vérité. Kali est un outil professionnel conçu pour être utilisé par des experts . Ils l' indiquent même sur leur page Web. Si vous n'êtes pas un expert, vous n'avez vraiment rien à faire avec Kali.
terdon
3
La dernière phrase n'est pas dure. C'est la simple vérité.
Andrea Lazzarotto
65

N'arrêtez pas votre machine.

Avez-vous toujours un shell en cours d'exécution? C'est bash? Si oui, ça va. (Mais ne recommencez pas.)

Courir:

sudo cp /proc/$$/exe /bin/bash

Voila, tout va bien.


Étant donné que quelqu'un dans les commentaires doute que cela fonctionne:

[vagrant@localhost ~]$ cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
[vagrant@localhost ~]$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[vagrant@localhost ~]$ echo $0
-bash
[vagrant@localhost ~]$ sudo rm /bin/bash
[vagrant@localhost ~]$ bash
-bash: /bin/bash: No such file or directory
[vagrant@localhost ~]$ sudo su -
su: /bin/bash: No such file or directory
[vagrant@localhost ~]$ sudo cp /proc/$$/exe /bin/bash
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ exit
[vagrant@localhost ~]$ sudo su -
[root@localhost ~]# logout
[vagrant@localhost ~]$ 
Caractère générique
la source
18
Dans tous les cas, après cela, il est recommandé de réinstaller bash à partir de votre distribution, par exemple pour les autorisations correctes (certains chasseurs de rootkits pourraient être surpris des changements là-bas), également pour restaurer le lien dur ou le lien symbolique (par exemple vers /bin/shou rbash)
Giacomo Catenazzi
4
@GiacomoCatenazzi, en fait, cette méthode préserve les autorisations — c'est la valeur par défaut lors de l' rootexécution cp. Les liens durs sont un bon point, cependant.
Wildcard
1
La machine a été redémarrée. Je ne peux pas ouvrir un shell normal, mais je peux modifier le contenu via l'interface graphique. Comme indiqué précédemment, j'obtiens une erreur indiquant "Échec de l'exécution du processus enfant / bin / bash. (Trop de niveaux de liens symboliques)."
GarrukApex
5

Si vous pouvez vous connecter, mais vous ne pouvez pas ouvrir un terminal ou accéder autrement à un shell, mais vous pouvez accéder aux fichiers via l'interface graphique, accédez à /bin, recherchez les fichiers dont les noms se terminent par sh(mais pas .sh) et exécutez-en un (en double-cliquant sur ou clic droit). Recherchez en particulier les éléments suivants:

  • sh
  • dash
  • ash
  • ksh (ou kshsuivi d'un nombre; par exemple,  ksh93)
  • zsh
  • yash

ou, en dernier recours,

  • tcsh ou
  • csh

Si vous pouvez faire fonctionner un shell, essayez la réponse de Philippos .

Une autre approche consiste à démarrer en mode mono-utilisateur en suivant ces instructions mais en spécifiant init=/bin/sh(ou l'un des autres shells) au lieu de init=/bin/bash.

Scott
la source