it-swarm.com.de

Was ist, wenn ich versehentlich den Befehl "chmod -R" in Systemverzeichnissen (/, / etc, ...) ausführe?

Ich bin aus Versehen gerannt

Sudo chmod 755 -R /

anstatt von

Sudo chmod 755 -R ./

Ich habe es nach ein paar Sekunden gestoppt, aber jetzt gibt es einige Probleme wie

Sudo: must be setuid root

Wie kann ich Berechtigungen zurücksetzen?

56
fl00r

Kurz gesagt: Sie können Ihr System nicht neu installieren.

Ich meine, Posix-Berechtigungen werden in hohem Maße verwendet und genutzt. Es gibt eine Vielzahl von Stellen im Dateisystem, an denen falsche Berechtigungen das Betriebssystem beschädigen (SUID-Flags) oder, noch schlimmer, es in Bezug auf die Sicherheit offen legen (/etc/ssh/ssh_Host_rsa_key), während es anscheinend in Ordnung ist.

Daher ist eine solche Wiederherstellung nur schwer richtig durchzuführen. Fräulein eine Sache - und Sie vermasseln es. Sie haben Ihren Sudo chmod -Befehl bereits durcheinander gebracht (wenn dies Ihre Freundin ist, könnte sie auch einige davon lernen Linux-Lektion auch) - und das ist ein sehr einfacher Befehl. Eine ordnungsgemäße Wiederherstellung würde viel mehr Befehle und viel mehr Wachsamkeit erfordern. Auch wenn Sie jemandes Skript verwenden.

Also vertrau mir, einfach neu installieren. Es ist eine sichere Wette und garantiert, dass Sie keine Probleme haben.


Abschließend noch einige hier relevante Tipps.

Erstens: Neuinstallationen sind weniger schmerzhaft, wenn Sie das nächste Mal richten Sie Ihren /home auf einer separaten Partition ein . Eigentlich werden sie ein Kinderspiel sein.

Zweitens: Überlegen Sie, verrückte Linux-Wissenschaft in einer virtuellen Maschine wie der VirtualBox zu betreiben und machen Sie Ihre Schnappschüsse.

Drittens: chmod -R . funktioniert. Ein Punkt für sich . ist ein gültiger Verzeichnisname. Es besteht keine wirkliche Notwendigkeit, diesen Schrägstrich anzufügen. Sie hätten das katastrophale Risiko vermeiden können, den Punkt komplett zu überspringen.
nur chmod: missing operand after ‘755’ VS ein ruiniertes System.

56
ulidtko

Ich schrieb und benutze seit einigen Jahren ein paar Ruby Skripte, um rsync Berechtigungen und Eigentumsrechte zu erhalten. Skript get-filesystem-acl sammelt alle Informationen, indem es alle Dateien rekursiv durchläuft und alles in die Datei .acl schreibt. Skript .acl-restore liest .acl und wendet alle chown und chmod an.

Sie können get-filesystem-acl auf einer ähnlichen Ubuntu-Installation ausführen und dann die .acl -Datei in Ihre mit chmod beschädigte Box kopieren, .acl und .acl-restore in/einfügen und .acl-restore.

Du musst root haben, also repariere dein Sudo wie von Marco Ceppi vorgeschlagen.

Ich kann die .acl -Datei für mein Ubuntu generieren und dir geben.

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
26

Auf lange Sicht: Sie können. Sie müssen das Dateisystem von einer Live-CD mounten und die Berechtigungen an den entsprechenden Stellen zurücksetzen. Um Sudo zurückzubekommen, müssen Sie mindestens Sudo chmod u+s /usr/bin/Sudo ausführen, während Sie sich in der LiveCD-Sitzung befinden. Dies behebt das Problem, dass das Root-Verzeichnis gesetzt werden muss.

Es wäre jedoch wahrscheinlich einfacher, das System einfach neu zu installieren.

12
Marco Ceppi

Ich würde versuchen, alle Pakete mit apt-get install --reinstall neu zu installieren, möglicherweise mithilfe der Ausgabe von dpkg --get-selections | grep install, um eine Liste von ihnen zu erhalten.

4
Adam Byrtek

Okay, ich habe das nicht getestet (also benutze es auf dein eigenes Risiko), aber es könnte trotzdem funktionieren. Ich werde dies in einer virtuellen Maschine testen, wenn ich die Möglichkeit habe:

Zuerst habe ich in einem noch funktionierenden System Folgendes getan, um alle Dateiberechtigungen in einer Liste abzurufen, wobei das Verzeichnis /home/ übersprungen wurde:

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

Dadurch werden die Berechtigungen und der Dateiname für jede Datei oder jedes Verzeichnis auf dem System gedruckt, gefolgt von einem \0 -Zeichen (dies wird später benötigt, um seltsame Dateinamen wie die mit Zeilenumbrüchen zu behandeln).

