php - saber - Usar shell_exec(''passwd'') para cambiar la contraseña de un usuario
listar usuarios linux consola (9)
No estoy lo suficientemente familiarizado con PHP para decirte cómo solucionarlo, pero tu problema es que los dos comandos shell_exec
están completamente separados. Parece como si estuvieras tratando de usar el segundo comando para canalizar la entrada al primero, pero eso no es posible. El primer comando no debe regresar hasta que se haya ejecutado ese proceso, cuando ejecute el segundo, intentará ejecutar el programa dummyPassword
, del cual probablemente podamos esperar fallar.
Necesito poder cambiar la contraseña de los usuarios a través de una página web (en un entorno controlado). Entonces, para eso, estoy usando este código:
<?php
$output = shell_exec("sudo -u dummy passwd testUser testUserPassword");
$output2 = shell_exec("dummyPassword");
echo $output;
echo $output2;
echo "done";
?>
Mi problema es que este script no cambia la contraseña del usuario "testUser". ¿Qué estoy haciendo mal?
Gracias
Otra opción es tener un script de shell, digamos llamado passwd_change.sh en alguna parte que se vea así:
#!/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
Luego, en tu código php haz:
<?php
shell_exec("sudo -u root /path/to/passwd_change.sh testUser testUserPass");
?>
Use chpasswd:
$tmpfname = tempnam(''/tmp/'', ''chpasswd'');
$handle = fopen($tmpfname, "w");
fwrite($handle, "$username:".crypt($password)."/n");
fclose($handle);
shell_exec("sudo sh -c /"chpasswd -e < $tmpfname/"");
¡Tener cuidado! Si alguien obtiene el control de $ nombre de usuario, entonces puede cambiar cualquier contraseña en un sistema.
Debe usar la función crypt () para encriptar la contraseña. Luego puede llamar al programa usermod
como este usermod --password username encryptedpassword
.
La forma más común de cifrar una contraseña de inicio de sesión de UNIX es la siguiente:
crypt (''contraseña'', ''$ 1 $ salt1234 $'')
( Where salt1234
es una sal de ocho letras)
Un fácil que sé y que funciona (al menos para Debian 4.0r5) es:
#!/bin/bash
USER="root"
NEWPASS="bullsheit123"
echo $USER:$NEWPASS | chpasswd
echo $?
Simplemente adapte esto al script php y debería funcionar bien.
Use proc_open , que le permitirá interactuar con el stdin del proceso.
Ver este comentario en particular en el manual: http://www.php.net/manual/en/function.proc-open.php#58044
Ya es demasiado tarde, pero esto es para las personas que siguen buscando respuesta. Esto es lo que usamos. Extremadamente simple.
file_put_contents("passd", "$pass/n$pass/n");
echo "$uname: $pass/n";
`passwd $uname --stdin < passd`;
`rm -rf passd`;
Prefiero usar 2 procesos separados: http://sylnsr.blogspot.com/2012/09/keep-unix-password-in-sync-with.html
La primera respuesta es correcta. Probablemente desee utilizar popen()
o alguna otra función que devolverá un conducto, que puede escribir como un archivo abierto con fopen()
o file()
.
<?php
$pipe = popen("sudo -u dummy passwd testUser testUserPassword", ''r'');
fwrite($pipe, "dummyPasswd/r/n");
pclose($pipe);
echo "done";
?>
No lo he probado, pero es la idea general de lo que parece estar buscando. Notará que esta configuración no proporciona la salida de los comandos que ejecutó. Para eso, necesitarás usar proc_open()
que es un poco más difícil de trabajar pero brinda soporte bidireccional.