2016-05-13 8 views
1

Ich habe eine Datei namens /etc/pam.d/system-auth und der aktuelle Inhalt ist wie folgt.Ändern der spezifischen Zeichenfolge mit sed in einer Datei

[[email protected] ~]# cat /etc/pam.d/system-auth 
#%PAM-1.0 
# This file is auto-generated. 
# User changes will be destroyed the next time authconfig is run. 
auth  required  pam_env.so 
auth  sufficient pam_fprintd.so 
auth  sufficient pam_unix.so nullok try_first_pass 
auth  requisite  pam_succeed_if.so uid >= 500 quiet 
auth  required  pam_deny.so 

account  required  pam_unix.so 
account  sufficient pam_localuser.so 
account  sufficient pam_succeed_if.so uid < 500 quiet 
account  required  pam_permit.so 

password requisite  pam_cracklib.so try_first_pass retry=3 type= 
password sufficient pam_unix.so sha256 shadow nullok try_first_pass use_au                      thtok 
password required  pam_deny.so 

session  optional  pam_keyinit.so revoke 
session  required  pam_limits.so 
session  [success=1 default=ignore] pam_succeed_if.so service in crond quiet                       use_uid 
session  required  pam_unix.so 
[[email protected] ~]# 

Ich brauche diese Linie password requisite pam_cracklib.so try_first_pass retry=3 type= mit dieser Zeichenfolge password requisite pam_cracklib.so try_first_pass retry=3 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1 zu ändern.

Ich habe den folgenden Befehl sed verwendet, aber es gab mir die ersetzte Zeichenfolge.

[[email protected] ~]# sed 's/\(\(password\(\s+)requisite\(\s+\)pam_cracklib.so\(.*?\)\) type=\)/\2 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1/' /etc/pam.d/system-auth 
#%PAM-1.0 
# This file is auto-generated. 
# User changes will be destroyed the next time authconfig is run. 
auth  required  pam_env.so 
auth  sufficient pam_fprintd.so 
auth  sufficient pam_unix.so nullok try_first_pass 
auth  requisite  pam_succeed_if.so uid >= 500 quiet 
auth  required  pam_deny.so 

account  required  pam_unix.so 
account  sufficient pam_localuser.so 
account  sufficient pam_succeed_if.so uid < 500 quiet 
account  required  pam_permit.so 

password requisite  pam_cracklib.so try_first_pass retry=3 type= 
password sufficient pam_unix.so sha256 shadow nullok try_first_pass use_authtok 
password required  pam_deny.so 

session  optional  pam_keyinit.so revoke 
session  required  pam_limits.so 
session  [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid 
session  required  pam_unix.so 
[[email protected] ~]# 

Ich kann nicht verstehen, wo ich falsch liege?

Antwort

2

Verwenden Sie dieses sed:

sed 's/\(\(password\(\s\+\)requisite\(\s\+\)pam_cracklib.so\(.*\?\)\) type=\)/\2 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1/' file 

Zwei Probleme in Ihrem sed:

  • + und ? - Sie haben es entweichen lassen erweitert regEx Verhalten
  • \s - Verpasste in password\(\)
  • Gruppierung

Clear Version von sed:

sed 's/^\(\(password\s\+requisite\s\+pam_cracklib.so.*\) type=\)/\2 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1/' 

Wenn Ihre sed unterstützt -E Option,

sed -E 's/^(password\s+requisite\s+pam_cracklib.so.*)(type=)/\1 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1/' 
+0

Vielen Dank habe ich gelernt + und? auch müssen entgangen sein. – kvivek

1

war Ihr regex völlig falsch, zum Beispiel hier die \(\) zwischen zwei Worte ist Unsinn: password\(\)requisite

Die Regex war auch zu kompliziert für was es tun muss. Zum Beispiel brauchen Sie nur eine Gruppe, von password bis vor type=, keine Notwendigkeit für alle diese kleinen Gruppen dazwischen.

Schließlich ist es eine Nebensache, aber wahrscheinlich möchten Sie password mit ^ verankern, um ähnliche Zeilen zu lassen (nicht ändern), die in der Datei auskommentiert sein könnten.

korrigiert und vereinfacht:

sed 's/^\(password\s\+requisite\s\+pam_cracklib.so.\+\) type=/\1 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1/' 
+0

Danke! Es war nett. Ich habe auch versucht, eine Gruppe zu bilden, vom Passwort bis zum Typ =, und benutze \ 1, anstatt zwei Gruppen zu erstellen. Aber mir fehlte das Escape-Zeichen für '+', also '\ +'. – kvivek

0

Vermeiden Sie/in sed, stattdessen verwenden; so wird es viel sauberer sein, mit -E

sed -E 's;(pam_cracklib.so\s+try_first_pass\s+)(retry=3\s+)type=;\1\2 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1;g' 
Verwandte Themen