Dann auf einem System, auf dem die Dateiberechtigungen gefährdet wurden:

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

Dadurch wird jede Zeile von fileper.log gelesen, wobei die Berechtigungen als $perm und der Dateiname als $file gespeichert werden. Anschließend werden die Berechtigungen der Datei (oder des Verzeichnisses) auf die im fileper.log aufgelisteten Werte festgelegt.


Ein paar Dinge, die Sie hier beachten sollten:

  • Während der Ausgabe in die Datei: /tmp/fileper.log werden möglicherweise benutzerdefinierte Einstellungen und proc usw. aufgelistet.
  • sie sind möglicherweise nicht in der Lage, Befehle zu starten oder auszuführen.

Ich würde vorschlagen, eine LiveCD mit der Linux-Version zu starten, die Sie auf Ihrer Festplatte haben, den Befehl auszuführen, den Pfad dahin zu ändern, wo Sie die lokale Festplatte gemountet haben, und den zweiten Befehl auszuführen!


Ich habe getestet, dass ich beim Booten von einer Ubuntu-CD/USB festlegen kann, dass die Festplatte nicht formatiert werden soll. Dies bedeutet, dass alles im Verzeichnis / ersetzt wird. BUT überspringe das Verzeichnis /home/. Das heißt, Ihre Benutzer haben die Konfiguration von Apps/DATA (Musik, Video, Dokumente) noch intakt. Durch Ersetzen der Systemdateien wird chmod auf die richtige Nummer gesetzt.

3
blade19899

(Ich weiß, ich sollte in einer Antwort keinen Kommentar abgeben, aber nicht genug Ruf, um einen Kommentar abzugeben.)

die Antwort von blade19899 funktionierte für mich mit Ausnahme von Symlinks. Z.B. es wendete 755 auf/bin/bash an, wendete dann aber 777 auf symlink/bin/rbash an, effektiv 777-ing/bin/bash.

Da ich bereits die Datei fileper.log hatte, habe ich den Befehl destination-end geändert:

while IFS=: read -r -d '' perm file; do  
    if [[ ! -L "$file" ]]; then    
        chmod "$perm" "$file"
    fi
done < /tmp/fileper.log 
3
Marjan

Sie können versuchen, Berechtigungen mit apt-get wiederherzustellen.

Wenn Sie diese Befehle nicht mit Sudo ausführen können, müssen Sie möglicherweise in den Wiederherstellungsmodus booten und sie als root ausführen.

Informationen zum Booten in den Wiederherstellungsmodus finden Sie unter https://wiki.ubuntu.com/RecoveryMode .

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

Hinweis: Dies wurde ursprünglich in den Ubuntu-Foren gepostet, aber ich kann den ursprünglichen Beitrag nicht finden.

Versuchen Sie, in der Reihenfolge,

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

Wenn das fehlschlägt:

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

Und schließlich als letztes Mittel,

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

Mit apt-get

Hier ist der relevante Ausschnitt, BEARBEITET FÜR RICHTIGKEIT und neu formatiert:

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

Angenommen, Sie erhalten Nachrichten zu einigen Paketen, die nicht erneut installiert werden können, und der Befehl schlägt fehl. Hier ist eine Möglichkeit, das Problem durch Überspringen der betreffenden Pakete zu beheben:

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

Und schließlich, wenn Sie irgendwie so viele Dinge installiert haben sollten, dass der obige Befehl nicht sagt, dass Ihre Argumentliste zu lang ist, ist hier der Fix, der apt-get viel öfter ausführt, als Sie vielleicht möchten:

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

Beachten Sie die Optionen -y und --force-yes, die verhindern, dass apt-get Sie immer wieder dazu auffordert. Dies sind immer lustige Optionen, wenn Sie sicher sind, dass Sie wissen, was Sie tun.

2
Panther

Viele der Antworten sind problematisch, weil sie Sudo erfordern, Sudo jedoch nicht funktioniert. Sie können Sudo nicht verwenden, um Sudo zu reparieren. Andere Antworten erfordern einen Neustart des Computers mit einer Live-CD oder im Wiederherstellungsmodus, was unpraktisch ist.

Eine andere Option ist Verwenden Sie pkexec, um zu einer Shell mit Root-Berechtigungen zu gelangen.

  1. Führen Sie pkexec bash in einem Terminal aus, um eine Shell mit Root-Berechtigungen abzurufen.

  2. Setze das setuid-Bit:

    chmod u+s /usr/bin/Sudo
    
  3. Sudo sollte jetzt für weitere Reparaturen verfügbar sein, die möglicherweise erforderlich sind.

0
xiota