web-dev-qa-db-fra.com

Accidentellement renommé / bin Aide!

J'ai une urgence, Linux et Bash débutant ici et foiré en essayant d'écrire un script pour renommer des fichiers. La boucle a accidentellement remonté le chemin (a exécuté le script dans un dossier du bureau) et a renommé /bin en /D_bin (D_ était le préfixe que j’avais ajouté); le système ne peut donc pas utiliser le contenu de /bin, donc pas de bash, ni de mv pour le renommer, non Sudo... Les fichiers dans /D_bin sont corrects, ne sont pas renommés et peuvent être copiés-collés mais ne peuvent pas créer de dossier /bin sans bash. Le système semble stable, mais très peu de choses fonctionnent et n’ont pas accès aux fichiers de Desktop.

Les autres dossiers de / tels que /lib/sbin/etc semblent également fonctionner, et le bureau graphique est toujours là. J'ai peur de redémarrer parce que je ne sais pas s'il pourra démarrer.

Existe-t-il un shell à la racine ou un moyen de renommer /D_bin en /bin? Besoin d'aide s'il vous plaît, travail très important compromis

Mon script suicidaire: $:

#!/bin/bash
files=~/Desktop/folder_1/*

for j in $files
do
    cd $j
    for i in 10n*  #file names starting by 10n
    do
       find * -maxdepth 0 ! -path . -exec mv {} D_{} \;
    done
    cd ..
done

:( Merci!!!!

39
Carlos D. Zapata

Il existe plusieurs façons de résoudre ce problème.

Si vous avez accès à un shell (n'importe quel terminal ouvert), exécutez:

Sudo /D_bin/mv -T /D_bin /bin

Sudo est dans /usr/bin, il n’est donc pas nécessaire de l’exécuter avec un chemin absolu.

Vous pouvez également ajouter le /D_bin à votre variable d’environnement PATH, comme ceci:

export PATH=$PATH:/D_bin

Si vous n'avez accès à aucun shell:

  1. redémarrer le système
  2. quand grub apparaît appuyez sur e éditer la bouffe
  3. à la fin de la ligne qui commence par linux, ajoutez:

    init=/D_bin/bash
    
  4. presse CTRL+x

Maintenant que vous allez être déposé dans un shell bash, vous devez remonter le système de fichiers en lecture et en écriture.

/D_bin/mount -o remount,rw /

Et déplacez le répertoire D_bin vers bin:

/D_bin/mv -T /D_bin /bin

Puis redémarrez le système.

Cela devrait fonctionner, mais si rien ne fonctionnait pour vous, vous pouvez toujours démarrer le système avec un disque/usb ubuntu en direct et résoudre le problème.

89
Ravexina

Pour résoudre ce problème si vous n'avez pas de terminal en cours d'exécution, essayez tout d'abord de trouver un "substitut de shell" que vous pouvez utiliser à la place de bash. Python est dans /usr/bin, donc cela devrait quand même fonctionner.

Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.call(["Sudo", "/D_bin/mv", "-T", "/D_bin", "/bin"])

Si cela ne fonctionne pas, je démarrerais directement à partir d'un CD/USB et réparer tout depuis un environnement de travail connu.

À titre de conseil général, j'aimerais ajouter Jonathan Leffler dans les commentaires: n'utilisez jamais cd .. dans les scripts, cela peut facilement entraîner de tels problèmes. Mieux vaut ne placer que le cd dans le répertoire $j dans un sous-shell, de cette façon vous n’aurez plus à vous soucier de revenir.

#!/bin/bash
files=~/Desktop/folder_1/*

for j in $files
do
  (
    cd "$j"
    for i in 10n*  #file names starting by 10n
    do
       find * -maxdepth 0 ! -path . -exec mv {} D_{} \;
    done
  )
done

De plus, bien sûr, ne lancez rien en tant que root, sauf en cas d'absolue nécessité.

8
leftaroundabout