Я случайно побежал
sudo chmod 755 -R /
вместо
sudo chmod 755 -R ./
Я остановил его через несколько секунд, но теперь есть некоторые проблемы, такие как
sudo: must be setuid root
Как вернуть права?
Короче: вы не можете, переустановите свою систему.
Я имею в виду, что разрешения Posix используются и сильно зависят от них; существует множество мест в файловой системе, где неправильные разрешения будут разбивать OS (флаги SUID) или, что еще хуже, сделать ее подверженной безопасности (/etc/ssh/ssh_host_rsa_key), пока она работает нормально.
Следовательно , такое восстановление трудно сделать должным образом. Пропустите одну вещь - и вы ее испортили. Вы уже испортили команду sudo chmod (если это ваш друг, а не вы, она может также изучить урок Linux) - и это очень простая команда. Надлежащее восстановление потребует большего количества команд и более бдительности. Даже если вы используете скрипт какого-то парня.
Так что поверьте мне, просто переустановите.
Наконец, некоторые советы, имеющие отношение к этому вопросу.
Во-первых: переустановки будут менее болезненными, если вы настройте свой /home на отдельный раздел в следующий раз.
Во-вторых: подумайте о том, чтобы сделать одну вещь в настроить ваш /home на отдельном разделе , как VirtualBox, и сделайте свои снимки.
В-третьих: chmod -R . работает. Нет необходимости добавлять эту косую черту. Вы могли бы избежать катастрофического риска пропустить точку в полном объеме; просто chmod: missing operand after ‘755’ VS разрушенная система.
Короче: вы не можете, переустановите свою систему.
Я имею в виду, что разрешения Posix используются и сильно зависят от них; существует множество мест в файловой системе, где неправильные разрешения будут разбивать OS (флаги SUID) или, что еще хуже, сделать ее подверженной безопасности (/etc/ssh/ssh_host_rsa_key), пока она работает нормально.
Следовательно , такое восстановление трудно сделать должным образом. Пропустите одну вещь - и вы ее испортили. Вы уже испортили команду sudo chmod (если это ваш друг, а не вы, она может также изучить урок Linux) - и это очень простая команда. Надлежащее восстановление потребует большего количества команд и более бдительности. Даже если вы используете скрипт какого-то парня.
Так что поверьте мне, просто переустановите.
Наконец, некоторые советы, имеющие отношение к этому вопросу.
Во-первых: переустановки будут менее болезненными, если вы настройте свой /home на отдельный раздел в следующий раз.
Во-вторых: подумайте о том, чтобы сделать одну вещь в настроить ваш /home на отдельном разделе , как VirtualBox, и сделайте свои снимки.
В-третьих: chmod -R . работает. Нет необходимости добавлять эту косую черту. Вы могли бы избежать катастрофического риска пропустить точку в полном объеме; просто chmod: missing operand after ‘755’ VS разрушенная система.
Я бы попытался переустановить все пакеты с помощью apt-get install --reinstall, возможно, используя вывод dpkg --get-selections | grep install, чтобы получить список из них.
Хорошо, я не тестировал это (так используйте на свой страх и риск), но он все равно может работать. Я проведу это на виртуальной машине, когда у меня появится возможность:
Сначала, в неподвижной рабочей системе, я сделал следующее, чтобы получить все права доступа к файлам в списке, пропустив каталог /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 установлен правильный номер.
Вы можете попробовать восстановить разрешения с помощью 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 от повторного запроса вас снова. Это всегда забавные варианты, если вы уверены, что знаете, что делаете. В длинном: вы можете. Вам нужно будет подключить файловую систему с Live CD и начать отмену разрешений в соответствующих местах. Как минимум, чтобы получить sudo назад, вы захотите запустить sudo chmod u+s /usr/bin/sudo во время сеанса LiveCD, который исправит, должен быть установлен rootuid.
Однако, скорее всего, будет проще просто переустановить систему .
(Я знаю, что не должен комментировать ответ, но недостаточно репутации для комментариев.)
ответ 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
Я написал и несколько лет использовал несколько рубиновых скриптов для rsync прав и прав собственности. Скрипт get-filesystem-acl собирает всю информацию путем рекурсивного перемещения всех файлов и помещает все это в файл .acl. Скрипт .acl-restore прочитает .acl и применит все chown и chmod.
Вы можете запустить get-filesystem-acl на аналогичной установке Ubuntu, а затем скопировать на .acl в ваш поврежденный chmod ящик, поставьте .acl и .acl-restore в / и запустите .acl-restore.
Вам понадобится корень, чтобы исправить ваш sudo, как предположил Марко Цеппи.
Я могу сгенерировать и предоставить файл .acl для моего Ubuntu.
#!/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}`
#!/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
Я бы попытался переустановить все пакеты с помощью apt-get install --reinstall, возможно, используя вывод dpkg --get-selections | grep install, чтобы получить список из них.
Хорошо, я не тестировал это (так используйте на свой страх и риск), но он все равно может работать. Я проведу это на виртуальной машине, когда у меня появится возможность:
Сначала, в неподвижной рабочей системе, я сделал следующее, чтобы получить все права доступа к файлам в списке, пропустив каталог /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 установлен правильный номер.
Вы можете попробовать восстановить разрешения с помощью 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 от повторного запроса вас снова. Это всегда забавные варианты, если вы уверены, что знаете, что делаете. В длинном: вы можете. Вам нужно будет подключить файловую систему с Live CD и начать отмену разрешений в соответствующих местах. Как минимум, чтобы получить sudo назад, вы захотите запустить sudo chmod u+s /usr/bin/sudo во время сеанса LiveCD, который исправит, должен быть установлен rootuid.
Однако, скорее всего, будет проще просто переустановить систему .
(Я знаю, что не должен комментировать ответ, но недостаточно репутации для комментариев.)
ответ 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
Я написал и несколько лет использовал несколько рубиновых скриптов для rsync прав и прав собственности. Скрипт get-filesystem-acl собирает всю информацию путем рекурсивного перемещения всех файлов и помещает все это в файл .acl. Скрипт .acl-restore прочитает .acl и применит все chown и chmod.
Вы можете запустить get-filesystem-acl на аналогичной установке Ubuntu, а затем скопировать на .acl в ваш поврежденный chmod ящик, поставьте .acl и .acl-restore в / и запустите .acl-restore.
Вам понадобится корень, чтобы исправить ваш sudo, как предположил Марко Цеппи.
Я могу сгенерировать и предоставить файл .acl для моего Ubuntu.
#!/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}`
#!/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