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 comandopwgen
para 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 passwd
que, 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 ps
em 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.txt
mostra que a senha não vazou:
$ grep supersecret ps.txt
$
Alterar o ps
comando que usamos ps -eaf
também não vaza.
Responder3
passwd --help
na minha caixa indica que root
posso executá-lo --stdin
para 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