Как установить разрешения / возврата по умолчанию? [dубликат]

Я случайно побежал

sudo chmod 755 -R /

вместо

sudo chmod 755 -R ./

Я остановил его через несколько секунд, но теперь есть некоторые проблемы, такие как

sudo: must be setuid root

Как вернуть права?

48
задан 29 July 2015 в 14:11

19 ответов

Короче: вы не можете, переустановите свою систему.

Я имею в виду, что разрешения Posix используются и сильно зависят от них; существует множество мест в файловой системе, где неправильные разрешения будут разбивать OS (флаги SUID) или, что еще хуже, сделать ее подверженной безопасности (/etc/ssh/ssh_host_rsa_key), пока она работает нормально.

Следовательно , такое восстановление трудно сделать должным образом. Пропустите одну вещь - и вы ее испортили. Вы уже испортили команду sudo chmod (если это ваш друг, а не вы, она может также изучить урок Linux) - и это очень простая команда. Надлежащее восстановление потребует большего количества команд и более бдительности. Даже если вы используете скрипт какого-то парня.

Так что поверьте мне, просто переустановите.

Наконец, некоторые советы, имеющие отношение к этому вопросу.

Во-первых: переустановки будут менее болезненными, если вы настройте свой /home на отдельный раздел в следующий раз.

Во-вторых: подумайте о том, чтобы сделать одну вещь в настроить ваш /home на отдельном разделе , как VirtualBox, и сделайте свои снимки.

В-третьих: chmod -R . работает. Нет необходимости добавлять эту косую черту. Вы могли бы избежать катастрофического риска пропустить точку в полном объеме; просто chmod: missing operand after ‘755’ VS разрушенная система.

42
ответ дан 17 July 2018 в 19:12

Короче: вы не можете, переустановите свою систему.

Я имею в виду, что разрешения Posix используются и сильно зависят от них; существует множество мест в файловой системе, где неправильные разрешения будут разбивать OS (флаги SUID) или, что еще хуже, сделать ее подверженной безопасности (/etc/ssh/ssh_host_rsa_key), пока она работает нормально.

Следовательно , такое восстановление трудно сделать должным образом. Пропустите одну вещь - и вы ее испортили. Вы уже испортили команду sudo chmod (если это ваш друг, а не вы, она может также изучить урок Linux) - и это очень простая команда. Надлежащее восстановление потребует большего количества команд и более бдительности. Даже если вы используете скрипт какого-то парня.

Так что поверьте мне, просто переустановите.

Наконец, некоторые советы, имеющие отношение к этому вопросу.

Во-первых: переустановки будут менее болезненными, если вы настройте свой /home на отдельный раздел в следующий раз.

Во-вторых: подумайте о том, чтобы сделать одну вещь в настроить ваш /home на отдельном разделе , как VirtualBox, и сделайте свои снимки.

В-третьих: chmod -R . работает. Нет необходимости добавлять эту косую черту. Вы могли бы избежать катастрофического риска пропустить точку в полном объеме; просто chmod: missing operand after ‘755’ VS разрушенная система.

43
ответ дан 23 July 2018 в 19:57

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

3
ответ дан 17 July 2018 в 19:12

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

Сначала, в неподвижной рабочей системе, я сделал следующее, чтобы получить все права доступа к файлам в списке, пропустив каталог /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
ответ дан 17 July 2018 в 19:12

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

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

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

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

Примечание: это было первоначально опубликовано на форумах 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
ответ дан 17 July 2018 в 19:12

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

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

12
ответ дан 17 July 2018 в 19:12

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

ответ 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
3
ответ дан 17 July 2018 в 19:12

Я написал и несколько лет использовал несколько рубиновых скриптов для 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

