[gelöst] sed schreibt in eine schreibgeschützte Datei

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
incident
Beiträge: 63
Registriert: 13.11.2021 14:54:52

[gelöst] sed schreibt in eine schreibgeschützte Datei

Beitrag von incident » 04.09.2022 19:28:48

Hallo Community,

ich habe gerade beim Scripting etwas seltsames entdeckt und kann mir das nicht erklären (auch eine Web-Suche brachte kein Ergebnis)...

In einem Script lasse ich sed einen Parameter einer Option in einer KonfigDatei ändern.
Diese Zeile sieht in der KonfigDatei so aus:

Code: Alles auswählen

ETH0_CUR_KNOWN_LAN_IPv4="192.168.1.222"
Jetzt hat diese Datei folgende Rechte:

Code: Alles auswählen

-r--r--r--  1 user_a user_a 1.5K Sep  4 19:00 test.conf
Die Betreffende Zeile im Script sieht original so aus:

Code: Alles auswählen

RESULT=$(sed -i "s|^$OPTION=.*$|$OPTION=\"$NEWVALUE\"|" "$CONF_FILE")
Soweit, so gut...

Wenn ich nun aber dieses Script als 'user_a' (= gewöhnlicher User) jedoch laufen lasse, wird der Inhalt der KonfigDatei - trotz dass keine Schreibrechte bestehen - nach Scriptvorgaben abgeaendert (also inhaltlich wie von mir gewuenscht, durch das Script).

Wenn ich jetzt jedoch die 'sed'-Zeile auskommentiere und anstatt dieser folgende Zeile einfüge:

Code: Alles auswählen

echo "???????????????????????????????" >> $CONF_FILE
...dann das Script wieder als 'user_a' laufen lasse, dann wird die KonfigDatei - eben wegen fehlender Schreibrechte - nicht angetastet. Bleibt also inhaltlich unverändert.
Das verwirrt ziemlich...

Das Script fordert natürlich nirgends root-Rechte, sudo, etc. und es besteht auch kein Eintrag in der 'sudoers', der für dieses Verhalten verantwortlich wäre/sein könnte.
In der 'sudoers' ist ein Eintrag in der Form: user_a ALL=(ALL:ALL) ALL

Kann mir das bitte jemand erklären, bzw. ist das bei jemandem reproduzierbar?
Danke im Voraus.

PS: Bei mir läuft ein aktuelles "Debian 10"-System.
Zuletzt geändert von incident am 05.09.2022 11:34:32, insgesamt 3-mal geändert.

DeletedUserReAsG

Re: sed schreibt in eine schreibgeschützte Datei

Beitrag von DeletedUserReAsG » 04.09.2022 19:40:26

Der User kann die Berechtigungen ihm gehörender Dateien übergehen. Das ist normal, und du kannst es leicht mit etwa Debianvim nachvollziehen: eine Datei mit 444 öffnen, was reinschreiben und speichern – mit :w gibt es einen Fehler, mit :w! funktioniert es.

Sorgen würde ich mir machen, wenn ein User so die Datei eines anderen Nutzers ändern könnte. Wenn du möchtest, dass die Datei auch vom Besitzer nicht geändert werden kann, könntest du das immutable-Flag setzen.

OT:
incident hat geschrieben: ↑ zum Beitrag ↑
04.09.2022 19:28:48
PS: Bei mir läuft ein aktuelles "Debian 10"-System.
Debian 10 ist nicht aktuell.

incident
Beiträge: 63
Registriert: 13.11.2021 14:54:52

Re: sed schreibt in eine schreibgeschützte Datei

Beitrag von incident » 04.09.2022 19:45:54

niemand hat geschrieben: ↑ zum Beitrag ↑
04.09.2022 19:40:26
Der User kann die Berechtigungen ihm gehörender Dateien übergehen. Das ist normal, und du kannst es leicht mit etwa Debianvim nachvollziehen: eine Datei mit 444 öffnen, was reinschreiben und speichern – mit :w gibt es einen Fehler, mit :w! funktioniert es.
Krass. Das wusste ich nicht - bzw. wusste, dass root das kann, aber nicht, dass ein gewöhnlicher User das bei seinen Dateien auch kann/darf.
Alles klar, danke für's Aufklären.
niemand hat geschrieben: ↑ zum Beitrag ↑
04.09.2022 19:40:26
incident hat geschrieben: ↑ zum Beitrag ↑
04.09.2022 19:28:48
PS: Bei mir läuft ein aktuelles "Debian 10"-System.
Debian 10 ist nicht aktuell.
Ein 'aktualisiertes' Debian 10 wäre wohl zutreffender gewesen...

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: sed schreibt in eine schreibgeschützte Datei

Beitrag von tobo » 04.09.2022 19:51:15

incident hat geschrieben: ↑ zum Beitrag ↑
04.09.2022 19:28:48
Wenn ich nun aber dieses Script als 'user_a' (= gewöhnlicher User) jedoch laufen lasse, wird der Inhalt der KonfigDatei - trotz dass keine Schreibrechte bestehen - nach Scriptvorgaben abgeaendert (also inhaltlich wie von mir gewuenscht, durch das Script).
sed -i arbeitet auf einer temporären Datei und benennt diese dann in den Originadateinamen um. So kannst du auf der Konsole auch den Schreibschutz umgehen.

Code: Alles auswählen

sed -i '...' FILE
vs.
sed '...' FILE >tmp; mv tmp FILE
Wenn ich jetzt jedoch die 'sed'-Zeile auskommentiere und anstatt dieser folgende Zeile einfüge:

Code: Alles auswählen

echo "???????????????????????????????" >> $CONF_FILE
Darfst du auf der Konsole auch nicht - ist schreibgeschützt.

incident
Beiträge: 63
Registriert: 13.11.2021 14:54:52

