2016-05-13 86 views
1

我有一個名爲/etc/pam.d/system-auth的文件,當前內容是這樣的。在文件中使用sed修改特定字符串

[[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] ~]# 

我需要修改這一行password requisite pam_cracklib.so try_first_pass retry=3 type=這個字符串 password requisite pam_cracklib.so try_first_pass retry=3 minlen=14 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1

我使用了下面的sed命令,但它確實給了我替換的字符串。

[[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] ~]# 

我無法理解我哪裏出錯了?

回答

2

使用此sed

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

兩個問題在您的sed

  • +? - 你逃避它得到擴展regEx行爲
  • \s - 在password\(\)分組
  • 錯過

sed清晰版:

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

如果您sed支持-E選項,

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

非常感謝我學到了+和?也需要逃脫。 – kvivek

1

你的正則表達式是完全錯誤的, 例如這裏的\(\)兩者之間的話是無稽之談:password\(\)requisite

正則表達式對於它需要做的事情也過於複雜。 例如,您只需要一個組,從passwordtype=, 之間不需要中間的所有小組。

最後,這是次要的事情,但可能希望將password^作爲獨立字符(不要修改)可能在文件中註釋掉的類似行。

更正和簡化:

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

謝謝!很不錯。我也嘗試製作一組​​,從密碼到type =之前,並使用\ 1而不是創建兩個組。但我錯過了'+'的轉義字符,例如'\ +'。 – kvivek

0

避免使用/在sed,而是使用;所以它會更清潔,與-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'