'sudo' не работает после попытки изменить права доступа к папке с правами rootignign [duplicate]

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

sudo chmod 755 -R /

вместо

sudo chmod 755 -R ./

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

sudo: must be setuid root

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

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

14 ответов

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

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

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

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

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

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

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

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

42
ответ дан 18 July 2018 в 11:33

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

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

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

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

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

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

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

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

43
ответ дан 24 July 2018 в 19:49

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

3
ответ дан 18 July 2018 в 11:33

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

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

Вы можете попробовать восстановить разрешения с помощью 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
ответ дан 18 July 2018 в 11:33

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

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

12
ответ дан 18 July 2018 в 11:33

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

ответ 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
ответ дан 18 July 2018 в 11:33

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

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

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

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

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

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

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

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

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

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