Cadastrando usuários no Linux e Samba via PHP

Neste artigo mostrarei como utilizar dos recursos do PHP para cadastrar usuários no Linux e no Samba. Isso é útil porque nos permite cadastrar usuários no sistema a partir de sua intranet ou até mesmo via internet.

[ Hits: 66.882 ]

Por: Eduardo Assis em 01/12/2003 | Blog: http://www.proredes.com.br


Formulários e scripts



Antes de tudo, tenho que alterar o arquivo /etc/sudoers para permitir que o usuário www tenha permissão para executar os comandos de manipulação de usuários.

Altere as permissões do /etc/sudoers para 600 (chmod 600 /etc/sudoers) e adicione a seguinte linha:

www ALL=NOPASSWD: useradd smbpasswd userdel

Salve, saia e restaure a permissão deste arquivo para 440:

# chmod 440 /etc/sudoers

Pronto, agora podemos continuar.

Mostrarei todos os scripts, bastando apenas que vocês alterem-os de acordo com o que irão usar.

Conexão com o banco de dados:

// banco.php
<?

$host = "localhost";
$user = "user";
$senha = "senha";
$banco = "banco";

$conexao = mysql_connect($host,$user,$senha) or die("Não Conectado ao MySQL");
mysql_select_db($banco, $conexao) or die("Banco de Dados não selecionado");
?>

Página principal:

// index.php

<html>
<head>
  <title>
    Compsul - Administração by Eduardo Assis
  </title>
</head>
<body>

<table width="100%" border="0" cellspacing="0" cellpadding="0" height="100%">
<tr><td align="center" valign="middle">
<table width="500" border="0" cellspacing="0" cellpadding="0" align="center">
<tr><td> </td></tr>

<tr>
  <td><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color=red><b> Administração by tucs </b></font></td>
</tr>

<tr><td bgcolor="#0000f2" height="2"></td></tr>

<tr><td> </td></tr>

<tr><td>
<div align="center">
<form action=validacao.php method=post>
<font size="2" face="Verdana, Arial, Helvetica, sans-serif"> Nome: <input type="text" name="nome" size="15" style="font-family: Courier New; border-style: dotted; border-color: #666666" maxlength="16"> Senha: <input type="password" name="senha" size="10" style="font-family: Courier New; border-style: dotted; border-color: #666666" maxlength="16">  <input type="submit" value="Cadastrar" style="border-style: double"><br>
</font>
</form>
</div>
</td></tr>

<tr><td bgcolor="#0000f2" height="2"></td></tr>

<tr><td> </td></tr>
</table>
</td></tr>
</table>
</body>
</html>

Script para validar se o usuário já existe ou não:

// validacao.php
<?
session_start();
$usuario="";

$conexao = mysql_connect("localhost", "user", "senha");
mysql_select_db("banco", $conexao);

$consultar_login = "SELECT * FROM usuarios WHERE nome='$nome' AND senha='$senha'";
$resultado = mysql_query($consultar_login, $conexao) or die (mysql_error());

while($campo = mysql_fetch_array($resultado)) {
   $usuario = $campo["nome"];
   $nivel = $campo["nivel"];
}

session_register("usuario");
session_register("nivel");

mysql_close($conexao);

if ($usuario=="") {
   $autorizado = "nao";
   session_register("autorizado");
   header("Location: index.php");
} else {
   $autorizado = "sim";
   session_register("autorizado");
   header("Location: entrada.php");
}
?>

Página de entrada:

// entrada.php

<html>
<head>
   <title>
       Compsul - Administração by tucs
   </title>
<STYLE type=text/css>
A:link { text-decoration: none}
A:visited { text-decoration: none}
</STYLE>
</head>

<body>
<center><font face=arial size=5 color=red> Administração by tucs </font></center>
<br>
<h2 align=right><font color="#0000f2" face=arial> OLA </font></h2>
<hr width=400 align=right>
<br><br><br><br>
<a href=cadastro.php> Cadastro de Aluno </a>
<br><br>
<a href=consulta.php> Consulta de Aluno </a>
</body>
</html>

Formulário de cadastro:

// cadastro.php

<html>
<head>
   <title> Administração by tucs</title>
<STYLE type=text/css>
A:link { text-decoration: none}
A:visited { text-decoration: none}
</STYLE>
</head>

<body>
<center><font face=arial size=5 color=red> Administração Compsul </font></center>
<br>
<h2 align=right><font color="#0000f2" face=arial> Compsul </font></h2>

<hr width=400 align=right noshade>
<br><br><br><br>

<form method=post action=cadastrado.php>
<table width=50% border=0>
<tr>
  <td>
     Nome Completo:
  </td>
  <td>
     <input type="text" name="nome" size="40" style="font-family: Courier New; border-style: dotted; border-color: #666666" maxlength="50">
  </td>
</tr>

<tr>
  <td>
     Login de Acesso:
  </td>

  <td>
     <input type="text" name="login" size="20" style="font-family: Courier New; border-style: dotted; border-color: #666666" maxlength="50">
  </td>
</tr>

<tr>
  <td>
     Senha de Acesso:
  </td>

  <td>
     <input type="password" name="password" size="15" style="font-family: Courier New; border-style: dotted; border-color: #666666" maxlength="50">
  </td>
</tr>
</table>

<br>
<table width=30% border=0>
<tr>
   <td>
      <input type="submit" value="Cadastrar" style="border-style: double">
   </td>

   <td>
      <input type="reset" value="Limpar" style="border-style: double">
   </td>
</tr>
</table>
<br><br><br><br>
<a href=entrada.php> Voltar </a>
</body>
</html>

Script para o cadastro em si:

// cadastrado.php

<html>
<head>
   <title>
      Administração by tucs
   </title>
<STYLE type=text/css>
A:link { text-decoration: none}
A:visited { text-decoration: none}
</STYLE>
</head>

<body>
<center><font face=arial size=5 color=red> Administração Compsul </font></center>
<br>
<h2 align=right><font color="#0000f2" face=arial> Compsul </font></h2>
<hr width=400 align=right>
<?

  $consulta = "SELECT * FROM alunos WHERE login='$login'";
  $resultado = mysql_query($consulta, $conexao);
  while ($campo = mysql_fetch_row($resultado)) {
     $login_consulta = $campo[2] ;
  }

  if ($login==$login_consulta) {
     echo "<br><br><br><br>";
     echo " <font color=red size=3>Login já Cadastrado, favor tentar outro login. </font>";
   } else {
     $incluir = "insert into alunos (id,nome,login,senha) values('','$nome','$login','$password')";
     mysql_query ($incluir, $conexao) or die (mysql_error());

     $adduser = "sudo useradd -g users -d /home/${login} -m -s /bin/bash ${login} |echo ${login}:${password} |chpasswd";
     $comando = shell_exec($adduser);

     $addsmb = "sudo smbpasswd -a $login $password";
     $comando1 = shell_exec($addsmb);

     echo "<br><br><br><br>";
     echo "Cadastro efetuado com Sucesso !!!";
     echo "<br><br><br><br>";
  }
?>
<br><br><br><br>
<a href=cadastro.php> Voltar </a>
</body>
</html>
Página anterior     Próxima página

Páginas do artigo
   1. Entendendo
   2. Criação do banco de dados
   3. Formulários e scripts
   4. Algumas explicações
Outros artigos deste autor

Simulando o SSH via WEB

Explorando o NFS do mrluk

Autenticando usuários Windows no Linux (PDC)

Configurando um servidor de e-mail para pequenas redes

Montando um Servidor de FTP

Leitura recomendada

Sistema de notícias em PHP

Método de Newton e PHP

Instalações PHP não seguras

Enviando email em formato HTML em PHP

Instalando Lamp Stack no Servidor Debian

  
Comentários
[1] Comentário enviado por gustavo_marcon em 01/12/2003 - 15:26h

Eu fiz tudo isso mas o meu problema tá c/ o sudo.

Quando coloco permissões pro user www ele começa dar erro e não funciona.
O que será que pode ser?

[2] Comentário enviado por tucs em 01/12/2003 - 17:52h

Vamos por partes ...

que problemas esta aparecendo ...

Tente alterar essa linha

www ALL=NOPASSWD: useradd smbpasswd userdel

para

www ALL=NOPASSWD: ALL

Lembrando que issu naum eh legal fazer, pois vc estaria dando permissao root para o user www

Abracos

tucs

[3] Comentário enviado por hackwiz em 01/12/2003 - 19:21h

só uma palavrinha:

Parabéns!

[4] Comentário enviado por gustavo_marcon em 01/12/2003 - 19:40h

Tucs, eu tentei mas não dá certo nem assim...

O erro que dá diz que a linha 17 tem erros, mas ela está certa pois eu só copiei e colei do seu artigo.. Já tentei até desinstalar e reinstalar o sudo.

[5] Comentário enviado por tucs em 02/12/2003 - 09:13h