Re: [gelöst] sed schreibt in eine schreibgeschützte Datei

Beitrag von incident » 04.09.2022 19:57:29

Danke für Eure Antworten.

Ich habe zwar jetzt den Thread als gelöst markiert, aber dem ist nicht so, wie ich eben festgestellt habe...

Testweise habe ich der 'test.conf'-Datei user & group "root:root" gegeben, mit den Rechten 644.
Dann habe ich das Script (mit der 'sed'-Zeile) als user_a ausgeführt und plötzlich gehörte die KonfigDatei (test.conf) dem user "user_a:user_a" .

Da scheint wirklich etws nicht zu stimmen - das System ist erst seit ein paar Monaten aufgesetzt...

DeletedUserReAsG

Re: [halb-gelöst] sed schreibt in eine schreibgeschützte Datei

Beitrag von DeletedUserReAsG » 04.09.2022 20:05:29

incident hat geschrieben: ↑ zum Beitrag ↑
04.09.2022 19:57:29
Testweise habe ich der 'test.conf'-Datei user & group "root:root" gegeben, mit den Rechten 644.
Dann habe ich das Script (mit der 'sed'-Zeile) als user_a ausgeführt und plötzlich gehörte die KonfigDatei (test.conf) dem user "user_a:user_a" .
Das erklärt sich aus dem, was tobo dir gerade beschrieben hat: in seinem Verzeichnis darf der User Dateien löschen, auch wenn sie einem anderen User gehören. Die Datei wird also gelöscht und durch die bearbeitete Datei ersetzt, die dann logischerweise dem User gehört, der sie erstellt hat.

incident
Beiträge: 63
Registriert: 13.11.2021 14:54:52

Re: [halb-gelöst] sed schreibt in eine schreibgeschützte Datei

Beitrag von incident » 04.09.2022 20:16:01

niemand hat geschrieben: ↑ zum Beitrag ↑
04.09.2022 20:05:29
incident hat geschrieben: ↑ zum Beitrag ↑
04.09.2022 19:57:29
Testweise habe ich der 'test.conf'-Datei user & group "root:root" gegeben, mit den Rechten 644.
Dann habe ich das Script (mit der 'sed'-Zeile) als user_a ausgeführt und plötzlich gehörte die KonfigDatei (test.conf) dem user "user_a:user_a" .
Das erklärt sich aus dem, was tobo dir gerade beschrieben hat: in seinem Verzeichnis darf der User Dateien löschen, auch wenn sie einem anderen User gehören. Die Datei wird also gelöscht und durch die bearbeitete Datei ersetzt, die dann logischerweise dem User gehört, der sie erstellt hat.
Boah, ich sehe grad, dass ich nicht so viel von Linux-Rechten verstehe, wie ich dachte...

Okay, dazu noch eine notwendige Frage:
Im Moment gehört das Verzeichnis der test.conf "root:user_a" und hat die Rechte 770.

Heisst das jetzt, dass sowohl der Besitzer des Verzeichnisses (da +w hat), als auch der Gruppen-Besitzer (da auch +w hat) diese Rechte, wie du sie beschreibst, hat/haben?
Also geht es nicht nur um den Besitzer des Verzeichnisses, sondern auch um den Gruppen-Besitzer? Und falls ja, ist das abhängig vom '+w'-Flag, oder nicht?

DeletedUserReAsG

Re: [halb-gelöst] sed schreibt in eine schreibgeschützte Datei

Beitrag von DeletedUserReAsG » 04.09.2022 20:22:26

incident hat geschrieben: ↑ zum Beitrag ↑
04.09.2022 20:16:01
Okay, dazu noch eine notwendige Frage:
Dazu verweise ich einfach mal auf meine Signatur ;)

Aber wie geschrieben: wenn du eine Datei wirklich davor schützen möchtest, könntest du sie auf immutable setzen:

Code: Alles auswählen

niemand@MIN ~ % echo bla blub > test
niemand@MIN ~ % su -c 'chown root: test && chattr +i test'
Passwort: 
niemand@MIN ~ % sed -i 's/bla/blub/' test
sed: ./seddEKvv1 kann nicht umbenannt werden: Die Operation ist nicht erlaubt
4 niemand@MIN ~ % rm test
rm: das Entfernen von 'test' ist nicht möglich: Die Operation ist nicht erlaubt
1 niemand@MIN ~ % su -c 'chattr -i test'
Passwort: 
niemand@MIN ~ % rm test
rm: reguläre Datei (schreibgeschützt) 'test' entfernen? y
niemand@MIN ~ % 

incident
Beiträge: 63
Registriert: 13.11.2021 14:54:52

Re: [halb-gelöst] sed schreibt in eine schreibgeschützte Datei

Beitrag von incident » 04.09.2022 20:28:39

niemand hat geschrieben: ↑ zum Beitrag ↑
04.09.2022 20:22:26
Aber wie geschrieben: wenn du eine Datei wirklich davor schützen möchtest, könntest du sie auf immutable setzen:

Code: Alles auswählen

niemand@MIN ~ % echo bla blub > test
niemand@MIN ~ % su -c 'chown root: test && chattr +i test'
Passwort: 
niemand@MIN ~ % sed -i 's/bla/blub/' test
sed: ./seddEKvv1 kann nicht umbenannt werden: Die Operation ist nicht erlaubt
4 niemand@MIN ~ % rm test
rm: das Entfernen von 'test' ist nicht möglich: Die Operation ist nicht erlaubt
1 niemand@MIN ~ % su -c 'chattr -i test'
Passwort: 
niemand@MIN ~ % rm test
rm: reguläre Datei (schreibgeschützt) 'test' entfernen? y
niemand@MIN ~ % 
Interessant, danke.

Antworten