Questão Analisando o arquivo `/ etc / passwd` para encontrar usuários com shells interativos


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

Eu conheço o 7º campo em cada linha de /etc/passwd arquivo informa o caminho do shell. Mas como você diz que, shell definido é interativo?

Eu estou analisando esses arquivos em python, eu posso implementar a lógica, eu simplesmente não sei como descobrir como identificar o shell interativo.

PS. Eu quero descobrir isso usando python.


1
2018-02-01 04:48


origem


Você quer verificar se o shell pode executar interativamente? caso contrário, a questão é dependente da implementação e ambígua. - heemayl
Eu não li a pergunta assim antes ... Se eles podem executar um shell, eles podem executá-lo de forma interativa. Como você executa um shell "não interativamente" (script) sem executá-lo a partir de um shell interativo? A menos que você queira dizer executando um script em um ambiente de desktop. - kos
@heemayl na verdade eu sou novo no linux, eu apreciarei se você explicar o que é o Interactive shell e como você identifica um. - Kishor Pawar
Verifica esta .. como você não entende a diferença, é provavelmente mais sábio para remover ou reformular a pergunta. - heemayl
Analisar /etc/shells. - muru


Respostas:


Eu acho que você tem um equívoco básico: falar de um shell que você não pode executar de forma interativa, mas que você pode executar de forma não interativa é como falar de um carro que você não pode dirigir, mas que você pode usar para ouvir o 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 perto 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: as linguagens interpretadas mais comuns) pode executar sessões interativas: Perl, Python, PHP, ...)

Isso foi dito se você quiser descobrir se um usuário tem permissão para efetuar login por meio 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"

(substituir user no getent passwd user comando com o nome de usuário do usuário)

Em Python você poderia 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])

(substituir user no user = "user" declaração com o nome de usuário do usuário)

Ou, como sugerido por muru, melhor usar o pwd módulo:

#!/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)

(substituir user no user = "user" declaração com o nome de usuário do usuário)

Em todos os exemplos acima, se o sétimo campo do usuário /etc/passwd a entrada é /usr/sbin/nologin ou /usr/bin/false uma mensagem dizendo que o usuário não tem permissão para efetuar login é impresso; caso contrário, o shell de login do usuário será impresso.

Mas tenha em mente que não ser capaz de fazer o login através de um shell não significa que o usuário não tem permissão para fazer login, e que pode haver outros falsos /usr/sbin/nologin ou /bin/false usado para proibir o login do usuário. Você deve estar atento para aqueles também.


3
2018-02-01 06:11



Além disso, há o pwd biblioteca: docs.python.org/3/library/pwd.html - muru
@muru Soa melhor, obrigado. - kos
@muru Huh certo, eu esqueci que estava colando do terminal. E sim parece melhor usando in. Obrigado. - kos


Faz um loop através do arquivo que divide cada linha em campos e verifica 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

Os nomes de usuários que possuem shell set podem efetuar login com esse shell, por exemplo xieerqi tem /bin/mksh, enquanto testUser tem /bin/bash. Outros usuários não possuem shell, que será padronizado para /bin/bash


1
2018-02-01 05:11



você quer dizer que todas as conchas são interativas, exceto com o no-login? - Kishor Pawar
Serg, receio que a questão é bastante ambígua e sua resposta não é propriamente dirigida também ... não é sua culpa, na verdade, como o OP não é claro sobre as diferenças entre as sessões de shell .. - heemayl
heemail exatamente eu não sou claro sobre o conceito de shell. - Kishor Pawar
@KishorPawar Todos os shells comuns, como bash, ksh, csh , dash - todos esses são interativos se você pode digitar algo com o teclado. Se você os estiver usando para executar um script, isso não é interativo. Essa é uma questão diferente. Se um usuário tiver um shell configurado /etc/passwd Isso significa que eles podem fazer login interativamente e controlar o sistema usando o teclado. Então todo usuário que tem alguma forma de shell configurada (ou como alguns dos meus usuários - em branco) eles poderão fazer o login e trabalhar interativamente - Sergiy Kolodyazhnyy
Você também pode usar /bin/false desativar o shell para um usuário - Germar