execução fantoche de um script python em que o comando os.system (…) não está funcionando

4

Estou tentando gerenciar usuários do Unix com fantoches. O Puppet fornece ferramentas suficientes para criar contas e fornecer arquivos authorized_keys, por exemplo, mas não para configurar a senha do usuário e informar ao usuário.

O que eu fiz é um script python que gera uma senha aleatória e a envia para o usuário por email. O problema é que não é possível iniciar o comando passwd Unix com python, então eu escrevi um script bash com o comando:

echo -ne "$password\n$password\n" | passwd $user
passwd -e $user

Lançado manualmente, o script funciona bem e o usuário criado tem sua senha enviada por e-mail. Mas quando o fantoche o inicia, apenas o script python é executado, como se o os.system ('/ bin / bash my_bash_script') fosse ignorado. Nenhum erro é exibido. E o usuário obtém sua senha, mas os comandos passwd não são iniciados.

Existe alguma limitação com o fantoche impedindo a realização do que descrevi? Ou, como eu poderia mudar a conta do usuário, sua expiração e enviar a senha por e-mail?

Eu posso fornecer mais informações, mas, no momento, não sei quais são precisas.

Muito obrigado!

EDIT: aqui está um código básico com os mesmos sintomas:

python: setuserpassword.py

#!/usr/bin/python
import os
import sys

user = sys.argv[1]
mail = sys.argv[2]
os.system('/bin/bash /root/tools/setuserpassword.sh '+user+' '+mail)

bash: setuserpassword.sh

#!/bin/bash
# Password setup for the account
password='pwgen -N1 --secure 10'
echo -ne "$password\n$password\n" | passwd $USER > /dev/null 2>&1
[[ $? -ne 0 ]] && exit 2

# Setup the expirancy label to make sure user
# change its password upon fist success login
chage -d0 $USER

# Email sending to inform user of his new password
echo -ne "Hello, $USER;\n
The password is:\n
$password\n" | mail -s "$USER account created" $MAIL

Aqui está o módulo (não há problema deste lado)

define add_user ( $email, $uid, $gid ) { 

$username = $title

user { $username:
  comment => "$email",
  home    => "/home/$username",
  shell   => "/bin/bash",
  uid     => $uid,
  gid     => $gid,
}   

exec { "/root/tools/setuserpassword.py $username $email":
   path           => "/bin:/usr/bin:/usr/sbin/sbin",
   refreshonly    => true,
   subscribe      => user[$username],
   onlyif         => "cat /etc/shadow | grep $username | grep '!'",
   require        => Package['pwgen'],
}   
    
por philippe 09.09.2012 / 11:11

2 respostas

3

Não é necessário usar um script bash, apenas use a próxima função que estou usando para algumas outras coisas para gerar a senha criptografada shadow:

 def shadow(self,password):
  SomeZolt="$6$"+''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(9))+"$"
  return crypt.crypt(password, SomeZolt)

Depois disso, escreva uma funcionalidade adicional ao seu script python, que abrirá o arquivo / etc / shadow e escreverá a senha criptografada que você obteve usando esta função para este usuário, assim fazendo uma linha como:

some_user:!!:15579:0:99999:7:::

assemelhar-se a:

some_user:$1$JShdquwdjsd38hSJhdqwdkwd:15579:0:99999:7:::

Assim, some_user terá a senha atribuída.
Além disso, você pode definir o usuário diretamente na declaração de fantoches, alterando-o para:

user { $username:
  comment => "$email",
  home    => "/home/$username",
  shell   => "/bin/bash",
  uid     => $uid,
  gid     => $gid,
  password => "SomeAlreadyEncryptedPassword",
}   

Você pode usar a maneira especificada da função para obter a senha criptografada e, em seguida, inseri-la na declaração.

    
por 09.09.2012 / 15:02
1

Obrigado pela sua resposta, eu segui o seu conselho e codifiquei um def para gerar o hash da senha e colocá-lo no arquivo / etc / shadow.

Aqui está o script que eu escrevi se alguém pode estar interessado em:

class Unix_Account:

 def __init__(self, user):
    self.user      = user
    self.password  = ''.join(
       random.choice(
          string.ascii_uppercase + string.ascii_lowercase + string.digits
       ) for x in range(password_length)
    )
    self.salt      = '$6$'+''.join(
       random.choice(string.ascii_uppercase + string.digits
    ) for x in range(9))+'$'
    self.line      = self.user+':'+crypt.crypt(self.password, self.salt)+':0:0:99999:7:::'

 def change_password(self):
    self.result = re.sub(self.user+".*", self.line, file('/etc/shadow', 'r').read())
    file('/etc/shadow', 'w').write(self.result)

Em seguida, outra turma envia a senha para o usuário.

A data de expiração da senha é definida como 0 para que o usuário seja forçado a alterá-la na primeira conexão.

A conexão é feita pelo SSH, a chave apropriada deve ser usada para configurar a senha. A senha é usada para o comando sudo.

Obrigado novamente!

    
por 12.09.2012 / 10:08