У меня есть чрезвычайная ситуация, новичок в 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
:( Благодарность!!!!
источник
/D_bin/mv -T /D_bin /bin
и не запускайте ваши скрипты от имени root в следующий раз.Ответы:
Есть несколько способов решить эту проблему.
Если у вас есть доступ к оболочке (любой открытый терминал), запустите:
sudo
в/usr/bin
так что нет никакой необходимости , чтобы запустить его с абсолютным путем.Другая вещь , которую вы можете сделать это, добавив
/D_bin
к вашейPATH
переменной окружения, как это:Если у вас нет доступа к какой-либо оболочке:
в конце строки, начинающейся с linux, добавьте:
нажмите CTRL+x
Теперь вы попадете в оболочку bash, вам следует перемонтировать файловую систему как доступную для чтения и записи.
И переместите каталог D_bin в bin:
Затем перезагрузите систему.
Это должно работать, но если у вас ничего не получилось, вы все равно можете загрузить систему с живого диска Ubuntu / usb и решить проблему.
источник
cd "$j"
(имя должно быть в двойных кавычках) и замените созданиеcd ..
интриг соответствующими закрывающими скобками. Кроме того, почему вы работали от имени пользователя root? Вы не должны быть в состоянии нанести такой большой урон.cd ..
установкиpwd
удалитеfind
команду из скрипта, затем запустите ее как обычный пользователь. вы увидите, что сценарий/
включается, потому что вы делаете CD $ J, который, я думаю, являются файлами, а не каталогами. так что в каждом цикле вы делаете один шаг назад и, наконец, вы в/
./bin
потому что работал над папками внутри/bin
. Я бы проверил их (хотя и не как root!)mv
.Чтобы решить эту проблему, если у вас нет открытого терминала, я сначала попытался бы найти «заменитель оболочки», который вы можете использовать вместо bash. Python включен
/usr/bin
, так что все еще должно работать.Если это не сработает, я бы просто загрузился с живого CD / USB и все починил из известной здравой рабочей среды.
В качестве общего совета, я бы поддержал Джонатана Леффлера в комментариях: никогда не используйте
cd ..
в сценариях, это может легко привести к таким проблемам. Лучше всего сдаться в$j
каталог в рамках подоболочки попал , так что вам не нужно беспокоиться о возвращении.Также, конечно, не запускайте вещи с правами root, если в этом нет крайней необходимости.
источник
python
процесса вам понадобится терминальное приложение, а для запускаos.system("sudo ...")
вам понадобится ядро * nix. Возможно я попробую это в VM позже ...cd
написании сценариев обычно лучшеcd -
вернуться туда, где вы были, а не предполагать, что вы перешли на один каталог. Если вы измените начальную буквуcd
, тоcd ..
вы не вернетесь туда, где вы были, но вернетесьcd -
.cd ..
я бы не использовалcd -
в сценариях, только в командной строке.cd -
Возможно, это меньше проблем, чем этоcd ..
, но я все равно не посчитал бы это безопасным - если кто-то добавит дальнейшие изменения каталога в середине, это приведет вас куда-то непреднамеренно. Принимая во внимание, что подоболочки дают вам четко разграниченную область, в которой изменяется каталог и к какой точке вы возвращаетесь.os.system
вовсе не работать безsh
настоящего, ноsubprocess.call
работает.