Definir password utilizador Samba sem usar ROOT

Iniciado por beira, 02 de Dezembro de 2010, 21:22

tópico anterior - próximo tópico

beira

Boas pessoal!

Estou a utilizar o firefox que através de umas páginas em PHP ligam á linha de comandos e administram o Ubuntu!
Gostaria de saber se alguem tem alguma ideia como dar a volta a isto:

Ponto 1)
Consigo sem entrar em modo ROOT executar comandos de administração no Ubuntu como por exemplo:

user@computer:/$ echo <password root> | sudo -S /etc/init.ddhcpd3-server restart

Isto funciona porque utilizo o echo com a password e depois | comando...

*************************************************************************

No ponto 1.) resulta porque uso só um echo, mas quando pedem vários não me safo!

Exemplo:
Na linha de comandos do linux com privilegios de root ao escrever:
root@computer:/#smbpasswd -a <utilizador>

ele apresenta:
New SMB password: <password samba>

e depois pede novamente a password:
Retype New SMB password: <password samba>

Com esta operação definimos a password do utilizador samba!

Agora a dúvida é a seguinte, sem entrar em modo ROOT como fazemos esta operação????
Já testei várias formas com utilizando o | mas não dá!

Aceito opiniões e soluções!

Agradecido pela atenção!

zekkerj

Olá beira,

Poderia jurar que o "sudo" não funcionaria em scripts fora do terminal. Interessante.

Você seria capaz de escrever um pedaço de código pra gerar quatro linhas distintas na saída? Pq é o que você precisaria, pra executar um comando pra trocar a senha de outro usuário, no samba, ou seja, um "sudo -k -S -- smbpasswd -s usuario". Este comando vai receber quatro linhas de texto, a saber:
- senha do sudo;
- senha antiga do usuário;
- nova senha do usuário;
- novamente a nova senha do usuário.

As opções que eu estou usando são "-k", "-S" e "--". O manual online do sudo pode explicá-las.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

beira

zekkerj,

O "sudo" é injectado na shell através de páginas PHP simples e funciona perfeito!
Basta editar o "sudoers" para o utilizador "www-data" e utilizar as funções system, exec e passthrue. O resultado originado na shell é apresentado no Firefox.

A dificuldade é:

  • entrar na shell e assumir privilégios de root
  • combinar e executar os comandos todos numa linha
  • não ser capaz de continuar operações com informação vinda da shell

exemplo do código php:
$comando2="echo ".$_SESSION[passlogin]." | sudo -S chmod 644 /etc/squid/lista";
system($comando2,$msg2);

Tive a testar um pouco da sua filosofia de comandos e não a consigo inserir na função para o smbpasswd!

Agradecido


zekkerj

Vc viu a função dos parâmetros "-k" e "--" do sudo? Eles vão ser necessários pra (1) garantir que o sudo sempre te peça a senha (simplificando tua programação); e (2) encerrar os parâmetros do sudo, deixando todos os parâmetros daí pra frente pro comando.

Já no comando "smbpasswd", o que vc precisa é do parâmetro "-s", segundo o manual ele faz com que o smbpasswd leia as senhas da stdin.

Enviar as quatro senhas, vc pode tentar fazer algo assim:

echo -e "senha-sudo\nsenha-antiga\nsenha-nova\nsenha-nova\n"

O lance então é experimentar.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

beira

Sim, já vi os parâmetros mas com algumas dúvidas no "-k", pois acho que só irei precisar dele se utilizar o sudo mais que uma vez...  ???

A sua observação está muito boa, aliás, excelente e já consegui funcionar com multiplas inserções de password  :)
Apenas me falta resolver a execução em modo de usuário normal:

fazendo -> # echo -e "senhasudo\nsenha-nova\nsenha-nova\n" | sudo -S smbpasswd -s <usuário>
funciona na perfeição!!!

mas fazendo -> $ echo -e "senha-sudo\nsenha-nova\nsenha-nova\n" | sudo -S smbpasswd -s <usuário>
ocorre o problema:
Mismatch - password unchanged.
Unable to get new password.


Estou a verificar onde é k falha as comparações na alteração da senha, campos diferentes de certeza, mas não vejo como...

abraço

zekkerj

não esqueça do "--" pro sudo, senão ele pode achar que o segundo "-s" é dele:

Outra coisa, vc tem que enviar 4 linhas, não 3. Ficaria assim (vou usar cores pra melhorar a visualização)

$ echo -e "senha-sudo\nsenha-antiga\nsenha-nova\nsenha-nova" | sudo -S -- smbpasswd -s <usuario>

Aí vc pergunta, pq funcionou assim com o root, mas não funcionou com o usuário? Pq o smbpasswd não pede a senha antiga ao root...
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

beira

#6
já tinha testado com 3 e 4 linhas para contornar esse mm problema que está falando!

Testei
$ echo -e "senha-sudo\nsenha-antiga\nsenha-nova\nsenha-nova" | sudo -S -- smbpasswd -s <usuario>

$ echo -e "senha-sudo\nsenha-nova\nsenha-nova" | sudo -S -- smbpasswd -s <usuario>

