sed mit Bedingung versehen?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
kuahmelcher
Beiträge: 34
Registriert: 08.04.2014 17:06:40

sed mit Bedingung versehen?

Beitrag von kuahmelcher » 11.02.2015 11:39:02

Hallo Experten,

ich muss meine /etc/shadow bearbeiten um ein Verfallsdatum hinzuzufügen. Leider muss ich das auf einem System machen (Synology DS), das viele praktische Befehle nicht anbietet (z.B. chage oder usermod --expiredate). Deswegen muss ich also selbst 'ran.

Momentan versuche ich das SO:

Code: Alles auswählen

for i in $(cat shadow | cut -d':' -f1);
do
        if [ $i = "mysql" ]
        then
                sed -i 's/:$/20000:/g' shadow
        fi
done

Funzt aber nicht richtig. Sobald der Benutzername in Shadow gefunden wird, bekommen alle User der Shadow-Datei das Verfallsdatum aufgebraten:
lp:*:16477:0:99999:7::20000:
mysql:*:16477:0:99999:7::20000:
nobody:*:16477:0:99999:7::20000:
spamfilter:*:16477:0:99999:7::20000:
es soll aber danach SO aussehen:
lp:*:16477:0:99999:7:::
mysql:*:16477:0:99999:7::20000:
nobody:*:16477:0:99999:7:::
spamfilter:*:16477:0:99999:7:::
Der User mysql ist hier natürlich nur ein Beispiel, den will ich nicht sperren ... :D

Danke für Hinweise!
Gruß, kuahmelcher

Benutzeravatar
Meillo
Moderator
Beiträge: 9235
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed mit Bedingung versehen?

Beitrag von Meillo » 11.02.2015 11:53:21

Es geht viel einfacher:

Code: Alles auswählen

sed '/^mysql:/ s/::$/:20000:/' /etc/shadow >/etc/shadow.new
EDIT: Mit awk:

Code: Alles auswählen

awk 'BEGIN{FS=OFS=":"}; $1=="mysql"{$8="20000"}; 1' /etc/shadow >/etc/shadow.new
Use ed once in a while!

kuahmelcher
Beiträge: 34
Registriert: 08.04.2014 17:06:40

Re: sed mit Bedingung versehen?

Beitrag von kuahmelcher » 11.02.2015 13:35:42

Meillo hat geschrieben:Es geht viel einfacher:

Code: Alles auswählen

sed '/^mysql:/ s/::$/:20000:/' /etc/shadow >/etc/shadow.new

... ich hab's geahnt: der berühmte Einzeiler! :THX:

Sag mal - gibts einen Grund, die gesamte Shadow-Datei erstmal in eine shadow.new-Datei zu kopieren? Ich hätte nämlich intuitiv ohne dem Parameter -i alles dem sed überlassen ... mir ist zwar etwas unheimlich dabei (von wegen Operation am offenen Herzen und so) aber bisher hadded noch immer jut jejangen.

Danke und Gruß, kuahmelcher

Benutzeravatar
Meillo
Moderator
Beiträge: 9235
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed mit Bedingung versehen?

Beitrag von Meillo » 11.02.2015 13:44:35

kuahmelcher hat geschrieben: Sag mal - gibts einen Grund, die gesamte Shadow-Datei erstmal in eine shadow.new-Datei zu kopieren? Ich hätte nämlich intuitiv ohne dem Parameter -i alles dem sed überlassen ... mir ist zwar etwas unheimlich dabei (von wegen Operation am offenen Herzen und so) aber bisher hadded noch immer jut jejangen.
... eben wegen der Operation am offenen Herzen. Wenn man sich sicher ist, dann kann man das machen, es sollte halt besser nichts schief gehen.

Wenn man eine temporaere Datei verwendet, dann muss man aber das Problem einer Race-Condition bedenken: /etc/shadow ist nur fuer root und die Gruppe shadow lesbar. Mit der Standard-umask ist shadow.new nach obigem Beispiel aber fuer alle lesbar. Deshalb: Entweder die umask geeignet setzen; oder die Zieldatei erst leer anlegen, Rechte einschraenken und dann ueberschreiben; oder die Zieldatei in einen geschuetzten Bereich (z.B. /root) schreiben. (Das haette ich vielleicht besser gleich dazu sagen sollen. :roll: )
Use ed once in a while!

Antworten