Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在特定行上方搜索包含字符串的行并更新其值_Python_Pam - Fatal编程技术网

Python在特定行上方搜索包含字符串的行并更新其值

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

如果我尝试插入一个新的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/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行短语相当困难。