hackwiz, Obrigado pelo icentivo, mas na verdade todos estamos de parabens , pois sem vcs pra que ei e outros iriam postar nosso trabalhos ?
Obrigado pela forca.

gustavo_marcon, que distro vc esta utilizando, apesar de naum ter problemas a naum ser no sudo,

faz assim me mande o seu soduers pra mim dar uma olhada (mail-me)

Abracos

tucs

[6] Comentário enviado por antonioao em 15/01/2004 - 12:39h

Gustavo,

apache ALL(ALL) NOPASSWD: ALL

tive o mesmo problema que o seu e foi resolviso assim (apesar que ALL não é legal).

um abraço a todos :)

[7] Comentário enviado por string em 22/01/2004 - 18:00h

e ae..blz.
Meu apache+php+mysql estao funcionando perfeitamento, porem da dando seguinte erro, ja tentei de tudo, v ai se alguem tem um dica:

// validacao.php
Warning: Cannot send session cache limiter - headers already sent (output started at /var/www/html/cadastro/validacao.php:2) in /var/www/html/cadastro/validacao.php on line 3

Warning: Cannot add header information - headers already sent by (output started at /var/www/html/cadastro/validacao.php:2) in /var/www/html/cadastro/validacao.php on line 25



[8] Comentário enviado por gustavo_marcon em 13/02/2004 - 18:58h

Preciso fazer um script php em que o usuário do apache possa executar as seguintes opções:
adsl-stop, adsl-start, halt e reboot.

Tentei montar a linha do arquivo /etc/sudoers mas em nenhuma delas funcionou.

Como vc acha q essa linha deve ficar p/ esses comandos?

Obrigado.

[9] Comentário enviado por webkiller em 21/06/2004 - 16:56h

Achei muito interessante o script, mas gostaria de saber se existe uma forma mais segura de executá-lo, não posso dar permissão para o apache executar qualquer comando como root.

Como eu faço para dar permissão ao usuário www com acesso local somente ao comando chpasswd? Isso é possível?

[10] Comentário enviado por fhm_online em 27/07/2004 - 08:45h

Olá amigo!

Não estou conseguindo passar adiante do sudo... Dá um erro de sintaxe.
Já verifiquei a ortografia e não encontro erro algum.
O que deve ser?

Obrigado desde já!

[11] Comentário enviado por pr02nl em 18/02/2005 - 23:43h

Sei que estou um pouco atrsado, pois o artigo foi submetido ja ha algum tempo, mais, eu comecei a gerenciar um servidor na faculdade que ja estava com tudo rodando, "samba, php, mysql", e eu realmente tinha essa nessecidade, porém antes de aplicar essa ideia gostaria de saber do autor como eu posso colocar todos os usuarios ja existentes no sistema e no samba no banco de dados automaticamente.
Outra, quero tambem saber como posso fazer para colocar esse sistema de cadastramento para min, Administrador e outro sistema de recadastramento onde o proprio usuario possa entar no site e atualizar seu cadastro, ou seja, ao inicio de um novo semestre o usuario vai ao site e se recadastra, assim ele pode usar sua conta por mais um semestre, caso ele não se recadastre sua conta é bloqueada e depois de outro semestre sem recadastro sua conta é excluida!!

Não sei se minha ideia esta correta mais imaginei colocar mais alguns campos no db e ir incrementando ao final de cada semestre e zerar ao usuario se recadastrar, mais como faco para o proprio sistema incremetar e deletar a conta do usuario quando o campo chegar a dois?

[12] Comentário enviado por netosdr em 03/08/2006 - 16:30h

Caro colega, essa outra parte dos scripts para alteração e exclusão de usuários, podes enviá-la para nós?

Obs: parabéns pelo artigo!

[13] Comentário enviado por alyssoncma em 12/11/2006 - 16:55h

Blz Tucs?

Seguinte, olha o codigo que tenho... (ou melhor seu código..hehe)

//ADD O USUARIO NO LINUX
$adduser = "useradd -g alunos -d /home/$login -m -s /bin/bash $login |echo $login:$senha |chpasswd";
$comando = shell_exec($adduser);

Não estou utilizando o sudo pois vou cadastrar o aluno na maquina que vou estar logado como root.
Uso o ubuntu. Ele cria o usuário certinho. Mais nao cria a senha, quando vo criar um usuario no ubuntu (ou debian), ele pede a senha e uma confirmaçao. Será qe é por isso??? Se eu lterar a senha no usuario. Funciona perfeito, é só logar com o usuario criado.

Sabe como posso resolver???

Valeu Abraços

Obs: parabéns pelo artigo



[14] Comentário enviado por liviocf em 28/06/2007 - 18:58h

Mesmo bem atrasado, gostaria de dizer parabéns pelo artigo!
Sobre esse mesmo tema tenho uma dúvida que parece boba, mas não consigo resolver!
Tenho que executar um comando no servidor! Tenho tudo pronto em php, mas o servidor não executa o comando que estipulo pra ele!
Se faço direto no shell funciona perfeitamente, mas quando executo via shell_exec("/local/comando ....") não funciona! Nem utilizando o sudo, como descrito no seu artigo!
Pra qualquer outro comando ele funciona!
Não sei o que pode ser!!
Se alguém puder me ajudar sobre isso, agradeço muito!!

Abraços

[15] Comentário enviado por xploitx em 09/07/2007 - 11:44h

muito bom esse script. vlw ae estava precisando.

[16] Comentário enviado por quartodazona em 19/08/2010 - 02:42h

A sintaxe correta para dar permissão no sudoers é esta abaixo:

usuario ALL= PASSWD: /usr/bin/apt-get, sbin/shutdown

e não esta:

www ALL=NOPASSWD: useradd smbpasswd userdel

pois você tem que separar os comandos que deseja atribuir ao usuário que irá utilizar sudo sem senha separados por vírgulas e com o caminho completo de onde está o comando.

[17] Comentário enviado por quartodazona em 20/09/2010 - 07:53h


Caro amigo o seu método de criar usuários pelo browser é parecido com outro aqui do Viva o Linux, mas eu já me utilizei dos 2 e continuo tendo tendo problema, sei que já faz tempo este post, porém eu não consigo fazer o Debian 5 criar usuário pelo PHP de forma alguma.

Fiz todos os seus passos.

Criei um usuário apache e o coloquei num grupo específico como você mencionou, mas ele só consegue criar diretórios e arquivos quando eu o executo no php, ou seja, executo uma página em php passando um comando ou mandando executar um script que já faz isso.

Já tentei de várias formas e nada, mas como eu disse acima, se eu quiser criar diretórios ou arquivos usando os comandos abaixo, funciona numa boa:

echo `sudo useradd kibeloco`;

echo `useradd kibeloco`;

echo `sudo sh usernovo.sh`;

exec("sudo sh usernovo.sh");

$last_line = "sudo useradd kibeloco";
$cmd = shell_exec($last_line);

Já o coloquei no arquivo sudoers de várias formas:

- apache ALL=NOPASSWD: useradd smbpasswd userdel chpasswd <-- Este não rola nada destes comandos
- apache ALL=NOPASSWD: ALL <-- Totalmente inseguro este e não funciona o comando useradd
- apache ALL=NOPASSWD: /usr/sbin/useradd, /usr/bin/passwd, /usr/bin/openssl, /bin/false
- apache ALL=(ALL) ALL <-- Totalmente inseguro também, mas não funciona o comando useradd

O que eu descobri foi que se eu crio um usuário no Linux e dou privilégios no arquivo sudoers como fiz acima e executo o comando useradd dentro do Linux, consigo fazer tudo o que o root faz como descrito no arquivo sudoers, porém se eu pego este mesmo usuário e o coloco no grupo do apache como você falou e tento executar o comando useradd, não funciona.

Já revirei a net e não encontrei nada mais interessante que este e outro post aqui no Viva o Linux. Preciso implementar uma solução em uma determinada empresa e só preciso executar o comando useradd via browser para que este sufoco termine.

Alguém aí pode me ajudar?

[18] Comentário enviado por vinny.freire em 20/09/2011 - 16:18h

shell_exec("useradd -g ".$chefe." -d /digitacao/".$nome." -m -s /bin/bash ".$nome." |echo ".$nome.":".$senha);
shell_exec("smbpasswd -a ".$nome." | (echo ".$senha.")");
shell_exec("mkdir /digitacao/".$nome);
shell_exec("chmod -R 777 /digitacao/".$nome);
shell_exec("chown ".$nome." /digitacao/".$nome);
shell_exec("chgrp ".$chefe." /digitacao/".$nome);

Amigo fiz esse codigo acima!

Porem ainda continuo não conseguindo acessar, creio que o erro esta na segunda linha!
To fazendo algo errado?

Sou principiante!!!


Obrigado!

[19] Comentário enviado por joserf em 28/11/2013 - 22:14h

Amigo posta pra gente a parte de excluir o usuário e alterar senha, obrigado pela contribuição com seu artigo e 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