解析`/ etc / passwd`文件以查找具有Interactive shell的用户
我想解析/etc/passwd
文件,找出用户是否可以运行交互式shell。
我知道/etc/passwd
文件的每一行中的第7个字段告诉shell的路径。 但是你怎么说,定义的shell是互动的?
我在python中解析这个文件,我可以实现逻辑,我只是不知道如何找出如何识别Interactive shell。
PS。 我想用python找到它。
我认为你有一个基本的误解:谈论一个你无法以交互方式运行的shell,但是你可以非交互式运行就像谈论一辆你无法驾驶但可以用来收听收音机的汽车。
shell的主要目的是以交互方式运行,它可以非交互式运行,这是可选的,而不是相反。
更接近于无法以交互方式运行的shell的概念,但是您可以非交互式运行是一种解释性语言,无法以交互方式解释(尽管现在还没有一个真实的例子:最常见的解释语言可以运行交互式会话:Perl,Python,PHP,…)
如果您想知道是否允许用户通过shell登录 ,可以使用以下命令:
shell=$(getent passwd user | cut -d ':' -f 7); [ "$shell" = "/usr/sbin/nologin" -o "$shell" = "/bin/false" ] && printf 'User is not allowed to login\n' || printf '%s\n' "$shell"
(使用user
的用户名替换getent passwd user
命令中的user)
在Python中你可以这样做:
#!/usr/bin/python user = "user" with open("/etc/passwd") as file: for line in file: if line.split(":")[0] == user: if line.rstrip("\n").split(":")[6] in ["/usr/sbin/nologin", "/bin/false"]: print("User is not allowed to login") else: print(line.rstrip("\n").split(":")[6])
(使用user
的user = "user"
替换user
user = "user"
语句中的user)
或者,正如muru所建议的那样,更好地使用pwd
模块:
#!/usr/bin/python from pwd import getpwnam user = "user" shell = getpwnam(user)[6] if shell in ["/usr/sbin/nologin", "/bin/false"]: print("User is not allowed to login") else: print(shell)
(使用user
的user = "user"
替换user
user = "user"
语句中的user)
在上面的所有示例中,如果用户的/etc/passwd
条目的第七个字段是/usr/sbin/nologin
或/usr/bin/false
,则会打印一条消息,指出不允许用户登录; 否则打印用户的登录shell。
但请记住, 无法通过shell登录并不意味着根本不允许用户登录,并且可能存在除/usr/sbin/nologin
或/bin/false
之外的伪造shell以防止禁止用户的登录信息 。 你也应该留意这些。
循环文件将每行拆分为字段,并检查第6个字段是否包含UID大于1000的所有行的“无登录”
>>> with open("/etc/passwd") as file: ... for line in file: ... if int(line.split(":")[2]) > 1000 and not str(line.split(":")[6]).__contains__("nologin"): ... print line ... testuser:x:1001:1001:,,,:/home/testuser:/bin/bash tester:x:1002:1002:TESTER,,,:/home/tester:/bin/bash newUser:x:1003:1003::/home/newUser: testUser:x:1004:1004::/home/testUser: testuser2:x:1005:1005:asdf,asdf,asdf,asdf,asdf:/home/testuser2:/bin/bash
具有shell set的用户名可以使用该shell登录,例如xieerqi
具有/bin/mksh
,而testUser
具有/bin/bash
。 其他用户没有shell set,默认为/bin/bash