passwd na jednom radku

Alexandr Malusek malusek na hroch.ujf.cas.cz
Pátek Březen 19 12:36:51 CET 1999


Michal Hajek <hajek na nspuh.cz> writes:

> > > Potreboval bych zkratka nejaky prikaz, ktery muze aplikovat obycejny
> > > uzivatel. Potrebuji neco na zpusob passwd, ale s tim, ze se program
> > > nespusti interaktivne, ale s parametry na radku. Neco takoveho:
> > >
> > > neco_jako_passwd  uzivatel  nove_heslo  nove_heslo_verifikace
> > 
> > S moznosti pres expect jednoduse sestavite expect skript tak, ze
> > zavola passwd (jeste lepe su uzivatel -c passwd), ceka na prompty a
> > posila tam hesla. expect (snad) bere prikazy i z povelove radky,
> > takze odpada nutnost zajistovat docasny soubor. Jen nevim, zda by to
> > heslo nebylo videt pri vypisech typu ps auxww.

Byl-li by ps spusten v prihodny moment, pak by hesla vypsal. Pokud by
se hesla predavala pres promenne prostredi, pak by to snad melo byt
bezpecne.

> nevim jak na linuxu, ale na HP-UX byste takovym to zpusobem
> passwd neoklamali. passwd si otestuje, jestli to, co se mu
> podstrkuje jako heslo, je cteno z korektniho tty.

Spusti-li se expecti skript z nejakeho ridiciho terminalu, pak vsechny
procesy forkovane expectem (tedy i passwd) tento ridici terminal
zdedi. Problem by mohl nastat, pokud by byl skript spusten procesem,
ktery nema ridici terminal (? u TTY ve vypisu prikazu ps). Kdo by ale
chtel, aby mu hesla na pocitaci menili demoni, ze ;-).

Ale zpet k expectu: Jako vzor pro napsani vyse zadaneho programu lze
pouzit skript /usr/bin/autopasswd. Nejsem si ale jist, zda v teto
podobe zafunguje.

Dalsi moznosti je pouzit autoexpect - spustite "autoexpect passwd",
zmenite si heslo a autoexpect Vam vygeneruje odpovidajici expecti
skript. Tam uz se jen provedou drobne zmeny. Trochu upraveny skript
prikladam. Musel jsem nastavit force_conservative na 1, jinak mi to
nefungovalo. Finalni verze by mela byt podstatne propracovanejsi,


#!/usr/bin/expect -f
set force_conservative 1  ;# set to 1 to force conservative mode even if
                          ;# script wasn't run conservatively originally
if {$force_conservative} {
        set send_slow {1 .1}
        proc send {ignore arg} {
                sleep .1
                exp_send -s -- $arg
        }
}

set oldpassword [lindex $argv 0]
set newpassword [lindex $argv 1]

set timeout -1
spawn passwd
match_max 100000
expect "password: "
send -- "$oldpassword\r"
expect "password: "
send -- "$newpassword\r"
expect "password: "
send -- "$newpassword\r"
expect eof

--
A. Malusek  (malusek na ujf.cas.cz)
UJF AV CR


Další informace o konferenci Linux