• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Mit sed einen bestimmten String ersetzen

byron1778

Hacker
Hallo Forum,

ich möchte mir meine /etc/shadow - Datei automatisieren sozusagen.
Soll heissen, sobald ein neuer User mit adduser angelegt wird, soll in der /etc/shadow - Datei der letzte Eintrag umgeändert werden zu:

Login:NP:::::::

Leider weiss ich aber nicht, wie ich den letzten Eintrag, der dem neuen User entspricht, als NP (für no password) ersetzen kann?

Ich dachte mir es könnte mit sed gehen, aber in den Anleitungen finde ich nicht so wirklich die Lösung.

Wenn mir jemand viell. Tipps geben könnte, mit welchem Werkzeug es möglich wäre.

Danke vielmals

LG
Byron
 

moenk

Administrator
Teammitglied
Ich würd da zwei "grep" machen, einmal mit "-i" und einmal ohne, den mit durch "sed" laufen lassen und dann beide zusammenpappen.
Aber das geht sicher viel eleganter...
 
OP
B

byron1778

Hacker
Hallo,

wäre auch eine Möglichkeit.
Was dabei aber noch wichtig ist wäre folgendes:

die Datei /etc/shadow soll beibehalten werden, also keine neue Datei anlegen oder so, sondern einfach immer der letzte Eintrag soll verändert werden.

MfG
Byron
 
Gegenfrage: Warum das ganze?

1. Das direkte bearbeiten der /etc/shadow ohne entsprechende Sicheheitskopie bzw. den Umweg über eine temporäre Datei halte ich für grob fahrlässig.

2. User, die du mit useradd (ohne die Passwort-Option) anlegst haben sowieso kein Passwort = können sich nicht einloggen.
Wenn du User mit adduser anlegst, kannst du den entsprechenden User anschließend ganz einfach wieder sperren (siehe 3.).

3. Üblicherweise sperrt man Benutzer mit
Code:
passwd -l <user>
 
OP
B

byron1778

Hacker
Das Problem an der Sache ist, dass sich die Useranlage nicht nur auf Unix bezieht, sondern auch auf ein externes Program, welches wir administrieren.

Dabei loggen sich die User mit einem Script am Unix - Server an, der stellt dann eine Verbindung zu dem externen Programm her.
Das Program selber besitzt eine Authentifikation.

Die User müssen deswegen am Unix - Server einen Benutzer haben, der ohne PW auskommt -> der User startet nur dann die Applikation.

Die Vorgehensweise sieht so aus, und genau diese wollte ich automatisieren:

Code:
useradd –d /usr/home/<username> -g kondoruser –s /bin/csh –m –c ,<Vorname> <Familienname>’ –k /export/home/Muster_User <username>

chown root /export/home/.rhosts

vi /etc/shadow

<username>:NP:::::::

vi /usr/home/scripts/xxxusers

cd /opt/kr/tools/replicate
./replicate_files
 
sed -i -e '$s/^\([^:]*:\)[^:]*:/\1NP:/' /etc/shadow

Aber ohne Gewähr.. -i kennen nicht alle sed. Neuere GNU-sed
können jedoch das in der Datei editieren.

$ sollte nur die letzte Datei ansprechen.

Das Ganze kann natürlich nicht mehrfach gleichzeitig aufgerufen
werden. Wenn 2 useradd erst gelaufen sind würden beide
anschliessend laufenden sed nur die letzte Zeile verändern.

Haveaniceday
 

abgdf

Guru
Hi,

normalerweise mache ich sowas mit Perl oder Python. Aber es geht auch (unbequem) mit bash:

Code:
#!/bin/bash

# Loading /etc/shadow into an array called "a"
a=($(cat /etc/shadow))

# Copying array "a" to array "b" without the last line
for i in $(seq 0 $((${#a[@]} - 2)))
do
    b[$i]=$(echo "${a[$i]}")
done

# Adding the new last line of array "b"
b[$((${#a[@]} - 1))]="<username>:NP:::::::"

cp /etc/shadow /etc/shadow.backup

rm /etc/shadow
touch /etc/shadow

# Writing array "b" to /etc/shadow
for i in $(seq 0 $((${#b[@]} - 1)))
do
    echo "${b[$i]}" >> /etc/shadow
done

HTH

Viele Grüße
 

regexer

Advanced Hacker
haveaniceday schrieb:
$ sollte nur die letzte Datei ansprechen.

Das Ganze kann natürlich nicht mehrfach gleichzeitig aufgerufen
werden. Wenn 2 useradd erst gelaufen sind würden beide
anschliessend laufenden sed nur die letzte Zeile verändern.
Das könnte man zumindest mit einer ausreichenden Bereichsangabe abfangen, zum Beispiel '10,$s/...' (=ändere von der 10. bis zur letzen Zeile). Allerdings würde ich das trotzdem nur ungern gleichzeitig auf die /etc/shadows loshetzen. Es ist zwar sehr unwahrscheinlich, dass zwei Dateiänderungen wirklich zeitgleich passieren, aber laut Murphy ...
 
notoxp schrieb:
Das könnte man zumindest mit einer ausreichenden Bereichsangabe abfangen, zum Beispiel '10,$s/...' (=ändere von der 10. bis zur letzen Zeile). Allerdings würde ich das trotzdem nur ungern gleichzeitig auf die /etc/shadows loshetzen. Es ist zwar sehr unwahrscheinlich, dass zwei Dateiänderungen wirklich zeitgleich passieren, aber laut Murphy ...

Ja, hatte ich mir auch schon überlegt. Aber der Autor des Beitrages hat sich schon ausgeklinkt (?).

In den sed string könnte man dann zur besseren Funktion auch den Usernamen mit einfügen.
sed -i -e"10,\$s/^<username>.*/<username>:NP:::::::"

Haveaniceday
 
Oben