Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Passwd in shell_exec() lukt niet

Pagina: 1
Acties:

  • Mexxus
  • Registratie: Januari 2004
  • Laatst online: 20-09 17:01
Ik probeer op een Ubuntu server een user met password aan te maken via een php-file in de commandline interface. Het aanmaken van de user met useradd werkt goed, maar een password toekennen niet. Ik gebruik de volgende code:

code:
1
2
$cmd = 'echo -e "'.$password.'\n'.$password.'" | passwd '.$username;
        shell_exec($cmd);


Ik krijg als error:

code:
1
2
3
Enter new UNIX password: Retype new UNIX password: Sorry, passwords do not match
passwd: Authentication token manipulation error
passwd: password unchanged


Ik heb al een uur verspild aan zoeken naar oplossingen maar kom er niet uit. Hopelijk kunnen jullie me helpen? :-(

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

\n werkt niet tussen enkele quotes, die moet in dubbele quotes,* en na je tweede $password hoort er nog een \n.

Dus: 'echo -e "'.$password.'\n'.$password.'\n" | passwd '.$username;

* Je wil juist wel enkele quotes, anders komt die \n niet op de commandline terecht.

[ Voor 24% gewijzigd door NMe op 14-07-2014 16:19 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Mexxus
  • Registratie: Januari 2004
  • Laatst online: 20-09 17:01
NMe schreef op maandag 14 juli 2014 @ 16:17:
\n werkt niet tussen enkele quotes, die moet in dubbele quotes,* en na je tweede $password hoort er nog een \n.

Dus: 'echo -e "'.$password.'\n'.$password.'\n" | passwd '.$username;

* Je wil juist wel enkele quotes, anders komt die \n niet op de commandline terecht.
Als ik de regel aanpas naar jouw voorbeeld dan krijg ik de volgende error:

code:
1
2
3
Enter new UNIX password: Retype new UNIX password: Sorry, passwords do not match
passwd: Authentication token manipulation error
passwd: password unchanged

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 00:07
Je zult een dubbele backslash moeten gebruiken. Je wilt namelijk een \n als '\' en 'n' character versturen. Echter ziet het `echo` commando de \n als een escape voor n. Met een dubbele backslash escape je dus de eigenlijke backslash, waardoor je dus wel line-break in je echo krijgt.

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Je moet expect gebruiken of de programmatische passwd interface. Het is helaas niet zomaar een interactief programma dat je makkelijk kan scripten. Met expect kan je het wel eenvoudig regelen.

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 00:07
johnkeates schreef op maandag 14 juli 2014 @ 16:42:
Je moet expect gebruiken of de programmatische passwd interface. Het is helaas niet zomaar een interactief programma dat je makkelijk kan scripten. Met expect kan je het wel eenvoudig regelen.
Dat kan wel, maar dan moet je `passwd` expliciet voeren met de username, en het --stdin argument meegeven. Zijn hele commando wordt dus:
PHP:
1
shell_exec('echo -e '.$password.'\\n'.$password.' | passwd '.$username.' --stdin');


Edit: voor --stdin hoef je het wachtwoord maar een keer op te geven, dus:
PHP:
1
shell_exec('echo -e '.$password.' | passwd '.$username.' --stdin');

[ Voor 13% gewijzigd door ThomasG op 14-07-2014 16:52 ]


  • Mexxus
  • Registratie: Januari 2004
  • Laatst online: 20-09 17:01
ThomasG schreef op maandag 14 juli 2014 @ 16:48:
[...]
Dat kan wel, maar dan moet je `passwd` expliciet voeren met de username, en het --stdin argument meegeven. Zijn hele commando wordt dus:
PHP:
1
shell_exec('echo -e '.$password.'\\n'.$password.' | passwd '.$username.' --stdin');


Edit: voor --stdin hoef je het wachtwoord maar een keer op te geven, dus:
PHP:
1
shell_exec('echo -e '.$password.' | passwd '.$username.' --stdin');
Ik had deze al eens voorbij zien komen via Google maar voor de zekerheid toch nog maar een keer geprobeerd. Als ik dit doe krijg ik een andere error:

code:
1
2
3
4
5
6
7
8
passwd: unrecognized option '--stdin'
Usage: passwd [options] [LOGIN]

Options:
  -a, --all                     report password status on all accounts
  -d, --delete                  delete the password for the named account
  -e, --expire                  force expire the password for the named account
  etc...

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 00:07
Mexxus schreef op maandag 14 juli 2014 @ 16:58:
[...]


Ik had deze al eens voorbij zien komen via Google maar voor de zekerheid toch nog maar een keer geprobeerd. Als ik dit doe krijg ik een andere error:

code:
1
2
3
4
5
6
7
8
passwd: unrecognized option '--stdin'
Usage: passwd [options] [LOGIN]

Options:
  -a, --all                     report password status on all accounts
  -d, --delete                  delete the password for the named account
  -e, --expire                  force expire the password for the named account
  etc...
Dan heb je een distro welke dat niet heeft. Dan is er nog `chpasswd`, mits je distro die wel heeft (anders wel te verkrijgen via de package manager.)
Bash:
1
echo "username:password" | chpasswd

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

ThomasG schreef op maandag 14 juli 2014 @ 16:40:
Je zult een dubbele backslash moeten gebruiken. Je wilt namelijk een \n als '\' en 'n' character versturen. Echter ziet het `echo` commando de \n als een escape voor n. Met een dubbele backslash escape je dus de eigenlijke backslash, waardoor je dus wel line-break in je echo krijgt.
Binnen enkele quotes moet dat voor zover ik weet alleen voor het escapen van karakters die je kán escapen binnen enkele quotes. \n is er daar niet één van.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Wat is er mis met de optie -p van useradd?

All my posts are provided as-is. They come with NO WARRANTY at all.


  • WormLord
  • Registratie: September 2003
  • Laatst online: 06-10 21:15

WormLord

Devver

Of je gebruikt iets als proc_open, dan kun je vanuit php data naar de stdin van je process sturen.

En bij het opbouwen van je command ook niet escapeshellarg vergeten.

  • Thralas
  • Registratie: December 2002
  • Laatst online: 00:50
WormLord schreef op maandag 14 juli 2014 @ 17:25:
En bij het opbouwen van je command ook niet escapeshellarg vergeten.
Dit. Of het gewoon niet doen, dit is een ramp in wording.

  • Mexxus
  • Registratie: Januari 2004
  • Laatst online: 20-09 17:01
ThomasG schreef op maandag 14 juli 2014 @ 17:03:
[...]
Dan heb je een distro welke dat niet heeft. Dan is er nog `chpasswd`, mits je distro die wel heeft (anders wel te verkrijgen via de package manager.)
Bash:
1
echo "username:password" | chpasswd
Dit is 'm! Dank je! :-)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Is de suggestie van CyBeR in "Passwd in shell_exec() lukt niet" niet handiger?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Virgil
  • Registratie: November 2001
  • Laatst online: 29-08 02:10

Virgil

We're not alone

Schaamteloze bump, voor de mensen die zoeken op chpasswd of aanverwanten reply ik toch.

useradd -p verwacht een encrypted password.
Je kan afhankelijk van je distributie hiervoor perl, passwd of chpasswd gebruiken.

Perl gebruik je in het commando:
code:
1
useradd -d / -g users -p $(perl -e'print crypt("foo", "aa")') -M -N foo


passwd gebruik je als je package de optie "--stdin" ondersteunt:
code:
1
echo foo | passwd user --stdin


chpasswd gebruik je als je net als mij debian gebruikt:
code:
1
echo user:foo | chpasswd

Ik was heel, heeeel vroeger SeRRveR

Pagina: 1