Что делать, если я случайно запускаю команду & ldquo; chmod -R & rdquo; в системных каталогах (/, / etc, & hellip;)

Возможно, проблема не касалась разделов RAID на устройствах, а не устройства. Используя:

mdadm --examine /dev/sdb
mdadm --examine /dev/sdb1

, вы можете проверить, какой суперблок вам нужен для вашего рейда.

Затем вам нужно выбрать фактический блок, например :

mdadm --assemble /dev/md0 /dev/sdb2 /dev/sdc2
1
задан 29 July 2015 в 14:11

6 ответов

Я написал и несколько лет использовал несколько рубиновых скриптов для rsync прав и прав собственности. Скрипт get-filesystem-acl собирает всю информацию путем рекурсивного перемещения всех файлов и помещает все это в файл .acl. Скрипт .acl-restore прочитает .acl и применит все chown и chmod.

Вы можете запустить get-filesystem-acl на аналогичной установке Ubuntu, а затем скопировать на .acl в ваш поврежденный chmod ящик, поставьте .acl и .acl-restore в / и запустите .acl-restore.

Вам понадобится корень, чтобы исправить ваш sudo, как предположил Марко Цеппи.

Я могу сгенерировать и предоставить файл .acl для моего Ubuntu.

get-filesystem-acl

#!/usr/bin/ruby

RM   = "/bin/rm"
SORT = "/usr/bin/sort"
TMP  = "/tmp/get_acl_#{Time.now.to_i}_#{rand * 899 + 100}"

require 'find'

IGNORE = [".git"]

def numeric2human(m)
  return sprintf("%c%c%c%c%c%c%c%c%c",
            (m & 0400 == 0 ? ?- : ?r),
            (m & 0200 == 0 ? ?- : ?w),
            (m & 0100 == 0 ? (m & 04000 == 0 ? ?- : ?S) :
                             (m & 04000 == 0 ? ?x : ?s)),
            (m & 0040 == 0 ? ?- : ?r),
            (m & 0020 == 0 ? ?- : ?w),
            (m & 0010 == 0 ? (m & 02000 == 0 ? ?- : ?S) :
                             (m & 02000 == 0 ? ?x : ?s)),
            (m & 0004 == 0 ? ?- : ?r),
            (m & 0002 == 0 ? ?- : ?w),
            (m & 0001 == 0 ? (m & 01000 == 0 ? ?- : ?T) :
                             (m & 01000 == 0 ? ?x : ?t)))
end


