/etc/passwd
사용자가 대화 형 셸을 실행할 수 있는지 확인하기 위해 파일 을 구문 분석하고 싶습니다 .
/etc/passwd
파일의 각 줄에있는 7 번째 필드 는 쉘의 경로를 알려줍니다. 그러나 정의 된 쉘이 상호 작용 적이라고 어떻게 말합니까?
이 파일을 파이썬으로 구문 분석하고 있으며 논리를 구현할 수 있습니다. 대화 형 셸을 식별하는 방법을 찾는 방법을 모르겠습니다.
추신. 파이썬을 사용하여 알아 내고 싶습니다.
나는 당신이 기본적인 오해를 가지고 있다고 생각합니다. 대화식으로 달릴 수는 없지만 비 대화식으로 달릴 수 있다고 말하는 것은 운전할 수 없지만 라디오를 듣는 데 사용할 수있는 자동차에 대한 이야기와 비슷합니다.
셸의 주요 목적은 대화 형으로 실행하는 것입니다. 비대화 형으로 실행할 수 있다는 사실은 선택 사항이며 그 반대는 아닙니다.
대화식으로 실행할 수 없지만 비 대화식으로 실행할 수있는 쉘의 개념에 더 가까워서 대화식으로 해석 할 수없는 해석 된 언어입니다 (현재 나에게 실제 예제가 나타나지 않지만 가장 일반적인 해석 언어는 모두 대화식 세션을 실행할 수 있습니다 : 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
. 당신도 그것들을 조심해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다