Adiciona-Altera senhas/usuarios no sistema

Publicado por Carlos Carvalho 28/07/2004

[ Hits: 7.589 ]

Download altera_tudo.pl




Me inspirei no script do Fabio para alterar senhas do arquivo /etc/shadow, adaptei , alterei e acrescentei diversas funcionalidades para facilitar a vida de um cliente.
Script bastante direcionado a um cliente, espero que possa lhe ser util.

  



Esconder código-fonte

#!/usr/bin/perl
# Script de  alteracao de senhas idealizado por Fabio de Paula (www.vivaolinux.com.br)
# que adaptei as minhas necessidades.
# Preservei as rotinas de alteracao no /etc/shadow e algumas checagens de erro.
# Originalmente o script pede por login e senha e altera no /etc/shadow,
# acrescentei a isso a inclusao do nome do usuario em um arquivo texto, os usuarios
# sao criados no formato nome+numero ex: fulano0935271. Eu preciso do final
# numerico desse nome de usuario, entao criei outra rotina com tr para isso.
# Serve para o operador poder adicionar usuarios que realizam uma
# tarefa especifica no servidor sem necessidade da intervencao do administrador.
#
# Autor: Fabio de Paula - HomePage <marsterdev.com.br>
# Modificado por Carlos Carvalho - E-Mail <h4sh@globo.com>
use strict;

#Variaveis:
my $DIR_lb_rem="/home/remessas/lb_rem";
my $FILE_log="/var/log/FTP_ADDUSER.log";
my $FILE_PASSWD_TMP="/tmp/passwd.tmp";


#Funcao de teste de read-write em arquivos necessarios:
sub TESTE_FILES () {
#Append...
if (my $TEST = open (FILE, ">>$DIR_lb_rem") == 0) {
        print "Erro ao abrir $DIR_lb_rem, verifique as permissoes.\n";
        exit(1);
        }
#Append...
if (my $LOGGING = open (FILE_LOG, ">>$FILE_log") == 0) {
        print "Erro ao abrir $FILE_log, virifique as permissoes.\n";
        exit(1);
        }
#Append...
if (my $PASSWD_TMP_TEST = open(FILE_PASSWD_TMP, ">>/tmp/passwd.tmp") == 0) {
        print "Erro ao abrir $FILE_PASSWD_TMP, virifique as permissoes.\n";
        exit(1);
        }
#Leitura...
if (my $PASSWD_TEST = open(FILE_PASSWD, "</etc/passwd") == 0) {
        print "Erro ao abrir /etc/passwd, virifique as permissoes.\n";
        exit(1);
        }
}
&TESTE_FILES ;

#Inicio do trecho de autoria do Fabio,
#com inclusoes minhas tambem, que cria e a altera usuarios.
#Rotina alterada por mim com inclusao de apenas
#algumas linhas de minha autoria:
my $login = shift;
my $senha = shift;

my $LOGIN_lb_rem=$login;
$LOGIN_lb_rem =~ tr/0-9//cd;
if ($LOGIN_lb_rem eq "") {
        print "Erro no nome de usuario!\n";
        print "Use o formato nome+numero. Ex: lab001\n";
        print "Pressione ENTER\n";
        my $nada = <STDIN>;
        exit(1);
        }
if (!$login || !$senha) {
  print "Informe login/senha !\nUse $0 login senha\n\n";
  exit(1);
}

my $user_existe = `/usr/bin/id $login`;
if ($? != 0) {
system("/usr/sbin/adduser $login >/dev/null 2>&1");
} else {
        print "Usuario $login ja existe no sistema!\n";
        print "Deseja continuar? (S/n)?\n";
        my $continua = <STDIN>;
        chop $continua;
                sub saindo () {
                                print "Saindo do programa...\n";
                                sleep(3);
                                exit(0);
               }
                "$continua" eq "S" or &saindo ;
        }
my $passwd = "/etc/shadow";
my $saida = `grep $login $passwd`;
if ($saida !~ /[A-Z]/i) {
        print "Usuario inexistente !\n";
        exit(1);
}

my $shadow = "";
open(R,$passwd);
while (<R>) {
  if ( $_ =~ /^$login:/ ) {
    my ($user,$pass,$resto) = split(/:/,$saida,3);
    my $newpass = crypt($senha,substr $user,0,2);
    print "crypt($senha," . substr $user,0,2 . ")\n";
    $shadow .= $user . ':' . $newpass . ':' . $resto;
  } else {
    $shadow .= $_;
  }
} # fim while
close(R);

open(W,"> $passwd");
print W $shadow;
close(W);
#Fim da rotina de autoria do Fabio.

#Insere informacoes em arquivo:
print(FILE "$LOGIN_lb_rem|$senha\n");
close(FILE);

# Altera /etc/passwd impedindo login via shell ao user recen-criado:
open(FILE_PASSWD, "</etc/passwd");
open(FILE_PASSWD_TMP, ">passwd.tmp");
while(<FILE_PASSWD>) {
        if ($_ =~ /$login/) {
         $_ =~ s/bash/false/g;
        print(FILE_PASSWD_TMP "$_");
        } else {
                print(FILE_PASSWD_TMP "$_");
        }
}
system("/bin/cat passwd.tmp > /etc/passwd");
unlink("$FILE_PASSWD_TMP");

#Cria log:
print(FILE_LOG "`date` Usuario FTP $login adicionado ao sistema\n");
close(FILE_LOG);
exit(0);
#EOF

Scripts recomendados

Usando ARGV como login

Manipulação de Arquivos Orientada a Objetos

Script para adicionar sites ao Squid

Compilar e mover

Contagem de linhas em Perl (= wc -l)


  

Comentários
[1] Comentário enviado por h4sh em 29/07/2004 - 11:18h

O original do Fabio esta neste link: http://www.vivaolinux.com.br/scripts/verScript.php?codigo=76

[2] Comentário enviado por fabio em 29/07/2004 - 13:40h

Carlos,

Muito bom seu algoritmo! Esse é o espírito do software livre, um serve de base para a evolução do outro.

Parabéns!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts