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


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.


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.


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ół
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.