Python在特定行上方搜索包含字符串的行并更新其值
如果我尝试插入一个新的pam规则,下面的代码将起作用Python在特定行上方搜索包含字符串的行并更新其值,python,pam,Python,Pam,如果我尝试插入一个新的pam规则,下面的代码将起作用 auth[default=ignore success=1]pam\u success\u if.so user1:user2中的用户 就在/etc/pam.d/system auth ac文件中现有pam_lastlog规则的行上方 所需帐户pam_lastlog.so inactive=10 found = False users="user1 user2" for line in fileinput.FileInput("/etc/pa
auth[default=ignore success=1]pam\u success\u if.so user1:user2中的用户
就在/etc/pam.d/system auth ac文件中现有pam_lastlog规则的行上方
所需帐户pam_lastlog.so inactive=10
found = False
users="user1 user2"
for line in fileinput.FileInput("/etc/pam.d/system-auth-ac", inplace=1):
obj = re.match(r"^(?!#).*auth.*pam_succeed_if.so\s+user\s+in\s+.*\n", line)
if obj:
found = True
line = re.sub(r'user\s+in\s+[\w:]+',"user in %s" % ":".join(users.split()), obj.group(0))
sys.stdout.write(line)
fileinput.close()
if not found:
pam_rule = "auth [default=ignore success=1] pam_succeed_if.so user in %s\n" %":".join(users.split())
for line in fileinput.input("/etc/pam.d/system-auth-ac", inplace=True):
if re.search(r"pam_lastlog.so\s+.*inactive=", line):
sys.stdout.write(pam_rule)
sys.stdout.write(line)
如果此pam\u success\u,则该pam文件中已存在规则(由上述代码插入),但有两个位置,一个位于pam\u lastlog.so行上方,另一个位于pam\u故障锁上方。因此具有不同用户的规则行,如果规则刚好在pam\u lastlog之上,那么我必须只更新pam\u success\u的用户部分。因此规则只更新,而不是pam\u faillock之上的部分。因此对于解决方案,我使用了使用正则表达式的多行搜索
found = False
users="user1 user2"
lines = open("/etc/pam.d/system-auth").readlines()
for i, line in enumerate(lines):
succobj = re.match(r"^(?!#).*auth.*pam_succeed_if.so\s+user\s+in\s+.*\n", line)
if succobj:
lastlogobj = re.match(r"^.*pam_lastlog.so\s+.*inactive=.*\n", lines[i+1])
if lastlogobj:
found = True
lines[i] = re.sub(r'user\s+in\s+[\w:]+',"user in %s" % ":".join(users.split()), succobj.group(0))
if found:
open("/etc/pam.d/system-auth","w").writelines(lines)
else:
pam_rule = "auth [default=ignore success=1] pam_succeed_if.so user in %s\n" %":".users.split())
for line in fileinput.input("/etc/pam.d/system-auth", inplace=True):
if re.search(r"pam_lastlog.so\s+.*inactive=", line):
sys.stdout.write(pam_rule)
sys.stdout.write(line)
如果有任何其他可能的复杂方法,请让我知道请简化描述。阅读包含几个不同文件名的5行短语相当困难。