Acho que você tem um equívoco básico: falar de um shell que não pode ser executado de forma interativa, mas que pode ser executado sem interação, é como falar de um carro que você não pode dirigir, mas que pode ser usado para ouvir rádio.
O principal objetivo de um shell é executar de forma interativa, o fato de ele poder ser executado de forma não interativa é o opcional, e não o contrário.
Mais próximo do conceito de um shell que você não pode executar interativamente, mas que pode ser executado de forma não interativa, é uma linguagem interpretada que não pode ser interpretada interativamente (embora um exemplo real não esteja ocorrendo agora: o mais comum Todas as linguagens interpretadas podem executar sessões interativas: Perl, Python, PHP, ...)
Isso foi dito se você quiser descobrir se um usuário tem permissão para efetuar login através de um shell , você pode usar este comando:
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"
(substitua user
no comando getent passwd user
pelo nome de usuário do usuário)
Em Python, você pode fazer:
#!/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])
(substitua user
na instrução user = "user"
pelo nome de usuário do usuário)
Ou, como sugerido por muru, é melhor usar o módulo 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)
(substitua user
na instrução user = "user"
pelo nome de usuário do usuário)
Em todos os exemplos acima, se o sétimo campo da entrada /etc/passwd
do usuário for /usr/sbin/nologin
ou /usr/bin/false
, uma mensagem informando que o usuário não tem permissão para fazer login será impressa; caso contrário, o shell de login do usuário será impresso.
Mas lembre-se de que não conseguir fazer login por meio de um shell não significa que o usuário não tenha permissão para fazer login, e que pode haver outros spells diferentes de /usr/sbin/nologin
ou /bin/false
usados para proibir o login do usuário . Você deve estar atento para aqueles também.