Alterando a senha do usuário através do aplicativo GUI

Alterando a senha do usuário através do aplicativo GUI

Eu estava fazendo uma aplicação GUI para gerenciar usuários e grupos no Linux!

Concluí a parte em que ele cria um novo usuário, mas fiquei com a parte em que fornece uma nova senha ao usuário recém-criado. O que meu aplicativo simplesmente faz é pegar a entrada necessária (nome de usuário, lista de grupos e senha) por meio de uma GUI e executar um script que passa essas informações como argumento. Digamos que temos uma conta de usuário, xyz. Se eu quiser alterar a senha desta conta, tudo o que preciso fazer é simplesmente executar o comando:

passwd xyz

Isso solicitará uma nova senha. Agora posso criar uma nova conta usando scripts porque todas as informações necessárias são passadas na linha de comando.

useradd -m -G users -g "groups" -s /bin/bash "UserName"

Posso executar um script através do aplicativo Qt e criar o usuário, mas em passwd cmd, a entrada é solicitada na outra linha. Como lidar com isso?

Responder1

Acho que a resposta certa aqui é:não use shell para uma ferramenta de linha de comando - use uma chamada de biblioteca. Isso permitirá que você lide melhor com os erros e evitará a passagem da senha propensa a riscos em uma linha de comando.

Uma biblioteca que você pode usar élibuser, que é relativamente simples e possui ligações C e Python.

Responder2

Como root você pode definir sistematicamente a senha de um usuário através de um script usando este método:

$ echo -n "$passwd" | passwd "$uname" --stdin

Gerando senhas

Eu gosto de usar a ferramenta de linha de comandopwgenpara gerar senhas.

$ passwd="`pwgen -1cny | sed 's/[\$\!]/%/g'`"

$ pwgen --help
Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]

Options supported by pwgen:
  -c or --capitalize
    Include at least one capital letter in the password
  -A or --no-capitalize
    Don't include capital letters in the password
  -n or --numerals
    Include at least one number in the password
  -0 or --no-numerals
    Don't include numbers in the password
  -y or --symbols
    Include at least one special symbol in the password
  -s or --secure
    Generate completely random passwords
  -B or --ambiguous
    Don't include ambiguous characters in the password
  -h or --help
    Print a help message
  -H or --sha1=path/to/file[#seed]
    Use sha1 hash of given file as a (not so) random generator
  -C
    Print the generated passwords in columns
  -1
    Don't print the generated passwords in columns
  -v or --no-vowels
    Do not use any vowels so as to avoid accidental nasty words

Mas isso não é inseguro?

A senha está sendo passada via STDIN para passwdque, embora seja possível alguém espionar os processos via ps, mesmo que isso não permita que um usuário veja os processos do root, a entrega da senha passwdé bloqueada.

Exemplo

Digamos que eu execute este comando em um terminal como root:

$ ( sleep 10; echo "supersecret" | passwd "samtest" --stdin ) &
[1] 13989

Eu então corro psem outro terminal:

$ ps -AOcmd | grep pass
14046 passwd samtest --stdin      R pts/11   00:00:00 passwd samtest --stdin

Após a alteração da senha no 1º terminal:

[root@greeneggs ~]# Changing password for user samtest.
passwd: all authentication tokens updated successfully.

E o eco para passwd?

Mesmo isso não vaza a senha. Aqui está outro teste demonstrando isso. Primeiro iniciamos este comando em um terminal secundário. Isso coletará a saída de ps.

$ while [ 1 ]; do ps -eaf2>&1 | grep -E "echo|pass";done | tee ps.txt

Em seguida, executamos nosso comando de configuração de senha:

$ echo "supersecret" | passwd "samtest" --stdin &
[1] 20055
$ Changing password for user samtest.
passwd: all authentication tokens updated successfully.

[1]+  Done                    echo "supersecret" | passwd "samtest" --stdin

Verificar o conteúdo de ps.txtmostra que a senha não vazou:

$ grep supersecret ps.txt
$

Alterar o pscomando que usamos ps -eaftambém não vaza.

Responder3

passwd --helpna minha caixa indica que rootposso executá-lo --stdinpara alimentá-lo com a nova senha no stdin.

Responder4

O comando chpasswd lê uma lista de pares de nome de usuário/senha na linha de comando para atualizar um grupo de usuários existentes. Cada linha está no formato

user_name:password

Este comando destina-se a ser usado em ambientes de sistemas grandes onde muitas contas são criadas ao mesmo tempo. Para ler sobre mais opções deste comando, digite

man chpasswd

informação relacionada