Jediné řešení funguje na Ubuntu 12.04:
echo -e "new_password\nnew_password" | (passwd user)
Ale druhá možnost funguje pouze tehdy, když změním z:
echo "password:name" | chpasswd
Komu:
echo "user:password" | chpasswd
Viz vysvětlení v původním příspěvku:Změna hesla pomocí skriptu
Přečtěte si moudrá slova z:
- http://mywiki.wooledge.org/BashFAQ/078
Cituji:
Nic, co můžete dělat v bash, nemůže fungovat. passwd(1) nečte ze standardního vstupu. Toto je záměrné. Je to pro vaši ochranu. Hesla nebyla nikdy určena k tomu, aby byla vkládána do programů nebo generována programy. Měly být zapsány pouze prsty skutečné lidské bytosti s funkčním mozkem a nikdy, nikdy nikam zapsané.
Přesto se zástupy uživatelů ptají, jak mohou obejít 35 let zabezpečení Unixu.
Dále vysvětluje, jak můžete nastavit shadow(5)
správně heslo a zobrazí vám GNU-Zajímám se pouze o zabezpečení-pokud-to-nepřiměje-mě-přemýšlím-příliš-moc -způsob zneužití passwd(1)
.
A konečně, pokud se chystáte použít hloupé GNU passwd(1) rozšíření --stdin
, ne předejte heslo uvedením na příkazový řádek.
echo $mypassword | passwd --stdin # Eternal Sin.
echo "$mypassword" | passwd --stdin # Eternal Sin, but at least you remembered to quote your PE.
passwd --stdin <<< "$mypassword" # A little less insecure, still pretty insecure, though.
passwd --stdin < "passwordfile" # With a password file that was created with a secure `umask(1)`, a little bit secure.
Poslední je to nejlepší, co můžete s GNU passwd
udělat . I když bych to stále nedoporučoval.
Zadání hesla na příkazový řádek znamená, že kdokoli, kdo má i ten nejodlehlejší náznak přístupu k boxu, může sledovat ps
nebo tak a ukrást heslo. I když si myslíte, že je vaše krabice v bezpečí; je to něco, co byste opravdu měli zvykněte si vyhýbat se za každou cenu (ano, i za cenu toho, že uděláte trochu větší potíže s dokončením práce).
z „man 1 passwd
“:
--stdin
This option is used to indicate that passwd should read the new
password from standard input, which can be a pipe.
Takže ve vašem případě
adduser "$1"
echo "$2" | passwd "$1" --stdin
[Aktualizovat ] v komentářích bylo uvedeno několik problémů:
Vaše passwd
příkaz nemusí mít --stdin
možnost:použijte chpasswd
místo toho, jak navrhuje Ashawley.
Pokud používáte jiný shell než bash, "echo" nemusí být vestavěný příkaz a shell zavolá /bin/echo
. Toto není bezpečné, protože heslo se zobrazí v tabulce procesů a lze jej zobrazit pomocí nástrojů jako ps
.
V tomto případě byste měli použít jiný skriptovací jazyk. Zde je příklad v Perlu:
#!/usr/bin/perl -w
open my $pipe, '|chpasswd' or die "can't open pipe: $!";
print {$pipe} "$username:$password";
close $pipe
V dnešní době můžete použít tento příkaz:
echo "user:pass" | chpasswd