Случайно переименован / bin Помощь!

39

У меня есть чрезвычайная ситуация, новичок в Linux и Bash здесь, и я запутался, пытаясь написать скрипт для переименования некоторых файлов. Цикл случайно пошел по пути (запустил скрипт в папке на рабочем столе) и переименовал /binв /D_bin( D_был добавлен префикс), так что теперь система не может использовать /binсодержимое, поэтому нет bash, нет, mvчтобы переименовать, нет sudo... Файлы в /D_binв порядке, не переименовывается, а может скопировать и вставить их , но не может создать папку /binснова без Баша. Система выглядит стабильно, но мало что работает и не имеет доступа к файлам на рабочем столе.

Другие папки /вроде /lib /sbin /etcбы тоже в порядке, и графический рабочий стол все еще там. Я боюсь перезапуска, потому что я не знаю, сможет ли он загрузиться.

Есть ли в корне оболочка или способ переименовать /D_binобратно /bin? Нужна помощь, пожалуйста, очень важная работа скомпрометирована

Мой суицидальный сценарий: $:

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

:( Благодарность!!!!

Карлос Д. Сапата
источник
7
Вы можете попробовать использовать виртуальную машину, чтобы научиться этому, и вы никогда не рискуете.
М. Бесерра
7
Теперь, чтобы решить эту проблему, вы можете создать загрузочный USB-носитель с Ubuntu, как если бы вы хотели установить ОС, и нажать Try Ubuntu , после чего вы можете открыть терминал и переименовать папку.
М. Бесерра
2
Возможная
копия
32
/D_bin/mv -T /D_bin /binи не запускайте ваши скрипты от имени root в следующий раз.
Джейсон С
5
Кстати, при создании таких сценариев я обычно сначала выполняю пробный запуск, заставляя сценарий выводить потенциально разрушительные команды вместо их запуска и проверяя, что его действия будут вменяемыми. Также: регулярные резервные копии.
Джейсон С

Ответы:

89

Есть несколько способов решить эту проблему.

Если у вас есть доступ к оболочке (любой открытый терминал), запустите:

sudo /D_bin/mv -T /D_bin /bin

sudoв /usr/binтак что нет никакой необходимости , чтобы запустить его с абсолютным путем.

Другая вещь , которую вы можете сделать это, добавив /D_binк вашей PATHпеременной окружения, как это:

export PATH=$PATH:/D_bin

Если у вас нет доступа к какой-либо оболочке:

  1. перезагрузите систему
  2. когда появится grub, нажмите eдля редактирования grub
  3. в конце строки, начинающейся с linux, добавьте:

    init=/D_bin/bash
  4. нажмите CTRL+x

Теперь вы попадете в оболочку bash, вам следует перемонтировать файловую систему как доступную для чтения и записи.

/D_bin/mount -o remount,rw /

И переместите каталог D_bin в bin:

/D_bin/mv -T /D_bin /bin

Затем перезагрузите систему.

Это должно работать, но если у вас ничего не получилось, вы все равно можете загрузить систему с живого диска Ubuntu / usb и решить проблему.

Ravexina
источник
2
Первый решил это. Большое спасибо, действительно спас мой день. Из любопытства, наблюдая за сценарием, почему переименование достигло / bin? Все папки в Desktop получили '_D', но не дома или в корне, кроме bin.
Карлос Д. Сапата
9
@ CarlosD.Zapata: если вам нужно изменить каталог в цикле в скрипте, часто хорошей идеей будет запускать код в подшлемнике. Добавьте открытую скобку перед cd "$j"(имя должно быть в двойных кавычках) и замените создание cd ..интриг соответствующими закрывающими скобками. Кроме того, почему вы работали от имени пользователя root? Вы не должны быть в состоянии нанести такой большой урон.
Джонатан Леффлер
3
@ CarlosD.Zapata: после cd ..установки pwdудалите findкоманду из скрипта, затем запустите ее как обычный пользователь. вы увидите, что сценарий /включается, потому что вы делаете CD $ J, который, я думаю, являются файлами, а не каталогами. так что в каждом цикле вы делаете один шаг назад и, наконец, вы в /.
Равексина
1
@ CarlosD.Zapata Имейте в виду, что он мог "остановиться", /binпотому что работал над папками внутри /bin. Я бы проверил их (хотя и не как root!)
wizzwizz4
17
Вероятно, он остановился на / bin, потому что / bin был первой папкой в ​​/, которую он переименовал (сначала в алфавитном порядке), и после этого он больше не мог работать mv.
user253751
8

Чтобы решить эту проблему, если у вас нет открытого терминала, я сначала попытался бы найти «заменитель оболочки», который вы можете использовать вместо bash. Python включен /usr/bin, так что все еще должно работать.

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

Если это не сработает, я бы просто загрузился с живого CD / USB и все починил из известной здравой рабочей среды.

В качестве общего совета, я бы поддержал Джонатана Леффлера в комментариях: никогда не используйте cd ..в сценариях, это может легко привести к таким проблемам. Лучше всего сдаться в $jкаталог в рамках подоболочки попал , так что вам не нужно беспокоиться о возвращении.

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

Также, конечно, не запускайте вещи с правами root, если в этом нет крайней необходимости.

leftaroundabout
источник
Можно ли запустить интерактивную оболочку типа python без доступа к какой-либо другой оболочке / терминалу? Я думаю, что обходной путь должен создать сценарий, который содержит команду наряду с паролем для запуска его от имени пользователя root. GUI сделает все остальное, я думаю.
Равексина
@Ravexina: не все могут нуждаться в раковине . Мы уверены, что для запуска pythonпроцесса вам понадобится терминальное приложение, а для запуска os.system("sudo ...")вам понадобится ядро ​​* nix. Возможно я попробую это в VM позже ...
leftaround около
Кроме того, при cdнаписании сценариев обычно лучше cd -вернуться туда, где вы были, а не предполагать, что вы перешли на один каталог. Если вы измените начальную букву cd, то cd ..вы не вернетесь туда, где вы были, но вернетесь cd -.
Frambot
@JoeFrambach, как cd ..я бы не использовал cd -в сценариях, только в командной строке. cd -Возможно, это меньше проблем, чем это cd .., но я все равно не посчитал бы это безопасным - если кто-то добавит дальнейшие изменения каталога в середине, это приведет вас куда-то непреднамеренно. Принимая во внимание, что подоболочки дают вам четко разграниченную область, в которой изменяется каталог и к какой точке вы возвращаетесь.
leftaround около
@Ravexina Я только что попробовал: Python действительно может быть запущен. Его os.systemвовсе не работать без shнастоящего, но subprocess.callработает.
leftaround около