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

我有各种命令的列表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.gen

audituser.gen

//usr/bin/su - hradm

hradm

/apps/su - capital

capital

/apps/su - cscdm

cscdm

/apps/su - invadm

invadm

/bib/su sapbridg

Traceback (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.gen

audituser.gen

//usr/bin/su - hradm

hradm

/apps/su - capital

capital

/apps/su - cscdm

cscdm

/apps/su - invadm

invadm

/bib/su sapbridg

sapbridg

/bin//su - hdpapjpa

hdpapjpa

/bin/su  oabifstg


/bin/su  xxcconx

xxcconx

/bin/su  xxswaadm

xxswaadm

但如您所见,我错过了用户oabifstg。


一只名叫tom的猫
浏览 77回答 1
1回答

慕尼黑的夜晚无繁华

使某些东西可选的语法是放在?它后面。方括号用于指定字符集,例如[abc]匹配a,&nbsp;b, 或c。尝试这个。m&nbsp;=&nbsp;re.search(r'/su\s+(?:-\s+)?(\S*)',&nbsp;c.name).group(1)之后至少需要一个空格su,后面-跟空格的是可选组。如果要在用户名之前允许任意选项,请使用匹配-后跟零个或多个非空格字符的重复组。m&nbsp;=&nbsp;re.search(r'/su\s+(?:-\S*\s+)*(\S*)',&nbsp;c.name).group(1)我还使用了原始字符串,以便模块处理所有转义序列re。有关更多详细信息,请参阅此内容。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python