#!/usr/bin/ruby # This script will only work with .acl_ids # Restore from... FROM = ".acl" MKDIR = "/bin/mkdir" CHMOD = "/bin/chmod" CHOWN = "/bin/chown" known_content_missing = false 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 def human2chmod(mode) raise unless mode =~ /([r-][w-][xtsTS-])([r-][w-][xtsTS-])([r-][w-][xtsTS-])/ triple = [$1, $2, $3] u,g,o = triple.collect do |i| i.sub('s', 'sx').sub('t', 'tx').downcase.gsub('-', '') end return "u=#{u},g=#{g},o=#{o}" end File.open(FROM).each do |acl| raise unless acl =~ /\A(([^ ]*? )+)([^ ]+) ([^ ]+) ([^ ]+)\Z/ path, rules, owner_id, group_id = $1, $3, $4, $5 path = path.strip owner_id = owner_id.to_i group_id = group_id.to_i if !File.exists?(path) and !File.symlink?(path) if rules =~ /\Ad/ STDERR.puts "Restoring a missing directory: #{path}" STDERR.puts "Probably it was an empty directory. Git goes not track them." `#{MKDIR} -p '#{path}'` # Creating the any parents else known_content_missing = true STDERR.puts "ERROR: ACL is listed but the file is missing: #{path}" next end end s = File.lstat(path) t = s.ftype[0..0].sub('f', '-') # Single character for the file type # But a "-" istead of "f" # Actual, but not neccesarely Desired actual_rules = "#{t}#{numeric2human(s.mode)}" actual_owner_id = s.uid actual_group_id = s.gid unless [actual_rules, actual_owner_id, actual_group_id] == [rules, owner_id, group_id] chmod_argument = human2chmod(rules) # Debug #p chmod_argument #p s.mode ## Verbose puts path puts "Wrong: #{[actual_rules, actual_owner_id, actual_group_id].inspect}" puts "Fixed: #{[rules, owner_id, group_id].inspect}" `#{CHMOD} #{chmod_argument} '#{path}'` #puts end end if known_content_missing STDERR.puts "-" * 80 STDERR.puts "Some files that are listed in #{FROM.inspect} are missing in " + "the current directory." STDERR.puts STDERR.puts "Is #{FROM.inspect} outdated?" STDERR.puts "(Try retrograding the current directory to an earlier version)" STDERR.puts STDERR.puts "Or is the current directory incomplete?" STDERR.puts "(Try to recover the current directory)" STDERR.puts "-" * 80 end
24
ответ дан 17 July 2018 в 19:12

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

3
ответ дан 23 July 2018 в 19:57
  • 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
ответ дан 23 July 2018 в 19:57
  • 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

Примечание: это было первоначально опубликовано на форумах 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
ответ дан 23 July 2018 в 19:57

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

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

12
ответ дан 23 July 2018 в 19:57

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

ответ 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
3
ответ дан 23 July 2018 в 19:57
  • 1
    Если у вас есть резервная копия разрешений, почему бы просто не сделать полную резервную копию и не восстановить ее при необходимости? Это спасет вас в случае случайного запуска любой команды, а не только chmod. – Dmitry Grigoryev 28 June 2017 в 15:24

Я написал и несколько лет использовал несколько рубиновых скриптов для 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

#!/usr/bin/ruby # This script will only work with .acl_ids # Restore from... FROM = ".acl" MKDIR = "/bin/mkdir" CHMOD = "/bin/chmod" CHOWN = "/bin/chown" known_content_missing = false 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 def human2chmod(mode) raise unless mode =~ /([r-][w-][xtsTS-])([r-][w-][xtsTS-])([r-][w-][xtsTS-])/ triple = [$1, $2, $3] u,g,o = triple.collect do |i| i.sub('s', 'sx').sub('t', 'tx').downcase.gsub('-', '') end return "u=#{u},g=#{g},o=#{o}" end File.open(FROM).each do |acl| raise unless acl =~ /\A(([^ ]*? )+)([^ ]+) ([^ ]+) ([^ ]+)\Z/ path, rules, owner_id, group_id = $1, $3, $4, $5 path = path.strip owner_id = owner_id.to_i group_id = group_id.to_i if !File.exists?(path) and !File.symlink?(path) if rules =~ /\Ad/ STDERR.puts "Restoring a missing directory: #{path}" STDERR.puts "Probably it was an empty directory. Git goes not track them." `#{MKDIR} -p '#{path}'` # Creating the any parents else known_content_missing = true STDERR.puts "ERROR: ACL is listed but the file is missing: #{path}" next end end s = File.lstat(path) t = s.ftype[0..0].sub('f', '-') # Single character for the file type # But a "-" istead of "f" # Actual, but not neccesarely Desired actual_rules = "#{t}#{numeric2human(s.mode)}" actual_owner_id = s.uid actual_group_id = s.gid unless [actual_rules, actual_owner_id, actual_group_id] == [rules, owner_id, group_id] chmod_argument = human2chmod(rules) # Debug #p chmod_argument #p s.mode ## Verbose puts path puts "Wrong: #{[actual_rules, actual_owner_id, actual_group_id].inspect}" puts "Fixed: #{[rules, owner_id, group_id].inspect}" `#{CHMOD} #{chmod_argument} '#{path}'` #puts end end if known_content_missing STDERR.puts "-" * 80 STDERR.puts "Some files that are listed in #{FROM.inspect} are missing in " + "the current directory." STDERR.puts STDERR.puts "Is #{FROM.inspect} outdated?" STDERR.puts "(Try retrograding the current directory to an earlier version)" STDERR.puts STDERR.puts "Or is the current directory incomplete?" STDERR.puts "(Try to recover the current directory)" STDERR.puts "-" * 80 end
24
ответ дан 23 July 2018 в 19:57
  • 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

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

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

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

