Питонический способ прохождения теней и т. Д.

1

Я пытаюсь реализовать логику с помощью python:

 cat /etc/shadow | awk -F: '($2 == "" ) { print $1 " does not have a password "}'

Если приведенное выше возвращает результат для пользователя, я сделаю

passwd -l <username>

Я пытаюсь реализовать вышеприведенную логику с помощью python, но я не уверен, что она работает именно таким образом; вот мой код на Python:

/etc/shadow выглядит как

root:*:17709:0:99999:7:::
daemon:*:17709:0:99999:7:::
bin:*:17709:0:99999:7:::
sys:*:17709:0:99999:7:::
sync:*:17709:0:99999:7:::
games:*:17709:0:99999:7:::
man:*:17709:0:99999:7:::
lp:*:17709:0:99999:7:::
mail:*:17709:0:99999:7:::
news:*:17709:0:99999:7:::
uucp:*:17709:0:99999:7:::
proxy:*:17709:0:99999:7:::
www-data:*:17709:0:99999:7:::
backup:*:17709:0:99999:7:::

КОД

with open("/etc/shadow") as file:
   for line in file:
       line = line.rstrip()
       if line[line.find(":")+1:line.find(":")]=="":
          print "This is a problem"
       elif line[line.find(":")+1:line.find(":")]=="*":
          print line[line.find(":")+1:line.find(":")]
       else:
          print "All Good"

Вышеприведенный код возвращает "Это проблема", что неверно

  • 0
    line.find(":") всегда выдаст первое появление ":". Проблема здесь в том, что вторая line.find(":") снова вернет индекс первой ":".
  • 0
    Обратите внимание, что line.find(":") всегда начинает поиск в начале строки. «Это проблема», потому что line[x+1:x] всегда приводит к пустой строке.
Показать ещё 1 комментарий
Теги:

3 ответа

0
Лучший ответ

Просто разделите свои строки на разделителе ":" и проверьте значение во второй позиции (что, конечно, по индексу 1):

data = """
root:*:17709:0:99999:7:::
daemon:*:17709:0:99999:7:::
bin:*:17709:0:99999:7:::
sys:*:17709:0:99999:7:::
sync:*:17709:0:99999:7:::
games:*:17709:0:99999:7:::
man:*:17709:0:99999:7:::
lp:*:17709:0:99999:7:::
mail:*:17709:0:99999:7:::
news:*:17709:0:99999:7:::
uucp:*:17709:0:99999:7:::
proxy:*:17709:0:99999:7:::
www-data:*:17709:0:99999:7:::
backup:*:17709:0:99999:7:::
"""

for line in data.strip().splitlines():
    row = [part.strip() for part in line.split(":")]
    if row[1] == "":
        print("this is a problem")
    elif row[1] == "*":
        print row[1] 
    else: 
        print "all good"
1

Попытайся:

with open("/etc/shadow/") as ff:
   for line in ff:   
        login_name,pwd,remainder=line.split(":",maxsplit=2)
        print(login_name,pwd) # change it as you like
1

Вы можете использовать re для извлечения нужной колонки:

import re

data = """root:*:17709:0:99999:7:::
daemon:*:17709:0:99999:7:::
bin:*:17709:0:99999:7:::
sys:*:17709:0:99999:7:::
sync:*:17709:0:99999:7:::
games:*:17709:0:99999:7:::
man:*:17709:0:99999:7:::
lp:*:17709:0:99999:7:::
mail:*:17709:0:99999:7:::
news:*:17709:0:99999:7:::
uucp:*:17709:0:99999:7:::
proxy:*:17709:0:99999:7:::
www-data:*:17709:0:99999:7:::
backup:*:17709:0:99999:7:::"""

groups = re.findall('(.*?):(.*?):(.*?):(.*?):(.*?):(.*?):(.*?):(.*?):', data)

if all(g[1].strip() for g in groups):
    print('All good')
else:
    print('This is a problem')

Это печатает:

All good

Объяснение этого регулярного выражения здесь. Во второй группе (g[1]) у вас есть теневой пароль (*) или пустая строка.

  • 1
    Здесь слишком много. Вы можете просто разделить строку на ":"
  • 0
    @brunodesthuilliers Вторая группа должна быть g [2]? нет?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню