Bir kullanıcının parolasını değiştirmek için shell_exec ('passwd') kullanılarak

9 Cevap php

I need to be able to change the users' password through a web page (in a controlled environment). So, for that, I'm using this code:

<?php
$output = shell_exec("sudo -u dummy passwd testUser testUserPassword");
$output2 = shell_exec("dummyPassword");
echo $output;
echo $output2;
echo "done";
?>

My problem is that this script is not changing the password for the user "testUser". What am I doing wrong?

Teşekkürler

9 Cevap

Başka bir seçenek bir kabuk, bu gibi görünüyor passwd_change.sh yere denir söylüyorlar sahip olmaktır:

#!/usr/bin/expect -f
set username [lindex $argv 0]
set password [lindex $argv 1]

spawn passwd $username
expect "(current) UNIX password: " 
send "$password\r"
expect "Enter new UNIX password: "
send "$password\r"
expect "Retype new UNIX password: "
send "$password\r"
expect eof

Daha sonra php kodu yapmak:

<?php
shell_exec("sudo -u root /path/to/passwd_change.sh testUser testUserPass");
?>

proc_open, sen sürecin stdin ile etkileşim sağlayacak hangi kullanın.

Kılavuzuna özellikle Yorumu bakınız: http://www.php.net/manual/en/function.proc-open.php#58044

Ben nasıl bunu düzeltmek için size PHP yeterince aşina değilim, ama senin sorunun iki shell_exec komutları tamamen ayrı olmasıdır. Eğer ilk birine boru girişine ikinci komutu kullanmaya çalıştığınız gibi görünür, ama bu mümkün değil. Ilk komut bunu biz muhtemelen başarısız bekleyebilirsiniz programı dummyPassword, çalıştırmayı dener ikinci bir çalıştırdığınızda, yürüttü işlemi kadar sonra vermemelidir.

Chpasswd kullanın:

$tmpfname = tempnam('/tmp/', 'chpasswd');
$handle = fopen($tmpfname, "w");
fwrite($handle, "$username:".crypt($password)."\n");
fclose($handle);
shell_exec("sudo sh -c \"chpasswd -e < $tmpfname\"");

Dikkat! Biri $ username kontrol alırsınız eğer o zaman bir sistem üzerinde herhangi bir şifre değiştirebilirsiniz.

İlk tepkisi doğru. Muhtemelen () veya bir boru dönecektir diğer bazı fonksiyon, bir dosya fopen () veya dosya () ile açılmış gibi yazabilirsiniz hangi popen kullanmak istiyorum.

<?php
$pipe = popen("sudo -u dummy passwd testUser testUserPassword", 'r');
fwrite($pipe, "dummyPasswd\r\n");
pclose($pipe);
echo "done";
?>

Bunu test değil, ama sizin için olacak gibi görünüyor ne genel bir fikir. Bu kurulum size idam komutları çıkış için temin etmediğini fark edeceksiniz. Bunun için, çalışmak için biraz daha zordur ancak çift yönlü destek sağlar (ki) proc_open kullanmanız gerekir.

Sen şifresini şifrelemek için crypt() işlevini kullanmanız gerekir. Sonra bu gibi usermod programı çağırabilirsiniz usermod --password username encryptedpassword.

Bir UNIX giriş şifresini şifrelemek için en yaygın yolu bu gibi:

crypt ('şifre', '$ 1 $ salt1234 $')

(Where salt1234 sekiz harf tuzu)

Ben bu yol çok geç ama bu insanlar hala cevap arıyor içindir. Bu bizim ne kullanın. Son derece basit.

    file_put_contents("passd", "$pass\n$pass\n");
    echo "$uname: $pass\n";
    `passwd $uname --stdin < passd`;
    `rm -rf passd`;

Çalışan bir Biliyorum kolay ve hangi (en az Debian 4.0r5 için) olan:

#!/bin/bash

USER="root"
NEWPASS="bullsheit123"

echo $USER:$NEWPASS | chpasswd
echo $?

Sadece php komut dosyası için bu uyum ve gayet iyi çalışması gerekir.