/ bin / etc / lib64 / root / sbin удален или перемещен папкой mv / * / * во время su

11

ОС Centos 6.5 64-битная

Я скачал файл tar и хотел распаковать mvего.

Я untared, затем случайно (как root) запустил mv folder/* /*вместо mv folder/* .bash, сказал, что не может перезаписать некоторые файлы, затем спросил разрешение для других. Я ctrl-c'd вне.

Я оставил терминальную сессию открытой, но вышел su.

Теперь я потерял доступ к большинству shellкоманд, не могу lsкаталоги и не могу вернуться к ним su.

Веб-сервер и сервисы все еще работают. Я могу запустить очень мало команд, cdэто одна из них, и когда я пытаюсь сделать cdэто /etcили /binс ошибками no directory found.

EDIT Просто заметил , все папки , отсутствующие /( bin, etc, lib64, root, sbin) был перемещен в /varкаталог, я попробовал /var/bin/suи получить: -bash: /var/bin/su: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

webaholik
источник
1
Ты не можешь бежать /var/bin/suпрямо?
Darkhogg
Пожалуйста, не редактируйте вопрос с решениями. В сети обмена стеками вы скорее добавляете ответ, оставляете комментарий к существующему ответу, чтобы улучшить ответ.
Бернхард
@Darkhogg /var/bin/su: user root does not existЯ думаю, мы определили, что это невозможно, потому что / etc находится в / var / etc
webaholik
@Bernhard попытался исправить
webaholik

Ответы:

22

Если ваша система busyboxустановлена, вы можете использовать это, чтобы вернуть вещи обратно.

busyboxэто бинарный файл со множеством стандартных утилит, встроенных в него. Такие вещи , как mv, sh, lsи т.д.

Из вашего комментария к ответу Павла кажется, что все закончилось /var. Вы можете попробовать сделать /var/bin/busybox mv /var/{bin,etc,lib32,lib64,root,sbin,usr} /. Это должно снова привести в действие большую часть вашей системы. Есть несколько каталогов, /tmpкоторые также существуют /var/tmp, так что вы не можете просто переместить их. Надеюсь, это те, на кого mvжаловались, и они остались одни.

 

Получение корневой оболочки

Вы также упомянули, что потеряли корневую оболочку, и это suприводит к ld-linuxошибке библиотеки. Вы можете использовать следующее:

LD_LIBRARY_PATH=/var/lib64 /var/lib64/ld-linux-x86-64.so.2 /var/bin/su

Примечание: при попытке это не работает. Это происходит потому , что suтребует несколько файлов в /etc( passwd, pam.dи других). Если бы /etcвсе еще оставались нетронутыми, у этого был бы хороший шанс на успех.

 

Без занятых

Если у вас нет busybox, вы можете использовать тот же трюк ld-linux, что и для su:

LD_LIBRARY_PATH=/var/lib64 /var/lib64/ld-linux-x86-64.so.2 /var/bin/mv /var/{bin,etc,lib32,lib64,root,sbin,usr} /

 

С живого CD

Как обсуждалось в комментариях, если вы потеряли корневую оболочку, вы в значительной степени застряли. В основном, чтобы это исправить, вам нужны привилегии root. Единственный способ добиться этого - использовать такую ​​утилиту, как suили sudoповысить ваши разрешения (обе на данный момент не работают), или взломать другую программу, уже запущенную от имени пользователя root (в зависимости от того, что запущено, что вряд ли возможно).

Это оставляет единственную возможность быть живым CD. Загрузившись на live CD (или на live USB, или что-то еще), просто смонтируйте корневой том и переместите затронутые каталоги /varобратно в исходную папку /.


Сводка того, что случилось

folder/*расширился бы до чего-то такого как folder/fooи folder/bar.
/*расширился бы до чего-то вроде /bin /lib32 /lib64 /etc /home /root /var. Отметив, что /varэто последний пункт.
Поэтому, когда оболочка расширила все эти глобусы, она запустила бы что-то вроде этого:

mv folder/foo folder/bar /bin /lib32 /lib64 /etc /home /root /var

Как /varи последний элемент в списке, все было перенесено в него.


Почему /var/bin/suошибки с/lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

Почти все двоичные файлы в Linux динамически связаны с ld-linux. ld-linuxявляется библиотекой, ответственной за загрузку других библиотек, необходимых для двоичного файла В вашей системе это живет в /lib64/ld-linux-x86-64.so.2. Поскольку этот каталог был перемещен, любой динамически связанный исполняемый файл больше не будет работать.

Причиной работы busybox является то, что busybox статически связан. Это не использовать ld-linux.

Патрик
источник
Хорошая идея. В CentOS обычно установлен busybox из-за initramfs , поэтому он может хорошо работать.
Павел Шимерда
busyboxПохоже, идеальное решение, к сожалению, не установлено, будет после того, как это будет исправлено ... в то же время, есть ли в любом случае правильный путь для выполнения команд /var/lib64/ld-linux-x86-64.so.2вместо /lib64/ld-linux-x86-64.so.2? Кажется, это то, что убивает команды/var/bin
webaholik
@ Патрик: Не могли бы вы добавить информацию о том, что команда OP, предназначенная для использования, также неверна? Затем я мог бы удалить свой ответ, так как теперь он (почти) избыточен. Кстати, это правильный способ использовать обмен стека?
Павел Шимерда
1
Она ищет несколько вещей , в /etcкоторых не существует ( /etc/passwd, /etc/nsswitch, /etc/pam.d, и , возможно , больше). Для suработы /etcнеобходимо вернуться в исходное местоположение. Если у вас нет корневой оболочки, я думаю, вы застряли :-(
Патрик
2
@ user1296209 Как только вы запустите livecd, просто смонтируйте корневой том и переместите эти каталоги обратно. Это должно быть все, что вам нужно, чтобы снова бежать.
Патрик
10

mv folder/* ./*тоже неправильно Вы должны быть более осторожны с семантикой команд, которые вы запускаете. Команда mvс более чем двумя аргументами просто принимает все аргументы, кроме последнего, и перемещает пути, на которые они указывают, в каталог, указанный в последнем аргументе.

Чтобы переместить все каталоги (кроме скрытых) из папки в текущий каталог, вы должны использовать:

mv folder/* .

Вы сломали свою работающую систему. Ваша оболочка и встроенные команды продолжают работать. Вам нужно будет загрузить live CD и переместить каталоги обратно. Я не знаю встроенной функции bash для перемещения / переименования файлов, которая позволила бы вам исправить ситуацию без перезагрузки, подробности см. В ответе Патрика.

Павел Шимерда
источник
Я не осознавал этого: я могу перейти в / var / bin & / var / etc, похоже, что папки были перемещены в var, в любом случае я могу переместить их обратно? ... без livecd?
webaholik
Я попытался / var / bin / su & получить: -bash: / var / bin / su: /lib64/ld-linux-x86-64.so.2: плохой интерпретатор ELF: такого файла или каталога нет
webaholik
Ага ... Я исправлю ответ.
Павел Шимерда
Какой должна быть моя mvкоманда для перемещения всех файлов и папок из папки в текущую директорию?
webaholik
1
@ user1296209: Если вы загружаете живую систему, у вас наверняка есть root-доступ к вашей жизненной системе. Ваша настоящая система - это просто смонтированный раздел без особого значения для работающей системы. Единственная сложность заключается в том, что ваши каталоги /и /varкаталоги могут находиться в разных разделах, и в этом случае вам нужно смонтировать оба.
celtschk
2

Я случайно переместил / usr в / usr_old и все пошло к черту. К счастью, я остался в приглашении и смог выполнить следующую команду, чтобы восстановить папку usr:

LD_LIBRARY_PATH=/usr_old/lib64 /usr_old/lib64/ld-linux-x86-64.so.2 /usr_old/bin/mv /usr_old /usr
Mansehr
источник
Добро пожаловать в U & L, это была единственная команда, которую вы вводите? Пожалуйста, предоставьте более подробную процедуру. (специально для десятимесячного вопроса спешить не нужно)
Archemar
1
Да, после того, как я набрал эту команду, все восстановилось. Возможно я должен упомянуть, что я был root во всем этом.
Мансер,
1

ВАЖНО! Если вы здесь и работали mvнеправильно, не можете запускать shellкоманды и папки отсутствуют в корневом каталоге ( /), прежде всего, если у вас есть SU, НЕ завершайте работу, SUпока не исправите, потому что вы не получите его обратно. Если вы подключены удаленно, если вы отключаетесь, вы не сможете sshоставить сервер в покое, не работайте reboot- большинство работающих служб должны быть в порядке. Вы можете попробовать одно из многих решений, предложенных Патриком ... однако вам, вероятно, понадобится физический доступ, если вы облажались, как я.

Оказавшись перед машиной, я ее перезагрузил. Как и ожидалось, я получил панику ядра.

Я думал, что это будет довольно легко исправить, вставить livecd, войти в режим восстановления ДО ЭТОГО ТОЧКИ, ЭТО БЫЛО ЛЕГКО - тогда мне пришлось попытаться смонтировать мой корневой каталог. Однако мне нужно было больше, чем простая команда монтирования.

Это потому, что у меня, как и у многих людей, была файловая система lvm, и я впервые столкнулся с таким спасением. Мне пришлось искать в Интернете, чтобы увидеть, что мне нужно сделать. Я собрал эту информацию в этом посте. Здесь был мой процесс, чтобы исправить мою проблему.

1) Вставлено Centos_6.4_min кд

2) Интерфейс GUI спросил, что я хотел сделать, выбрал Rescue

3) Rescue попытался смонтировать текущую систему, но указал, что у меня нет разделов Linux

4) Выберите, чтобы ввести, shellкогда была предоставлена ​​опция

В этот момент я много чего пробовал, чтобы смонтировать систему, но не повезло, я почти уверен, что это все шаги, которые мне пришлось предпринять (из-за lvm):

5) Отсканировал мои тома,

lvmdiskscan

6) Запустил lvscan, показал все перечисленные как «неактивные»

lvscan

7) модуль загрузки устройства

modprobe dm-mod

8) изменить существующие тома на активные

vgchange -ay

9) lvscanСнова побежал , теперь все предметы перечислены как "активные"

10) Создана точка монтирования и смонтирован логический раздел

mkdir /mnt/root

mount /dev/VolGroup00/LogVol00 /mnt/root

11) Перемещенные папки назад (вам могут понадобиться другие):

mv /var/{bin,etc,lib64,mnt,root,sbin} /

12)reboot

13) УСПЕХ!

webaholik
источник