парсинг '/etc/passwd' файл для нахождения пользователей с Интерактивными оболочками

Я хочу проанализировать /etc/passwd файл, чтобы узнать, может ли пользователь выполнить интерактивную оболочку.

Я знаю 7-е поле в каждой строке /etc/passwd файл говорит путь оболочки. Но Как сказать что, определенная оболочка является интерактивной?

Я анализирую это файлы в Python, я могу реализовать логику, я просто не знаю, как узнать, как определить Интерактивную оболочку.

PS. Я хочу найти это использованием Python.

1
задан 1 February 2016 в 09:44

2 ответа

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

Основная цель оболочки работает в интерактивном режиме, то, что она может работать нев интерактивном режиме, является дополнительным, не наоборот.

Ближе к понятию оболочки, которую Вы не можете выполнить в интерактивном режиме, но что можно работать нев интерактивном режиме, интерпретируемый язык, который не может быть интерпретирован в интерактивном режиме (хотя один реальный пример не происходит со мной прямо сейчас: наиболее распространенные интерпретируемые языки все могут выполнить интерактивные сессии: Perl, Python, PHP...)

Сказал, хотите ли Вы узнать, разрешают ли пользователю войти в систему через оболочку, можно использовать эту команду:

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 команда с именем пользователя пользователя)

В 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" оператор с именем пользователя пользователя)

Или, как предложено 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" оператор с именем пользователя пользователя)

Во всех примерах, выше если седьмое поле пользователя /etc/passwd запись также /usr/sbin/nologin или /usr/bin/false печатается сообщение, говоря, что пользователю не разрешают войти в систему; иначе оболочка входа в систему пользователя печатается.

Но имейте в виду, что быть неспособностью для входа в систему через оболочку не означает, что пользователю не разрешают войти в систему вообще, и что могли бы быть поддельные оболочки кроме /usr/sbin/nologin или /bin/false используемый для запрещения входа в систему пользователя. Необходимо не упустить их также.

3
ответ дан 3 December 2019 в 06:59

Цикл через файл, разделяющий каждую строку на поля и проверку, если 6-е поле не содержит "без входов в систему" для всех строк, где UID больше, чем 1 000

>>> 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

Имена пользователей, у кого есть набор оболочки, может войти в систему с той оболочкой, например xieerqi имеет /bin/mksh, в то время как testUser имеет /bin/bash. У других пользователей нет набора оболочки, который примет значение по умолчанию к /bin/bash

1
ответ дан 3 December 2019 в 06:59

Другие вопросы по тегам:

Похожие вопросы: