为了账号安全,请及时绑定邮箱和手机立即绑定

如何编写 python 正则表达式来提取 su 命令中使用的用户名?

如何编写 python 正则表达式来提取 su 命令中使用的用户名?

一只名叫tom的猫 2023-03-08 10:25:25
我有各种命令的列表su。所有命令都使用命令的完整路径su。命令可能有也可能没有用户名,可能有也可能没有选项-。在用户名之后也可能有选项和参数,例如/usr/bin/su aa*or   /bin/su - squid *或/bin/su - mapr -c "/usr/bin/hadoop fs -mkdir /user/*"。这是我尝试过的方法,但在遇到麻烦之前我并没有走得太远。for c in su_commands.all()[0:10]:   ...:     print(c.name)   ...:     m = re.search('/su\s*[-]\s*(\S*)', c.name).group(1)   ...:     print(m)   ...:     //bin/su - audituser.genaudituser.gen//usr/bin/su - hradmhradm/apps/su - capitalcapital/apps/su - cscdmcscdm/apps/su - invadminvadm/bib/su sapbridgTraceback (most recent call last):  File "/apps/sfo_rcecala/sfo_rcecala/env3/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3331, in run_code    exec(code_obj, self.user_global_ns, self.user_ns)  File "<ipython-input-39-788d11c0e2c2>", line 3, in <module>    m = re.search('/su\s*[-]\s*(\S*)', c.name).group(1)AttributeError: 'NoneType' object has no attribute 'group'我认为我的正则表达式中的 have[-]会使-可选的。谢谢巴尔马尔。我已经更新了我的正则表达式,现在我更进一步了。for c in su_commands.all()[0:10]:   ...:     print(c.name)   ...:     m = re.search('/su\s*\-?\s*(\S*)', c.name).group(1)   ...:     print(m)   ...:     //bin/su - audituser.genaudituser.gen//usr/bin/su - hradmhradm/apps/su - capitalcapital/apps/su - cscdmcscdm/apps/su - invadminvadm/bib/su sapbridgsapbridg/bin//su - hdpapjpahdpapjpa/bin/su  oabifstg/bin/su  xxcconxxxcconx/bin/su  xxswaadmxxswaadm但如您所见,我错过了用户oabifstg。
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

使某些东西可选的语法是放在?它后面。方括号用于指定字符集,例如[abc]匹配ab, 或c

尝试这个。

m = re.search(r'/su\s+(?:-\s+)?(\S*)', c.name).group(1)

之后至少需要一个空格su,后面-跟空格的是可选组。

如果要在用户名之前允许任意选项,请使用匹配-后跟零个或多个非空格字符的重复组。

m = re.search(r'/su\s+(?:-\S*\s+)*(\S*)', c.name).group(1)

我还使用了原始字符串,以便模块处理所有转义序列re。有关更多详细信息,请参阅此内容。


查看完整回答
反对 回复 2023-03-08
  • 1 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信