Przypadkowa zmiana nazwy / bin Pomoc!

39

Mam tutaj sytuację awaryjną, Linux i Bash dla początkujących i popsułem się, próbując napisać skrypt zmieniający nazwy niektórych plików. Pętla przypadkowo poszła ścieżką (uruchomiła skrypt w folderze na pulpicie) i zmieniła nazwę /binna /D_bin(to D_był prefiks, który dodałem), więc teraz system nie może używać /binzawartości, więc nie bash, nie, mvaby zmienić nazwę, nie sudo... Pliki w /D_binsą ok, nie nazwę, i można je skopiować i wkleić, ale nie można utworzyć folderu /binponownie bez bash. System wygląda stabilnie, ale bardzo niewiele rzeczy działa i nie ma dostępu do plików na pulpicie.

Inne foldery /podobne również /lib /sbin /etcwydają się być w porządku, a pulpit graficzny nadal tam jest. Boję się ponownie uruchomić, ponieważ nie wiem, czy będzie można go uruchomić.

Czy istnieje powłoki root lub sposób, aby zmienić nazwę /D_binz powrotem /bin? Potrzebujesz pomocy, bardzo ważna praca została naruszona

Mój samobójczy skrypt: $:

#!/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

:( Dzięki!!!!

Carlos D. Zapata
źródło
7
Możesz spróbować użyć maszyny wirtualnej, aby nauczyć się tego rodzaju rzeczy, więc nigdy nie ryzykujesz dużo.
M. Becerra,
7
Teraz, aby rozwiązać problem, możesz zrobić bootowalny USB z Ubuntu, jakbyś chciał zainstalować system operacyjny i naciśnij Wypróbuj Ubuntu , stamtąd możesz otworzyć terminal i zmienić nazwę folderu.
M. Becerra,
32
/D_bin/mv -T /D_bin /bini następnym razem nie uruchamiaj swoich skryptów jako root.
Jason C
5
Przy okazji, kiedy robię takie skrypty, zwykle najpierw wykonuję suchą próbę, wywołując echo potencjalnie destrukcyjnych poleceń zamiast je uruchamiać i sprawdzać, czy jego działania będą rozsądne. Ponadto: regularne kopie zapasowe.
Jason C

Odpowiedzi:

89

Istnieje kilka sposobów rozwiązania tego problemu.

Jeśli masz dostęp do powłoki (dowolnego otwartego terminala), uruchom:

sudo /D_bin/mv -T /D_bin /bin

sudojest włączony, /usr/binwięc nie ma potrzeby uruchamiania go z bezwzględną ścieżką.

Inną rzeczą, którą możesz zrobić, jest dodanie /D_bindo PATHzmiennej środowiskowej:

export PATH=$PATH:/D_bin

Jeśli nie masz dostępu do żadnej powłoki:

  1. zrestartuj system
  2. gdy pojawi się grub, naciśnij, eaby edytować grub
  3. na końcu linii, która zaczyna się od linux, dodaj:

    init=/D_bin/bash
  4. naciśnij CTRL+x

Teraz zostaniesz przeniesiony do powłoki bash, powinieneś ponownie zamontować system plików jako do odczytu i zapisu.

/D_bin/mount -o remount,rw /

I przenieś katalog D_bin do bin:

/D_bin/mv -T /D_bin /bin

Następnie uruchom ponownie system.

Powinien działać, ale jeśli nic nie działało, nadal możesz uruchomić system z dysku / usb na żywo z Ubuntu i naprawić problem.

Ravexina
źródło
2
Pierwszy to rozwiązał. Wielkie dzięki, naprawdę uratowałem mój dzień. Z ciekawości, obserwując skrypt, dlaczego zmiana nazwy osiągnęła / bin? Wszystkie foldery na pulpicie mają „_D”, ale żaden inny w domu lub w katalogu głównym oprócz bin.
Carlos D. Zapata
9
@ CarlosD.Zapata: jeśli chcesz zmienić katalog w pętli w skrypcie, często dobrym pomysłem jest uruchomienie kodu w pod-she. Dodaj otwarty nawias przed cd "$j"(nazwa powinna być w cudzysłowie) i zamień zgorszenie cd ..na pasujący ścisły nawias. Ponadto, dlaczego działasz jako root. Nie powinieneś być w stanie wyrządzić tyle szkód.
Jonathan Leffler,
3
@ CarlosD.Zapata: po cd ..wstawieniu pwdusuń findpolecenie ze skryptu, a następnie uruchom je jako zwykły użytkownik. zobaczysz skrypt, w który się wchodzi /, ponieważ robisz płytę CD $ j, która, jak sądzę, nie jest katalogiem. więc w każdej pętli cofasz się o krok i w końcu wchodzisz /.
Ravexina,
1
@ CarlosD.Zapata Pamiętaj, że mógł się on „zatrzymać”, /binponieważ działał na folderach wewnątrz /bin. Sprawdziłbym te (choć nie jako root!)
wizzwizz4,
17
Prawdopodobnie zatrzymał się na / bin, ponieważ / bin był pierwszym folderem w /, którego nazwa się zmieniła (najpierw alfabetycznie), a potem nie mógł już działać mv.
użytkownik253751
8

Aby rozwiązać ten problem, jeśli nie masz otwartego terminalu, najpierw spróbuję znaleźć „substytut powłoki”, którego możesz użyć zamiast bash. Python jest włączony /usr/bin, więc to powinno nadal działać.

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"])

Jeśli to nie zadziała, po prostu uruchomię z Live CD / USB i naprawię wszystko ze znanego, zdrowego środowiska.

Jako ogólną radę podałbym Jonathana Lefflera w komentarzach: nigdy nie używaj go cd ..w skryptach, może to łatwo prowadzić do takich problemów. Lepiej tylko cd do $jkatalogu w podpowłoce , dzięki czemu nie musisz się martwić o powrót.

#!/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

Oczywiście nie uruchamiaj rzeczy jako root, chyba że jest to absolutnie konieczne.

po lewej stronie
źródło
Czy można uruchomić interaktywną powłokę, taką jak python, bez dostępu do jakiejkolwiek innej powłoki / terminala? Myślę, że obejściem powinno być utworzenie skryptu zawierającego polecenie obok hasła, aby uruchomić go jako root. GUI zrobi resztę, jak sądzę.
Ravexina,
@Ravexina: nie wszystko może wymagać powłoki . Aby uruchomić pythonproces, wystarczy aplikacja terminalowa, a do uruchomienia os.system("sudo ...")wystarczy jądro * nix. Może wypróbuję to później na maszynie wirtualnej ...
lewo około
Ponadto podczas cdpisania skryptów zwykle lepiej jest cd -wrócić do miejsca, w którym byłeś, niż zakładać, że zapisałeś jeden katalog w dół. Jeśli zmienisz inicjał cd, wtedy cd ..nie wrócisz tam, gdzie byłeś, ale cd -zrobi to.
Frambot,
@JoeFrambach jak cd ..bym nie używać cd -w skryptach, tylko w linii poleceń. cd -jest może mniejszą gwarancją na kłopoty niż cd .., ale nadal nie uważałbym tego za bezpieczne - jeśli ktoś doda kolejne zmiany katalogu w środku, zabierze Cię to gdzieś niezamierzone. Natomiast podpowłoki dają wyraźnie ograniczony zakres, w którym zmienia się katalog i do którego punktu wracasz.
lewo wokół
@Ravexina Właśnie próbowałem: Python rzeczywiście można uruchomić. Jego os.systemma nie pracować bez shobecne, ale subprocess.callprace.
lewo wokół