File.open(TMP, "w") do |acl_file|

  # TODO: Instead of the current dir, find the .git dir, which could be
  #       the same or outside of the current dir
  Find.find(".") do |path|

    next if IGNORE.collect {|ig| !!(path[2..-1] =~ /\A#{ig}/)}.include? true
    next if File.symlink?(path)

    stat = File.lstat(path)
    group_id = stat.gid
    rules    = "#{type}#{numeric2human(stat.mode)}" 

    acl_file.puts "#{path} #{rules} #{owner_id} #{group_id}"
  end
end

`#{SORT} #{TMP} > .acl`
`#{RM}   #{TMP}`

.acl-restore

[ f2]
24
ответ дан 29 May 2018 в 09:00
  • 1
    Ubuntu 11.04. Но я уже переустановил его. Благодаря! – fl00r 18 May 2011 в 19:17
  • 2
    ваш скрипт терпит неудачу, поскольку owner_id не определено – Eliran Malka 30 March 2014 в 03:53
  • 3
    kinda overkill ... find делает это довольно красиво: find SOME_DIR -depth -printf 'chmod %m %p\n' > saved_permission – reflog 16 July 2015 в 10:17

В длинном: вы можете. Вам нужно будет подключить файловую систему с Live CD и начать отмену разрешений в соответствующих местах. Как минимум, чтобы получить sudo назад, вы захотите запустить sudo chmod u+s /usr/bin/sudo во время сеанса LiveCD, который исправит, должен быть установлен rootuid.

Однако, скорее всего, будет проще просто переустановить систему .

12
ответ дан 29 May 2018 в 09:00

(Я знаю, что не должен комментировать ответ, но недостаточно репутации для комментариев.)

ответ blade19899 работал для меня, за исключением символических ссылок. Например. он применил 755 к / bin / bash, но затем применил 777 к symlink / bin / rbash, эффективно 777-ing /bin/bash.

Поскольку у меня уже был файл fileper.log, я только что изменил команда конечного конца:

while IFS=: read -r -d '' perm file; do  
    if [[ ! -L "$file" ]]; then    
        chmod "$perm" "$file"
    fi
done < /tmp/fileper.log 
4
ответ дан 29 May 2018 в 09:00
  • 1
    Если у вас есть резервная копия разрешений, почему бы просто не сделать полную резервную копию и не восстановить ее при необходимости? Это спасет вас в случае случайного запуска любой команды, а не только chmod. – Dmitry Grigoryev 28 June 2017 в 15:24

Я бы попытался переустановить все пакеты с помощью apt-get install --reinstall, возможно, используя вывод dpkg --get-selections | grep install, чтобы получить список из них.

3
ответ дан 29 May 2018 в 09:00
  • 1
    Это неплохая идея, но вам нужно будет исключить все, что будет автоматически установлено, или вы навсегда закончите с этими пакетами (даже если вы удалите зависимые пакеты) ... Но тогда они не будут переустановлены. Крепкий орешек. Возможно сначала получить список автоматических пакетов, а затем переустановить каждый пакет , затем перечислить список авто, повторно маркировать их как авто. – Oli♦ 18 May 2011 в 19:43
  • 2
    @Oli - не будет (некоторые из), которые будут решены при запуске sudo apt-get autoremove? – Wilf 22 February 2014 в 21:21
  • 3
    @Wilf No - autoremove удаляет только те пакеты, которые вы не установили вручную. – Dmitry Grigoryev 28 June 2017 в 15:17

Хорошо, я не тестировал это (так используйте на свой страх и риск), но он все равно может работать. Я проведу это на виртуальной машине, когда у меня появится возможность:

Сначала, в неподвижной рабочей системе, я сделал следующее, чтобы получить все права доступа к файлам в списке, пропустив каталог /home/:

sudo find / -not -path /home -printf "%m:%p\0" > /tmp/fileper.log

Это будет печатать разрешения и имя файла для каждого файла или каталога в системе, за которым следует символ \0 (это необходимо позже, чтобы иметь дело с такими странными именами файлов, как те, которые содержат newlines).

Затем в системе, где права доступа к файлу были скомпрометированы:

while IFS=: read -r -d '' perm file; do  
    chmod "$perm" "$file"
done < /tmp/fileper.log 

Это будет читать каждую строку fileper.log, сохраняя разрешения как $perm и имя файла как $file, а затем установит права на файл (или каталог) на все, что было указано в fileper.log

. Несколько замечаний: [ ! d6] При выводе в файл: /tmp/fileper.log вы можете указать пользовательские настройки, proc и т. д., возможно, вы не сможете загрузить или запустить команды,

Что бы я хотел Предлагаем загрузить LiveCD с версией Linux на вашем диске, запустите команду, mo (d11)

Я тестировал, что при загрузке с компакт-диска или USB-устройства Ubuntu я могу выбрать не для того, чтобы установить, где установлен локальный диск, и запустить вторую команду!

формат, что означает, что он заменит все в каталоге /, но пропустите каталог /home/. Это означает, что ваши пользователи будут иметь конфигурацию приложений / DATA (музыка, видео, документы), которые все еще не повреждены. И, заменив системные файлы, в chmod установлен правильный номер.

3
ответ дан 29 May 2018 в 09:00
  • 1
    Почему chmod $(echo $LINE) вместо просто chmod $LINE? Кроме того, вы можете использовать только find без stat: find … -printf "%#m %p\n". Еще лучше, вы можете создать всю команду: find … -printf "chmod %#m %p\n", а затем выполнить файл как скрипт. – muru 12 May 2016 в 00:03
  • 2
    Линия поиска не работает так, как она есть, она должна быть michael@NEXUS-TWO:~$ sudo find / -name '*' -exec stat -c "%a %n" {} \; >> /tmp/fileper.log, но затем она пробегает /proc и некоторые другие места, которые вы, возможно, не захотите в своем списке. – Videonauth 12 May 2016 в 06:59
  • 3
    @muru написал это посреди ночи. Будет редактировать код ... – blade19899 12 May 2016 в 09:39
  • 4
    Не в состоянии проверить, будет полагаться на ввод пользователя – blade19899 12 May 2016 в 11:50

Вы можете попробовать восстановить разрешения с помощью apt-get.

Если вы не можете запускать эти команды с помощью sudo, вам может потребоваться загрузить в режим восстановления и запустить их как root.

Для загрузки в режим восстановления см. Https://wiki.ubuntu.com/RecoveryMode.

Из https://wiki.ubuntu.com/RecoveryMode

[d6 ] Примечание: это было первоначально опубликовано на форумах Ubuntu, но я не могу найти исходный пост.

Попробуйте, [, d7]

sudo apt-get --reinstall install `dpkg --get-selections | grep install | grep -v deinstall | cut -f1`

Если это не удается:

sudo apt-get --reinstall install `dpkg --get-selections | grep install | grep -v deinstall | cut -f1 | egrep -v '(package1|package2)'`

И, наконец, в качестве последнего средства

sudo dpkg --get-selections | grep install | grep -v deinstall | cut -f1 | xargs apt-get --reinstall -y --force-yes install

Использование apt-get

Вот соответствующий снип, EDITED FOR CORRECTNESS и переформатированный:

sudo apt-get --reinstall install `dpkg --get-selections | grep install | grep -v deinstall | cut -f1`
Допустим, вы получаете сообщения о некоторых пакетах, которые нельзя переустановить, и команда не работает. Вот один из способов исправить это, пропустив указанные пакеты:
sudo apt-get --reinstall install `dpkg --get-selections | grep install | grep -v deinstall | cut -f1 | egrep -v '(package1|package2)'`
И, наконец, если вы должны каким-то образом установить так много вещей, что приведенная выше команда перестает говорить, что ваш список аргументов слишком длинный, вот исправление, которое будет запускать apt- получите гораздо больше времени, чем вам может понравиться:
sudo dpkg --get-selections | grep install | grep -v deinstall | cut -f1 | xargs apt-get --reinstall -y --force-yes install
Обратите внимание на опции -y и --force-yes, которые остановят apt-get от повторного запроса вас снова. Это всегда забавные варианты, если вы уверены, что знаете, что делаете.
2
ответ дан 29 May 2018 в 09:00

Другие вопросы по тегам:

Похожие вопросы: