Я хочу проанализировать /etc/passwd
файл, чтобы узнать, может ли пользователь выполнить интерактивную оболочку.
Я знаю 7-е поле в каждой строке /etc/passwd
файл говорит путь оболочки. Но Как сказать что, определенная оболочка является интерактивной?
Я анализирую это файлы в Python, я могу реализовать логику, я просто не знаю, как узнать, как определить Интерактивную оболочку.
PS. Я хочу найти это использованием Python.
Я думаю, что у Вас есть основное неправильное представление: говорить об оболочке, которую Вы не можете выполнить в интерактивном режиме, но что можно работать нев интерактивном режиме, во многом как то, чтобы говорить об автомобиле, который Вы не можете водить, но что можно использовать для слушания радио.
Основная цель оболочки работает в интерактивном режиме, то, что она может работать нев интерактивном режиме, является дополнительным, не наоборот.
Ближе к понятию оболочки, которую Вы не можете выполнить в интерактивном режиме, но что можно работать нев интерактивном режиме, интерпретируемый язык, который не может быть интерпретирован в интерактивном режиме (хотя один реальный пример не происходит со мной прямо сейчас: наиболее распространенные интерпретируемые языки все могут выполнить интерактивные сессии: 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
используемый для запрещения входа в систему пользователя. Необходимо не упустить их также.
Цикл через файл, разделяющий каждую строку на поля и проверку, если 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