Wenn ich eine Datei als nicht privilegierter Benutzer erstelle und den Berechtigungsmodus auf ändere 400
, wird sie von diesem Benutzer korrekt als schreibgeschützt angesehen:
$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro
Alles ist gut.
Aber dann kommt die Wurzel:
# [ -w somefile ] && echo rw || echo ro
rw
Was zum Teufel? Sicher, root kann in schreibgeschützte Dateien schreiben, aber es sollte nicht zur Gewohnheit werden: Best Practice würde tendenziell vorschreiben, dass ich in der Lage sein sollte, das Schreibberechtigungsbit zu testen, und wenn dies nicht der Fall ist, wurde es gesetzt auf diese Weise aus einem Grund.
Ich möchte wohl verstehen, warum dies geschieht und wie ich beim Testen einer Datei, für die das Schreibbit nicht gesetzt ist, einen falschen Rückkehrcode erhalten kann.
permissions
test
readonly
Reich
quelle
quelle
4.1.2(1)-release
) als auch RHEL7 (4.2.46(2)-release
)./etc/dhcp/dhcpd.conf
, die root gehört. Ich verwende den vom Hersteller geliefertendhcpd
. Totale Katastrophe, oder? Die Datei wird in RCS aktiviert ist, ich bin die Automatisierung Verwendungrcsdiff
,ci
undco
weil wir Betreiber , dass Notwendigkeit, ... arbeiten. Die Berechtigungsbitprüfung (-w
wie von detailliert beschriebentest(1)
) war eine erste Fehlerzeile, die auf der Grundlage arbeitete, dassci -u
eine Datei schreibgeschützt bleibt. Ich lasse das fallen und gehe direkt zurcsdiff -q
und überprüfe$?
. Undisastrousdhcpd
? Es würde im Besitz von seindhcpd
.bash
und veranlasstentest
mich zu glauben, dass das[ -w
ist , wofür ist.Antworten:
test -w
aka[ -w
überprüft den Dateimodus nicht. Es prüft, ob es beschreibbar ist. Für root ist es.Die Art und Weise, wie ich testen würde, wäre ein bitweiser Vergleich mit der Ausgabe von
stat(1)
("%a
Zugriffsrechte in Oktal").Beachten Sie, dass die Unterschale
$(...)
ein0
Präfix benötigt, damit die Ausgabe vonstat
als oktal von interpretiert wird(( ... ))
.quelle
(( ... & ... ))
. Ein Tippfehler korrigiert :-)if
erforderlich, Ausgabe von Oktalberechtigungen ist%a
nicht%d
und(( ... ))
benötigt ein Präfix0
, um die Ausgabe vonstat
als Oktal zu interpretieren .man stat
sagt "% d Gerätenummer in Dezimalzahl", aber was wir wollen, sind die "Zugriffsrechte", nein? Ihr Punkt über die Notwendigkeit des 0-Präfix ist gut gemacht, aber ich denke, wir müssen es nur dort ausweichen :).stat -c 0%a
...Ich denke, Sie haben falsch verstanden, was
-w
tut. Es wird nicht überprüft, ob die Datei über "Schreibberechtigungen" verfügt. Es wird überprüft, ob die Datei vom aufrufenden Benutzer beschreibbar ist.Genauer gesagt, es ruft
access(2)
oder ähnliches.Wenn z. B. ein Skript vorhanden ist , wird möglicherweise eine ähnliche Zeile angezeigt,
if [ -w /etc/shadow ]
wenn Siestrace
das Skript ausführenDa
root
kann in die Datei schreiben, gibt es 0 zurück.zB als normaler Benutzer:
Als Wurzel
Dies trotz der Tatsache, dass
/etc/shadow
die Erlaubnis000
auf meinem Computer hat.Was Sie jetzt tun möchten, wird interessant und ist nicht so einfach.
Wenn Sie die einfachen Berechtigungen überprüfen möchten, überprüfen Sie die
ls
Ausgabe oder rufen Siestat
oder ähnliches auf. Beachten Sie jedoch, dass ACLs diese Berechtigungen überschreiben können. Nur weil eine Datei die Berechtigung 400 hat, kann sie nicht mehr beschreibbar sein ...quelle
-w
:test(1)
ist explizit: "DATEI existiert und Schreibberechtigung wird erteilt", nicht " Datei kann vom aktuellen Benutzer geschrieben werden ". Nichts über das Überschreiben von Berechtigungen oder ACLs.bash(1)
is cagey: "True, wenn eine Datei vorhanden und beschreibbar ist ."ksh(1)
macht einen subtilen Hinweis auf Shenanigans: "-w Datei // True, wenn Datei existiert und durch den aktuellen Prozess beschreibbar ist ."zsh(1)
verschiebttest(1)
,zshmisc(1)
formuliert alsksh(1)
undzshexpn(1)
beschreibt einige interessante auf Berechtigungen basierende Globbing.csh(1)
ist unglaublich kurz: "Schreibzugriff".Der Root-Benutzer kann tun, was er möchte. "Normale" Dateiberechtigungen sind keine Einschränkung. Es wird keine einfache Datei ohne eXecute-Berechtigungen direkt ausgeführt, nur um ein wenig gegen die Praxis der Fußziele zu versichern.
quelle