2016-07-15 11 views
2

Auf meiner Shell habe ich eine Datei und ich ändere die Berechtigungen dieser Datei mit sudo chmod 4755 <file>. Beim Aufruf von lstat für diese Datei sehe ich korrekte Informationen über seine Berechtigungen, insbesondere, dass es 4755 als seinen Berechtigungsmodus hat.nicht alle Berechtigungsbits erhalten

Gibt es in meinem Golang-Programm einen Grund, warum ich nicht die richtigen Berechtigungsmodus-Bits bekomme? Könnte es sein, dass ich nur das Ergebnis von FileInfo() formatiere. Mode(). Perm() falsch? Könnte es sein, dass die oberen 3 Bits "speziell" sind?

Danke für die Hilfe!

Antwort

1

Kurze Antwort: Die drei oberen Bits sind speziell und müssen separat zugegriffen werden.

Lange Antwort: Die documentation erklärt, dass die 9 (von normalerweise 12) am wenigsten signifikanten Bits gelten die Standard-Unix-Berechtigungen.

Die Dokumentation definiert auch das Verhalten der Perm() Funktion, die Sie anrufen:

func (m FileMode) Perm() FileMode 

Perm returns the Unix permission bits in m. 

Das bedeutet, dass zul definiert ist keine der zusätzlichen Bits zurück, die Sie suchen.

Ferner zeigt die source code dass der Perm() Funktion den Wert von FileMode() mit 0777 zurückgegeben wird, Maskieren der ersten drei Bits verursacht nicht berücksichtigt werden.

Die ModeSetuid, ModeSetgid und ModeSticky Bits (4, 2 bzw. 1) müssen jeweils einzeln als Konstanten des FileMode Typ zugegriffen werden. Tun Sie dies, indem Sie Ihre eigenen Masken ausführen.

Um festzustellen, ob das Sticky-Bit gesetzt ist, z. B. (FileInfo().Mode() & ModeSticky) != 0. Gleiches gilt für ModeSetuid und ModSetgid.

+0

Sie sagen, dass diese Bits maskiert sind? Ich habe versucht, etwas wie (Perm() & ModeSticky) zu tun, aber ich glaube nicht, dass es der richtige Weg ist, darüber zu gehen ... – steve

+0

Ich aktualisierte meine Antwort mit spezifischeren Anweisungen. Maskieren 'Perm()' mit irgendetwas wird nicht helfen. Die Modus-Bits, nach denen Sie suchen, wurden bereits aus dem Wert "Perm()" zurückgelassen. Sie müssen auf die Variable weiter zurück zugreifen, bevor der Wert maskiert wird. – CorbinMc

+0

Vielen Dank! Ich musste nur meine Implementierung ein wenig optimieren. – steve

Verwandte Themen