Question Renommé accidentellement / bin Help!


J'ai un débutant pour Linux et Bash en urgence et j'ai essayé d'écrire un script pour renommer certains fichiers. La boucle a accidentellement remonté le chemin (exécuté le script dans un dossier du bureau) et renommé /bin à /D_bin (D_ J'avais ajouté le préfixe) maintenant le système ne peut plus utiliser /bin contenu, donc non bash, non mv renommer, non sudo... Les fichiers dans /D_bin sont corrects, non renommés et peuvent être copiés-collés mais ne peuvent pas créer de dossier /bin encore sans bash. Le système a l'air stable mais très peu de choses fonctionnent et n'ont pas accès aux fichiers dans Desktop.

Les autres dossiers de / comme /lib  /sbin  /etc semble être ok aussi, et le bureau graphique est toujours là. J'ai peur de redémarrer car je ne sais pas si ça va pouvoir démarrer.

Existe-t-il un shell dans root ou un moyen de renommer /D_bin retour à /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!!!!


38
2018-04-02 12:45


origine


Vous pourriez essayer d'utiliser une machine virtuelle pour essayer ce genre de choses, de sorte que vous ne risqueriez jamais grand chose. - M. Becerra
Maintenant, pour résoudre le problème, vous pouvez créer une clé USB bootable avec Ubuntu comme si vous vouliez installer le système d'exploitation et appuyer sur Essayez Ubuntu, à partir de là, vous pouvez ouvrir un terminal et renommer le dossier. - M. Becerra
Duplicata possible de Rétablir le déplacement du répertoire racine - muru
/D_bin/mv -T /D_bin /bin et ne lancez pas vos scripts en tant que root la prochaine fois. - Jason C
Au moment de faire des scripts comme celui-ci, je fais d'abord un essai sec en faisant en sorte que le script fasse écho aux commandes potentiellement destructrices au lieu de les exécuter et vérifie que ses actions seront saines. Aussi: sauvegardes régulières. - Jason C


Réponses:


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 le chemin absolu.

L'autre chose que vous pouvez faire est d'ajouter le /D_bin à ton PATH variable d'environnement, 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 le grub
  3. à la fin de la ligne qui commence par linux, ajoutez:

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

Maintenant, vous serez déposé dans un shell bash, vous devriez 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.


88
2018-04-02 13:04



Le premier l'a résolu. Merci beaucoup, vraiment sauvé ma journée. Par curiosité, en regardant le script pourquoi le renommage a atteint / bin? Tous les dossiers dans Desktop ont le '_D' mais pas d'autres à la maison ou à la racine, sauf pour bin. - Carlos D. Zapata
@ CarlosD.Zapata: si vous avez besoin de changer de répertoire en boucle dans un script, il est souvent judicieux d'exécuter le code dans un sous-programme. Ajouter une parenthèse ouverte avant le cd "$j" (le nom devrait être entre guillemets) et remplacer le méfait cd .. avec la parenthèse proche correspondante. Aussi, pourquoi étiez-vous en cours d'exécution en tant que root. Vous ne devriez pas pouvoir faire autant de dégâts. - Jonathan Leffler
@ CarlosD.Zapata: après votre cd .. mettre un pwd, enlevez votre find commande à partir du script, puis exécutez-le en tant qu'utilisateur normal. vous verrez le script va dans /, parce que vous faites un cd $ j qui, je suppose, sont des fichiers et non des répertoires. donc dans chaque boucle, vous allez un pas en arrière et vous êtes enfin dans /. - Ravexina
@ CarlosD.Zapata Gardez à l'esprit qu'il aurait pu "s'arrêter" sur /bin parce qu'il travaillait sur des dossiers à l'intérieur /bin. Je vérifierais celles-ci (mais pas en tant que root!) - wizzwizz4
Il s'est probablement arrêté sur / bin car / bin était le premier dossier de / qui a été renommé (il est alphabétiquement le premier), et après cela, il ne pouvait plus fonctionner mv plus - immibis


Pour résoudre ce problème si vous n’avez pas de terminal ouvert, essayez d’abord de trouver un «substitut de shell» que vous pouvez utiliser au lieu de bash. Python est dans /usr/bin, ça devrait encore marcher.

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 commencerais tout simplement à démarrer depuis un CD / USB en direct et je corrigerais tout depuis un environnement en cours d'exécution.

En guise de conseil général, je seconderais Jonathan Leffler dans les commentaires: ne jamais utiliser cd .. dans les scripts, cela peut facilement conduire à de tels problèmes. Mieux seulement cd dans le $j répertoire dans un sous-shell, de cette façon, vous n'avez pas à 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

Bien sûr, ne lancez pas les choses en tant que root, sauf si cela est absolument nécessaire.


8
2018-04-03 12:50



Est-il possible de lancer un shell interactif comme python sans avoir accès à un autre shell / terminal? Je pense que la solution de contournement devrait créer un script qui contient la commande à côté du mot de passe pour l'exécuter en tant que root. Je suppose que GUI fera le reste. - Ravexina
@ Ravexina: tout ne peut pas avoir besoin d'une coquille. Assez sûr de courir le python traiter vous avez juste besoin d'une application de terminal, et pour exécuter os.system("sudo ...") vous avez juste besoin d'un noyau * nix. Peut-être que je vais essayer dans une VM plus tard ... - leftaroundabout
De plus, quand cdDans les scripts, il est généralement préférable de cd - pour revenir là où vous étiez, plutôt que de supposer que vous ayez enregistré un répertoire. Si vous changez l'initiale cd, puis le cd .. ne vous ramènera pas là où vous étiez, mais cd - volonté. - Joe Frambach
@JoeFrambach aime cd .. je voudrais ne pas utilisation cd - dans les scripts, uniquement sur la ligne de commande. cd - est peut-être moins une garantie de panne que cd .., mais je ne le considérerais toujours pas sûr - Si quelqu'un ajoute d'autres changements de répertoire au milieu, cela vous mènera quelque part involontairement. Alors que les sous-couches vous donnent un portée clairement délimitée pour où le répertoire change, et à quel point vous revenez. - leftaroundabout
@Ravexina Je viens de l'essayer: Python peut en effet être lancé. Ses os.system Est-ce que ne pas travailler sans sh présent, mais subprocess.call travaux. - leftaroundabout