analisar o arquivo '/ etc / passwd' para encontrar usuários com shells interativos

1

Eu quero analisar o arquivo /etc/passwd para descobrir se o usuário pode executar o shell interativo.

Eu sei que o sétimo campo em cada linha do arquivo /etc/passwd informa o caminho do shell. Mas como você diz que o shell definido é interativo?

Estou analisando esses arquivos em python, posso implementar a lógica, só não sei como descobrir como identificar o shell interativo.

PS. Eu quero descobrir isso usando python.

    
por Kishor Pawar 01.02.2016 / 05:48

2 respostas

3

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.

    
por kos 01.02.2016 / 07:11
1

Repasse o arquivo dividindo cada linha em campos e verifique se o 6º campo não contém "no-login" para todas as linhas onde o UID é maior que 1000

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

Nomes de usuários que têm shell set podem efetuar login com esse shell, por exemplo xieerqi has /bin/mksh , enquanto testUser tem /bin/bash . Outros usuários não têm shell set, que será o padrão para /bin/bash

    
por Sergiy Kolodyazhnyy 01.02.2016 / 06:11