Adiciona-Altera senhas/usuarios no sistema
Publicado por Carlos Carvalho 28/07/2004
[ Hits: 7.892 ]
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.
#!/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
script para localizar conteudo de arquivo
Listar arquivos de um diretório.
Inserindo sites em Lista do Squid
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
[Resolvido] VirtualBox can't enable the AMD-V extension
Como verificar a saúde dos discos no Linux
Como instalar , particionar, formatar e montar um HD adicional no Linux?
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Não consigo instalar distro antiga no virtualbox nem direto no hd (14)
Quais os códigos mais dificeis que vcs sabem fazer? (12)
systemd-resol... precisa ser reiniciado periodicamente [RESOLVIDO] (7)