Из http://hyperlogos.org/page/Restoring-Permissions- Debian-System

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

Попробуйте, в порядке

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

соответствующий snip, 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)'`

И, наконец, если вы должны каким-то образом установить так много вещей, что приведенная выше команда не позволяет вам сказать, что ваш список аргументов слишком длинный, fix, который будет запускать apt-get еще много раз, чем вам может понравиться:

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
ответ дан 5 August 2018 в 01:52

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

Во-первых, в неподвижной рабочей системе я сделал следующее, чтобы получить все права доступа к файлу в списке, пропустив каталог /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


. Несколько замечаний:

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

Что бы я посоветовал, загрузите LiveCD с версией Linux на вашем диске, запустите команда, измените путь к месту, где установлен локальный диск, и запустите вторую команду!


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

3
ответ дан 5 August 2018 в 01:52

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

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

Вам понадобится root, чтобы исправить ваш 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

#!/usr/bin/ruby

# This script will only work with .acl_ids

# Restore from...
FROM  = ".acl"

MKDIR = "/bin/mkdir"
CHMOD = "/bin/chmod"
CHOWN = "/bin/chown"
known_content_missing = false


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

def human2chmod(mode)
  raise unless mode =~ /([r-][w-][xtsTS-])([r-][w-][xtsTS-])([r-][w-][xtsTS-])/
  triple = [$1, $2, $3]
  u,g,o = triple.collect do |i|
    i.sub('s', 'sx').sub('t', 'tx').downcase.gsub('-', '')
  end

  return "u=#{u},g=#{g},o=#{o}" 
end



File.open(FROM).each do |acl|
  raise unless acl =~ /\A(([^ ]*? )+)([^ ]+) ([^ ]+) ([^ ]+)\Z/
  path, rules, owner_id, group_id = $1, $3, $4, $5
  path = path.strip
  owner_id = owner_id.to_i
  group_id = group_id.to_i

  if !File.exists?(path) and !File.symlink?(path)
    if rules =~ /\Ad/
      STDERR.puts "Restoring a missing directory: #{path}"
      STDERR.puts "Probably it was an empty directory. Git goes not track them."
      `#{MKDIR} -p '#{path}'` # Creating the any parents
    else
      known_content_missing = true
      STDERR.puts "ERROR: ACL is listed but the file is missing: #{path}"
      next
    end
  end

  s = File.lstat(path)
  t = s.ftype[0..0].sub('f', '-') # Single character for the file type
                                  # But a "-" istead of "f"

  # Actual, but not neccesarely Desired 
  actual_rules    = "#{t}#{numeric2human(s.mode)}"
  actual_owner_id = s.uid 
  actual_group_id = s.gid 

  unless [actual_rules, actual_owner_id, actual_group_id] ==
    [rules, owner_id, group_id]

    chmod_argument = human2chmod(rules)

    # Debug
    #p chmod_argument
    #p s.mode

    ## Verbose
    puts path
    puts "Wrong: #{[actual_rules, actual_owner_id, actual_group_id].inspect}"
    puts "Fixed: #{[rules, owner_id, group_id].inspect}"
    `#{CHMOD} #{chmod_argument} '#{path}'`

    #puts
  end

end

if known_content_missing
  STDERR.puts "-" * 80 
  STDERR.puts "Some files that are listed in #{FROM.inspect} are missing in " +
              "the current directory."
  STDERR.puts
  STDERR.puts "Is #{FROM.inspect} outdated?"
  STDERR.puts "(Try retrograding the current directory to an earlier version)"
  STDERR.puts
  STDERR.puts "Or is the current directory incomplete?"
  STDERR.puts "(Try to recover the current directory)"
  STDERR.puts "-" * 80 
end
24
ответ дан 6 August 2018 в 18:29

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

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

Вам понадобится root, чтобы исправить ваш 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

#!/usr/bin/ruby

# This script will only work with .acl_ids

# Restore from...
FROM  = ".acl"

MKDIR = "/bin/mkdir"
CHMOD = "/bin/chmod"
CHOWN = "/bin/chown"
known_content_missing = false


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

def human2chmod(mode)
  raise unless mode =~ /([r-][w-][xtsTS-])([r-][w-][xtsTS-])([r-][w-][xtsTS-])/
  triple = [$1, $2, $3]
  u,g,o = triple.collect do |i|
    i.sub('s', 'sx').sub('t', 'tx').downcase.gsub('-', '')
  end

  return "u=#{u},g=#{g},o=#{o}" 
end



File.open(FROM).each do |acl|
  raise unless acl =~ /\A(([^ ]*? )+)([^ ]+) ([^ ]+) ([^ ]+)\Z/
  path, rules, owner_id, group_id = $1, $3, $4, $5
  path = path.strip
  owner_id = owner_id.to_i
  group_id = group_id.to_i

  if !File.exists?(path) and !File.symlink?(path)
    if rules =~ /\Ad/
      STDERR.puts "Restoring a missing directory: #{path}"
      STDERR.puts "Probably it was an empty directory. Git goes not track them."
      `#{MKDIR} -p '#{path}'` # Creating the any parents
    else
      known_content_missing = true
      STDERR.puts "ERROR: ACL is listed but the file is missing: #{path}"
      next
    end
  end

  s = File.lstat(path)
  t = s.ftype[0..0].sub('f', '-') # Single character for the file type
                                  # But a "-" istead of "f"

  # Actual, but not neccesarely Desired 
  actual_rules    = "#{t}#{numeric2human(s.mode)}"
  actual_owner_id = s.uid 
  actual_group_id = s.gid 

  unless [actual_rules, actual_owner_id, actual_group_id] ==
    [rules, owner_id, group_id]

    chmod_argument = human2chmod(rules)

    # Debug
    #p chmod_argument
    #p s.mode

    ## Verbose
    puts path
    puts "Wrong: #{[actual_rules, actual_owner_id, actual_group_id].inspect}"
    puts "Fixed: #{[rules, owner_id, group_id].inspect}"
    `#{CHMOD} #{chmod_argument} '#{path}'`

    #puts
  end

end

if known_content_missing
  STDERR.puts "-" * 80 
  STDERR.puts "Some files that are listed in #{FROM.inspect} are missing in " +
              "the current directory."
  STDERR.puts
  STDERR.puts "Is #{FROM.inspect} outdated?"
  STDERR.puts "(Try retrograding the current directory to an earlier version)"
  STDERR.puts
  STDERR.puts "Or is the current directory incomplete?"
  STDERR.puts "(Try to recover the current directory)"
  STDERR.puts "-" * 80 
end
24
ответ дан 8 August 2018 в 22:48

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

Во-первых, в неподвижной рабочей системе я сделал следующее, чтобы получить все права доступа к файлу в списке, пропустив каталог /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


. Несколько замечаний:

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

Что бы я посоветовал, загрузите LiveCD с версией Linux на вашем диске, запустите команда, измените путь к месту, где установлен локальный диск, и запустите вторую команду!


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

3
ответ дан 14 August 2018 в 12:46
  • 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
    – Videonauth 12 May 2016 в 06:59
  • 3
    – blade19899 12 May 2016 в 09:39
  • 4
    – blade19899 12 May 2016 в 11:50

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

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