Berechtigungen bleiben 2700 nach "chmod 0700"

7

Beispiel:

# show starting permissions
% stat -c '%04a' ~/testdir
0700

# change permissions to 2700
% chmod 2700 ~/testdir

# check
% stat -c '%04a' ~/testdir
2700

# so far so good...

# now, change permissions back to 0700
% chmod 0700 ~/testdir

# check
% stat -c '%04a' ~/testdir
2700

# huh???

# try a different tack
% chmod g-w ~/testdir
% stat -c '%04a' ~/testdir
0700

Fehler oder Funktion?

Warum chmod 0700 ~/testdirnicht die Berechtigungen ändern von 2700zu 0700?

Ich habe das gleiche Verhalten in mehreren verschiedenen Dateisystemen beobachtet. In der letzten ist beispielsweise die relevante mountAusgabezeile

/dev/sda5 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

Auch FWIW

% stat -c '%04a' ~/
0755
kjo
quelle
Sehen Sie Nachrichten, denen die Berechtigung verweigert wurde? Dies ist das normale Verhalten in Situationen, in denen möglicherweise Selinux ausgeführt wird.
Raman Sailopal
@ RamanSailopal: Was ich in der Frage zeige, ist eine wörtliche Ausgabe. (IOW: überhaupt keine Fehlermeldungen.)
kjo

Antworten:

20

Angenommen, Sie verwenden GNU chmod, ist dies in der Manpage dokumentiert :

chmod behält die Set-User-ID- und Set-Group-ID-Bits eines Verzeichnisses bei, sofern Sie nicht ausdrücklich etwas anderes angeben. Sie können die Bits mit symbolischen Modi wie u+sund setzen oder löschen g-s, und Sie können die Bits mit einem numerischen Modus setzen (aber nicht löschen).

Dies ist in POSIX zulässig :

Für jedes in der Oktalzahl gesetzte Bit ist das entsprechende Dateiberechtigungsbit in der folgenden Tabelle zu setzen; Alle anderen Dateiberechtigungsbits werden gelöscht. Für reguläre Dateien müssen für jedes Bit, das in der Oktalzahl gesetzt ist, die der eingestellten Benutzer-ID bei der Ausführung oder der eingestellten Gruppen-ID bei der Ausführung entspricht, die in der folgenden Tabelle angegebenen Bits gesetzt werden. Wenn diese Bits nicht in der Oktalzahl gesetzt sind, werden sie gelöscht. Für andere Dateitypen ist implementierungsdefiniert, ob Anforderungen zum Setzen oder Löschen der Bits "Benutzer-ID bei Ausführung festlegen" oder "Gruppen-ID bei Ausführung festlegen" berücksichtigt werden.

Die Gründe für das Verhalten in GNU chmodsind in den Versionshinweisen für coreutils6.0 angegeben :

chmod, installUnd mkdirjetzt ein Verzeichnis der Set-User-ID und set-group-ID - Bits erhalten , wenn Sie ausdrücklich etwas anderes verlangen. ZB chmod 755 DIRund behalten Sie chmod u=rwx,go=rx DIRjetzt die DIRBits set-user-ID und set-group-ID bei, anstatt sie zu löschen, und ähnlich für mkdir -m 755 DIRund mkdir -m u=rwx,go=rx DIR. Um die Bits zu löschen, erwähnen Sie sie explizit in einem symbolischen Modus, z mkdir -m u=rwx,go=rx,-s DIR. Um sie einzustellen, erwähnen Sie sie explizit entweder in einem symbolischen oder einem numerischen Modus, z mkdir -m 2755 DIR. mkdir -m u=rwx,go=rx,g+s DIR. Diese Änderung dient der Vereinfachung auf Systemen, auf denen diese Bits von den Eltern erben. Leider sind andere Betriebssysteme hier nicht konsistent, und tragbare Skripte können nicht davon ausgehen, dass die Bits gesetzt, gelöscht oder beibehalten werden, selbst wenn die Bits explizit erwähnt werden. Beispielsweise behält OpenBSD 3.9 mkdir -m 777 Ddas DSetgid-Bit bei, chmod 777 Dlöscht es jedoch. Im Gegensatz dazu , Solaris 10 mkdir -m 777 D, mkdir -m g-s Dund chmod 0777 Dalle erhalten D‚s setgid bit, und Sie müssen etwas verwenden , wie chmod g-s Des zu deaktivieren.

In # 8391 gibt es mehr zu diesem Thema , einschließlich der weiteren Begründung, dass die führende 0 mehrdeutig ist (dies könnte für den Benutzer entweder gelöschte Bits oder einen Oktalwert anzeigen). Das coreutilsHandbuch enthält außerdem einen eigenen Abschnitt, Verzeichnisse sowie die Bits Set-User-ID und Set-Group-ID . Dies zeigt, dass es GNU-Erweiterungen gibt, mit denen die fraglichen Bits gelöscht werden können:

chmod =700 ~/testdir
chmod 00700 ~/testdir

beide löschen die Bits (sind aber nicht portierbar).

Stephen Kitt
quelle
Vielen Dank! Leider lässt die Dokumentation das Verhalten nicht weniger launisch aussehen ... Würden Sie zufällig wissen, warum GNU chmoddiese spezielle Richtlinie hat? IOW, gibt es eine Rechtfertigung dafür, die über "POSIX verbietet es nicht" hinausgeht? Bietet es einen Nutzen?
kjo
1
Ich habe die Gründe aufgespürt, siehe mein Update.
Stephen Kitt
Ich bin damit einverstanden, dass dies verdammt launisch ist und ich habe sehr viel Lust, dieses Verhalten auszumerzen.
Joshua
1
Heh. Als jemand, der häufig setuid / setgid-Verzeichnisse in Situationen verwendet, in denen das unbeabsichtigte Entfernen unglücklich wäre (würde verhindern, dass Dienste auf Datenverzeichnisse zugreifen können, auf die sie Lesezugriff benötigen und die über Gruppenbesitz gewährt werden), freue ich mich darüber. J. Zufällige Benutzer haben wahrscheinlich Skripte und Gewohnheiten, die sich auf "755" oder "550" oder was auch immer beziehen, und erkennen nicht, dass sie setuid / setgid beibehalten müssen, wenn sie in Verzeichnissen herumspielen, auf die andere Konten über Gruppen zugreifen sollen Berechtigungen.
Charles Duffy
0

Versuche dies:

chmod 000700 ~ / testdir

Technik. Profi
quelle
-2

Startberechtigungen anzeigen

% stat -c '% 04a' ~ / testdir 0700

==> OK!

Ändern Sie die Berechtigungen in 2700

% chmod 2700 ~ / testdir

==> Beachten Sie, dass Sie die Gruppen-ID einstellen !!!

prüfen

% stat -c '% 04a' ~ / testdir 2700

==> OK!

So weit, ist es gut...

Ändern Sie jetzt die Berechtigungen wieder auf 0700

% chmod 0700 ~ / testdir

==> Bitte beachten Sie erneut, dass Sie das Löschen mit Flaggenbeschränkung oder Sticky (nicht Gruppen-ID) entfernen.

prüfen

% stat -c '% 04a' ~ / testdir 2700

huh ???

versuchen Sie es mit einem anderen Ansatz

% chmod gw ~ / testdir% stat -c '% 04a' ~ / testdir 0700

================================================== ========= Als letztes können Sie diesen Befehl verwenden, um Erfolg zu haben:

chmod 000700 ~/testdir
Technik. Profi
quelle
1
Ich denke nicht, dass ein fünfminütiges Video hier notwendig oder angemessen ist
Darren H
Entschuldigung, das ist nicht meine Absicht. Diese fünf Minuten werden durch mein Kinderproblem verursacht. Ich werde es später beheben.
Tech. Pro