e o estranho é que no 2º caso não inserindo a senha-sudo, o comando funciona, e consigo logar o usuário samba no dominio com a nova palavra-passe definida!!!
o pior é que depois de fazer isto, o mm comando já não volta mais a funcionar, nem com 3 nem com 4 linhas... só reiniciando o servidor mm... volta a funcionar uma vez e dp nunca mais até reiniciar o servidor ou esperar mais de 20 ou 30min (não sei precisar tempo)...

testei sem o utilizador samba estar logado, reiniciei o serviço samba e nada!!!
suponho que tenha fazer um flush em qq sitio ou reiniciar qq serviço adicional  ??? ??? ???


agradecido zekkerj a sua ajuda vale ouro!!!

zekkerj

Citare o estranho é que no 2º caso não inserindo a senha-sudo, o comando funciona
Lembra quando eu falei do parâmetro "-k", pra perguntar sempre pela senha do sudo?
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

beira

Olá Zekkerj!

Segui todas as suas ajudas, li montes de vezes o manual online do sudo e mais uma data de ajudas, mas ainda não consegui resolver...

Após uma data de tentativas, acerca do "-k", não estou a ver onde poderá ser inserido!

$ echo -e "senha-sudo\nsenha-nova\nsenha-nova" | sudo -S -- smbpasswd -s <usuario>

Segundo a lógica do comando que estamos a analisar, a opção "--" devia parar o processamento de argumentos para o sudo, e deixar apenas o bloco "smbpasswd -s <usuário>" para processar. O problema que destaco aqui é que o -s do smbpasswd irá buscar todas as linhas do echo, e como a 1º contem sempre a password do sudo, na comparação ele falha sempre, dando o erro
Mismatch - password unchanged.
Unable to get new password.




Agradecido pela atenção!

zekkerj

#9
Vc pode colocar o "-k" em qualquer lugar depois do "sudo" e antes do "--".

EDIT: Outra idéia é que o "-k" não precisa ficar no mesmo comando. Vc pode executar o sudo, só com o "-k", logo antes do comando.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

beira

posicionando "-k" em qq posição que referiu não funciona, dando apenas a ajuda acerca do comando sudo...

fazendo:
$ echo -e "senha-sudo\nsenha-nova\nsenha-nova" | sudo -S -- smbpasswd -s <usuario>
o comando funciona apenas uma vez, dado o tal erro de mismatch sempre que volto a executar, mas se digito:
$ echo -e "senha-nova\nsenha-nova" | sudo smbpasswd -s <usuario>
o comando funciona bem...

pelo que entendo a password de root fica em cache durante 15 minutos, pelo que passado este tempo o 1º comando volta a funcionar... e o segundo volta a pedir a password de root... estranho, muiiiiiiiiiiiiiito estranho... pois não era para fazer isto porque estou como utilizador normal ($ e não #)...

comandos testados:
$ echo -e "senha-sudo\nsenha-nova\nsenha-nova" | sudo -S -k -- smbpasswd -s <usuario>
$ echo -e "senha-sudo\nsenha-nova\nsenha-nova" | sudo -k -S -- smbpasswd -s <usuario>
$ echo -e "senha-sudo\nsenha-nova\nsenha-nova" | sudo -Sk -- smbpasswd -s <usuario>... e mais uma data deles...

tou sem soluções, e com uma data de horas perdidas nisto...   >:(

agradecido

irtigor

É engraçado que eu sou outro que juraria que isso não funciona, como o zekkerj disse na primeira mensagem... estava crente que a única saída era algo como o expect (quinto exemplo):
http://www.thegeekstuff.com/2010/10/expect-examples/

zekkerj

beira, execute um "sudo -k" logo antes do comando. Isso vai forçar o próximo "sudo" a pedir a senha. Teste no terminal, pra ver o efeito.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

beira

#13
irtigor, o script no quinto exemplo que fala recebe apenas uma password, a solução que preciso recebe várias... e a ideia é uma página web receber três campos (usuário/password/grupo), e ao fazer um POST executar 1º um comando de criação de usuário e 2º a definição da passwd samba do ususário. aqui uso 2 vezes a função system em PHP...

o comando desta forma na linha de comandos funciona:

$ sudo -k | echo -e "senha-sudo\nsenha-nova\nsenha-nova" | sudo -S -- smbpasswd -s <usuario>

tal como o zekkerj sugere com o sudo -k para forçar a pedir sempre a pass de root.


Dos testes 75% das vezes funciona, dando algumas vezes "Mismatch - password unchanged. // Unable to get new password."
Reparei ainda que no espaço de 15 min após inserir este comando, não é necessário fazer a validação de root para executar!

Este comando tem alguma instabilidade, e quando o executo a partir do firefox através de php com a função system, ele simplesmente dá sucesso mas não realiza a operação pretendida! ainda vou continuar a melhorar isto...

irtigor

Citação de: beira online 23 de Dezembro de 2010, 09:25
irtigor, o script no quinto exemplo que fala recebe apenas uma password, a solução que preciso recebe várias...
É claro, você mesmo disse tudo... aquilo é um exemplo, não o seu aplicativo.