Как написать регулярное выражение python для извлечения имени пользователя, используемого в команде su? - PullRequest
0 голосов
/ 14 июля 2020

У меня есть список различных su команд. Все команды используют полный путь к команде su. И команды могут иметь или не иметь имя пользователя и могут иметь или не иметь параметр -.

Также могут быть параметры и аргументы после имени пользователя, например /usr/bin/su aa* или /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'

Я думал, что наличие [-] в моем регулярном выражении сделает - необязательно.

Спасибо, Бармар. Я обновил свое регулярное выражение, и теперь я продолжаю.

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.

1 Ответ

1 голос
/ 14 июля 2020

Чтобы сделать что-то необязательным, нужно поставить ? после него. Квадратные скобки предназначены для указания набора символов, например, [abc] соответствует либо a, b, или 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)

Я также использовал необработанную строку, чтобы все escape-последовательности обрабатывались модулем re. Подробнее см. здесь .

...